最小カット。
図は、次のようにもっと建て欠場します:
ソースは、さらにミーティングポイント理論は、ADDE(S、ID(i、j)は、[I] [J])、ADDE(ID(i、j)は、T、B [i]は[学校のテキストを表しますJ])は、隣接するシートの選択の同じファミリーの場合には、新しいノードを作成し、学校のテキスト、新しいポイントにもトラフィックTは、その後、エッジINFに接続トラフィックの点への2人の学生値側である場合。理論的には似ています。
#include <cstdioを> する#include <アルゴリズム> の#include <CStringの> に#define FOR(X、Y)(i = 1 int型、iは= xを<; I ++)のためのために(INT J = 1; J <= Y; J ++ ) のconst int型 N = 50100、M = 3E5 + 7 。 使用して 名前空間はstdを、 INTのN、M、T、CNT、TOT、ANS、HD [N]、LV [N]、Q [N]、V [M]、NXT [M]、W [M]。 ボイド ADDE(int型のx、int型の Y、int型Z) { V [ ++ CNT] = Y、W [CNT] = Z、NXT [CNT] = HD [x]は、HD [X] = CNTを。 V [ ++ CNT] = X、W [CNT] = 0、NXT [CNT] = HD [Y]、HD [Y] = CNT。 } ブールBFS() { int型 QS = 0、QE = 1 。 memset(qは、0、はsizeof Q)。 memset(LV、0、はsizeof LV)。 Q [ 0 ] = 0、LV [ 0 ] = 1 ; 一方で(QS < QE) { int型、U = Q [QS ++ ]。 もし(U == T)ブレーク。 以下のために(int型 I = HD [U]; I; I = NXT [I]) であれば(W [i]が&& LV [V [I]]!){LV [V [i]は] =のLV [U] + 1 ; Q [QE ++] =V [I];} } もし(LV [T])リターン 1。リターン 0 ; } INT DFS(INT U、INT 低い) { 場合(!U == T ||低い)を返す低いです。 int型の合計= 0 ; 用(int型 I =; I I = HD [U] [I] NXT)の 場合(W [i]は&& LV [V [I]] == LV [U] + 1 ) { int型 TMP = DFS(V [I ]、分)(W [i]は、低いです)。 和 [i]はW + = TMP、低= TMP、 - [I ^ W = TMP、1 ] + = TMP。 もし(!低)リターン合計。 } であれば(低い)LV [U] = - 1 。 戻り値の合計。 } int型の ID(int型のx、int型の Y){ リターン(X- 1)* M + Y;} int型のmain() { scanf関数(" %D%dの"、&N、&M)。 T = 5 ×n個×m個+ 1、CNT = 1、TOT = N * M。 int型のx; (N、M)のscanf(FOR " %のD "、&x)は、ADDE(0、ID(i、j)は、X)、ANS + =バツ; (N、M)のscanf(FOR " %のD "、&x)は、ADDE(ID(i、j)は、T、X)、ANS + = X。 FOR(N - 1 、M) のscanf(" %dの"、およびX)、TOT ++、ADDE(0、TOT、x)は、ADDE(TOT、ID(i、j)は、1E9)、ADDE(TOT、ID(I + 1、j)は、1E9)、ANS + = X。 FOR(N - 1 、M) のscanf(" %dの"、およびX)、TOT ++、ADDE(TOT、T、X)、ADDE(ID(i、j)は、TOT、1E9)、ADDE(ID(I + 1、 J)、TOT、1E9)、ANS + = X。 FOR(N、M - 1 ) のscanf(" %dの"、&x)は、TOT ++、ADDE(0、TOT、x)は、ADDE(TOT、ID(i、j)は、1E9)、ADDE(TOT、ID(I、J + 1)、1E9)、ANS + = X。 (N、M FOR - 1 ) のscanf(" %dの"、およびX)、TOT ++、ADDE(TOT、T、X)、ADDE(ID(i、j)は、TOT、1E9)、ADDE(ID(I、J + 1)、TOT、1E9)、ANS + = X。 一方、(BFS())ans- = DFS(0 、1E9)。 printf(" %dの" 、ANS)。 }