トピック分析
明らかに、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 == ' - ' - ?1:1、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 == ' - ' - ?1:1、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 }