まず、問題の制限(油の量を制限する)は、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]。 }