NewTrain1 T2:[ZJOI2007]ゲームマトリックス

トピック分析

明らかに、j番目の「1」として行場合、この行は、j番目の行に切り替えることができます。別の言葉、被験者たちは私が位置は彼に合わせて1つのラインで満たす各行の列を有しているプログラムが存在するかどうかを判断できるようにすることです。

直接Dinicを実行するために構築されたマップ - (>ラインカラム)、これは明らかに2部グラフマッチングです。

  1つの#include <ビット/ STDC ++ H>
   2  の#define INTMAX 2147483647LL
   3  の#define PII対<整数、整数>
   4  の#define MK make_pair
   5  の#define再登録
   6を 使用して 名前空間STDを、
  7 typedefの長い 長いLL。
  8  CONST  ダブルパイ= ACOS( - 1.0 )。
  9  CONST  INT Infの= 0x3f3f3f3f 10  CONST  INT MAXN = 405 11インラインint型READ(){
 12      のRE INT X = 0、F = 1、CH = GETCHAR()。
13      しばらく(!isdigit(CH))は、f = CH == ' - ' - ?11、CH = getchar関数();
14      一方(isdigit(CH))X = X * 10 + CH- 48、CH = GETCHAR()。
15      リターンのX *はF;
16  }
 17  インラインLL readll(){
 18      再LL X = 0、F = 1、CH = GETCHAR()。
19      しばらく(!isdigit(CH))は、f = CH == ' - ' - ?11、CH = getchar関数();
20      一方(isdigit(CH))X = X * 10 + CH- 48、CH = GETCHAR()。
21      リターンのx *のF。
22  }
 23  
24  構造体のエッジ{
 25      INT に、NXT、キャップ。
26 } E [MAXN * MAXN << 1 ]。
27  int型 CNT = 1 、頭部[MAXN]。
28インライン無効 add_edge(int型のu、int型、Vをint型のキャップ){
 29      E [++ CNT] .TO = V; E [CNT]の.cap =キャップ; E [CNT] .nxt =頭部[U];頭部[U] = CNT。
30      E [++ CNT] .TO = U; E [CNT]の.cap = 0 ; E [CNT] .nxt =頭部[V]、ヘッド[V] = CNT。
31  } 
 32  
33  INT TT、N、S、T、Maxflow。
34  INTのDEP [MAXN]。
35インラインボイドは、init(){
 36      、CNT = 1 ; Maxflow = 0 37      のmemset(ヘッド、0はsizeof (ヘッド))。
38      のmemset(E、0はsizeof (e)参照)。
39  }
 40キュー< INT > Q。
41のインラインブールBFS(){
 42      ながら(!q.pop()q.empty())。
43      のmemset(DEP、0はsizeof (DEP))。
44      DEP [S] = 1 ; q.push(S)。
45      ながら(!q.empty()){
 46          、INT X = q.front(); q.pop()。
47          のためにint型 I =ヘッド[X]、Y; I; I = E [I] .nxt){
 48              、Y = E [I] .TO。
49              もし(E [I]の.cap &&!DEP [Y]){
 50                  DEP [Y] = DEP [X] + 1 51                  q.push(Y)。
52              }
 53          }
 54      }
 55      リターンDEP [T]。
56  } 
 57インラインINT DFS(int型のx、int型フロー){
 58      であれば(!X == T ||フロー)     リターン・フロー。
59      INT =使用0 60      のためにint型 ; I; I =ヘッド[X]、Y I = E [I] .nxtを){
 61          、Y =E [i]の.TO。
62          もし(E [I]の.cap && DEP [Y] == DEP [X] + 1 ){
 63              のint F = DFS(Y、分(E [I]の.cap、flow- 使用されます))。
64              であれば(F){
 65                  E [I] .cap- = F。
66                  E [I ^ 1 ]の.cap + = F。
67                  + =使用F。
68                  であれば(使用==フロー)ブレーク69              }
 70          }
 71      }
 72      リターン使用。
73  }
 74  
75インラインボイドDinic(){
 76      ながら(BFS()){
 77          Maxflow + = DFS(S、INF)。
78      }
 79  }
 80  INT メイン(){
 81      TTは= 読み取ります();
82      一方(TT-- ){
 83          は、init();
84          N = )(読み取ります。
85個の          S = 402 ; T = 403 86          のためにint型 iは= 1、X; iが<= N; ++ I){
 87              add_edge(iは、S、1 );
88             add_edgeは、(iは、N +、T、1 );
89              のためにINT J = 1 ++; J <= N {j)が
 90                  、X = 読み取ります()。
91                  であれば(X)
 92                      add_edge(I、N + J、1 )。
93              }
 94          }
 95          Dinic()。
96          であれば(Maxflowが== n)のプット(" はい" );
97の         他のプット(ノー)。
98      }
 99      リターン 0;
100 }

 

おすすめ

転載: www.cnblogs.com/LI-dox/p/11257633.html