[タイトル]に意図されています。
Nの個人、Mの惑星は、(i、j)は、N * Mの行列にあり、誰もが離れて移動することができれば、地球ではなく、0は、尋ねることができますjに私のために1です。
[思考]:
Nは、1E6の範囲惑星TLE特定の側に接続され、誰もが、その後、圧力が行列の各行に応じて成形することができるだけ0,1であれば、同一の状態は、アレイIDX SIZ [IDX]にマージされ、
スキャン状態で、かつ地球にもエッジの条件を満たしています。
【図】内蔵。
スーパーソースSP - > IDX右側SIZ [IDX]
IDX - > M右側INF
M - >スーパー容量TPの右側をシンク
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 1E5 + 5 。 CONST int型 MAXM = 10 + 5 。 const int型 INF = 0x3f3f3f3f 。 INTの N、M、D [MAXN + MAXM]、SIZ [MAXN]。 int型のヘッド[MAXN + MAXM]、TOT、maxflow。 int型のSP、TP。 構造体の縁{ INT 、次に、Wに対して、 } ED [(MAXN * MAXM + MAXN + MAXM)<< 1 ]。 インラインボイドのinit(){ memsetの(頭、 -1、はsizeof (ヘッド))。 memset(SIZ、0、はsizeof (SIZ))。 TOT = 1 。 } インラインボイドは(追加INT U、INT V、INT W){ ED [ .TO = V ++ TOT]と、ED【TOT] .W = W。ED【TOT] .next =頭部[U]。ヘッド[U]は= TOTを、 ED [ ++ TOT] .TO = U; ED【TOT] .W = 0。ED【TOT] .next =頭部[V]。ヘッド[V] = TOT。 } インラインブールBFS(){ memsetの(D、0、はsizeof (d)参照)。 キュー< 整数 > Q; D [SP] = 1 。 q.push(SP)。 一方、(!q.empty()){ int型のx = q.front()。 q.pop(); 以下のために(int型 - ;!I = I =ヘッド[X] 1 ; I = {ED [I] .next) INT Y = ED [I] .TO。 もし(!ED [I] .W && D [Y]){ D [Y] = D [X] + 1 。 q.push(Y)。 もし(Y軸== TP)リターン 1 。 } } } リターン 0 ; } インラインINT DFS(int型のx、int型フロー){ 場合(X == TP)リターンフロー。 INTの RES = 流量、K。 以下のために(int型 - ;!I = I =ヘッド[X] 1 ; && RES I = {ED [I] .next) INT Y = ED [I] .TO。 もし(ED [i]は.W && D [Y] == D [X] + 1 ){ K = DFS(Y、分(ED [I] .W、RES))。 もし(!k)をD [Y] = 0 ; 編[i]は.W- = K。 ED [I ^ 1 ] .W + = K。 RES - = K。 } } 戻り flow- RESと、 } インラインボイドdinic(){ int型フロー= maxflow = 0 。 一方、(BFS()) しながら(流量= DFS(SP、INF))maxflow + = 流量; } int型のmain(){ // freopenは( "in.txt"、 "R"、STDIN)。 一方、(〜のscanf(" %d個の%のD "、&N、&M)){ INIT()。 int型L = INF、R = - INF。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ int型の和= 0 。 用(INT J = 1 ; J <= Mであり、j ++ ){ int型TMP。 scanf関数(" %のD "、&TMP)。 和 << = 1 。 合計 + = TMP; } SIZ [和] ++ ; L =分(L、合計)。R =MAX(R、合計)。 } SP = 0 。 TP = R + M + 1 。 以下のために(int型私= 1 ; I <= M; iが++ ){ int型のつづき。 scanf関数(" %のD "、&CONT)。 (I追加 + R、TP、CONT)。 } のために(int型 I = 1と、iが<= R; iは++ ) 場合(SIZ [I]){ int型の POS = 0 。 しばらく(POS <M){ 場合(I&(1 << POS))(I、M-POS +追加R、INF)を、 POS ++ ; } 追加(SP、I、SIZ [I])。 } dinic()。 もし(N <= maxflow)プット(" YES " ); 他のプット(" NO " ); } 戻り 0 。 }