24ネットワークフロー問題 - 車両の給油問題

フェイス質問

まず、問題の制限(油の量を制限する)は、kを無視します。

明らかに見られる:ポイントの(i、j)は、(I + 1、J)、(i、j + 1)の受信料金0側を確立するために、(I-1、J)、( I、J-1)Bの受信側の手数料を確立します。

クリア:(1,1)からのような(N、N)ランニングコストの流れに、

そして、制限がそれをkを追加しますか?

kが小さいので、私たちは、階層図(K + 1のサブ層)を構築することができます。

レベル0は、残りの燃料がKであることを示し、k番目の層は、残りのオイルが0で表します。

次いで、ここにはガソリンスタンド、我々は、i番目の層(0 <= iがKを<)にしたくない場合、直接その収納位置に接続された第一の層と次の層I + 1、k番目の層の位置に接続されています。 Cの電荷の+側、

ガス局はk番目の層の第一層から、存在する場合ここで、受信側の電荷の1 A上の第0層、次いで他の層0再び接続されたエッジ点に接続されています。

次に、原点(1,1)であり、全ての層(N、n)はコストフローを実行して、受信したシンク1 0ファビアンに接続されています。

しばらくSPFA /ダイクストラ(あなたは両端キューの最適化をすることができます)その上で、私たちは能力のすべてのエッジが1であることに注意してくださいので、彼らは、最小コスト最大フローを実行しないでください。

#include <ビット/ STDC ++。H>
#define INC(I、B)(iは= intを登録する;私は= Bを<; Iは++)のため
名前空間stdを使用。
クラスlittlestar {
	公:
		へのint;
		int型のNXT。
		int型のw;
		無効アドオン(int型のu、int型のV、int型のGG);
}星[2000010]。
int型のヘッド[2000010]、CNT;
インライン無効littlestar ::追加(int型のu、int型のV、int型のGG)
{
	= Vへ。
	NXT =頭部[U]。
	W = GG。
	ヘッド[U] = CNT。
}
INTのN、K、A、B、C、すべて;
INTクエリ[101] [101] [101] [101]。
int型S、T;
そして<整数> N;
INT [1000010]を見[1000010]を言います
空SPFA()
{
	memset(DIS、0x3fを、はsizeof(DIS))。
	q.push_back(S)。
	DIS [S] = 0;
	一方、(q.size()){
		INT U = q.front()。
		q.pop_front();
		高さ[I] = 0;
		{(; iは=星[I] .nxt [U] I = int型ヘッド登録)するため
			int型のV =スター[i]の.TO。
			IF(DIS [V]> DIS [U] +星[I] .W){
				DIS [V] = DIS [U] +スター[i]の.W。
				IF(VIS [V] == 0){
					[V]へ= 1。
					IF(q.size()&& DIS [V]> DIS [q.front()])q.push_back(V)。
					他q.push_front(V);
				}
			}
		}
	}
}
メインint型()
{
	CIN >> N >> K >> A >> B >> C。
	INC(I、1、N)INC(j、1、N){
		scanf関数( "%のD"、および[I] [J])。
		++アップ。
		クエリ[I] [J] = TOT;
	}
	S =デッド*(K + 1)+ 1、T = TOT×(K + 1)+2。
	スター[++ CNT] .add(S、1,0);
	INC(I、1、N){
		INC(J、1、N){
			int型のTMP =クエリ[I] [J]。
			IF([I] [J]){
				INC(O、1、K){
					星[++ CNT] .add(入出力*のTOT + TMP、TMP、A)。
				}
			}			
			INC(O、0、K-1){
				([I] [J] && O)ブレークであれば、
				IF(I> 1)星[++ CNT] .add(入出力*のTOT + TMP、(O + 1)* TOT +クエリ[I-1]〜[J]、B)。
				IF(J> 1)星[++ CNT] .add(入出力*のTOT + TMP、(O + 1)* TOT +クエリ[I]、[J-1]、B)。
				IF(I + 1 <= n)の星[++ CNT] .add(入出力*のTOT + TMP、(O + 1)* TOT +クエリ[I + 1] [j]、0);
				IF(J + 1 <= n)の星[++ CNT] .add(入出力*のTOT + TMP、(O + 1)* TOT +クエリ[I]、[J + 1]、0);
			}
			星[++ CNT] .add(k個*のTOT + TMP、TMP、A + C)。
		}
	}
	INC(I、0、K){
		星[CNT ++] .add(およびすべての* +クエリ[N] [N] T、0);
	}
	SPFA();
	COUT << DIS [T]。
}

 

おすすめ

転載: www.cnblogs.com/kamimxr/p/11647121.html