コード:
// luogu-判定部イネーブル-O2 の#include <ビット/ STDC ++。H> に#define MAXN 400 の#define INF 10000000 の#define setIO(S)freopenは(S ".IN"、 "R"、STDIN) の#define R1( I)Iは R 2(I)(iがn + 1)#defineする の#define R3を(I)(I + N + N) の#define R4(I)(I + N + N + N) 名前空間stdを使用します。 文字列str [100]。 INT G [MAXN] [MAXN]。 名前空間Dinic { 構造体のエッジ{ から、キャップにINT。 エッジ(INT U = 0、INT V = 0、INT C = 0):(U)から、(V)に、キャップ(C){} }。 ベクター<INT> G [MAXN]。 ベクター<エッジ>エッジ。 キュー<整数> Q; int型VIS [MAXN]、D [MAXN]、CURR [MAXN]。 int型S、T; ボイドaddedge(INT U、V INT、INT C){ edges.push_back(エッジ(U、V、C))、edges.push_back(エッジ(V、U、0)); INT、M = edges.size()。 G [U] .push_back(M-2)、G [V] .push_back(M-1)。 } INT BFS(){ memsetの(VIS、0、はsizeof(VIS))。 D [S] = 0、VIS [S] = 1、Q.push(S)。 (!Q.empty()){一方 Q.pop(); int型、U = Q.front()。 用(INT SZ = G [U] .size()、I = 0; I <SZ; ++ I){ エッジR =縁[G [U] [I]]。 もし{(VIS [r.to] && r.cap> 0!) VIS [r.to] = 1、D [r.to] = D [U] +1。 Q.push(r.to)。 } } } VIS [t]を返します。 } INT DFS(int型のx、int型CUR){ IF(X == T)戻りCUR。 int型のF、流量= 0。 (INT SZ = G [X] .size()、I = CURR [X];私はSZを<; ++ i)のための{ CURR [X] = I。 エッジR =縁[G [X] [I]]。 IF(D [r.to] == D [X] + 1 && r.cap> 0){ F = DFS(r.to、分(CUR、r.cap))。 。cur- = F、フロー+ = F、エッジ[G [X] [I] CAP- = F、エッジ[G [X] [I] ^ 1]の.cap + = F。 } IF(CUR <= 0)ブレーク。 } 戻り流。 } int型maxflow(){ int型フロー= 0。 (BFS())のmemset(CURR、0、はsizeof(CURR))、フロー+ = DFS(S、INF)、一方、 流れを返します。 } ボイド再(){ ため(INT i = 0; I <MAXN; ++ I)G [i]が.clear(); edges.clear(); } }。 N INT、K。 BOOLチェック(INT T){ Dinic ::再()。 Dinic :: S = 0、Dinic ::トン= 396; (I 1 = int型、iが<= N; I ++){ため Dinic :: addedge(R1(I)、R 2(I)、K); Dinic :: addedge(R3(I)、R4(I)、K); Dinic :: addedge(Dinic :: S、R 1(I)、T); Dinic :: addedge(R4(I)、Dinic ::トン、トン)。 用(INT J = 1; J <= N; ++ j)は{ (G [I] [J])場合 Dinic :: addedge(R1(I)、R4(j)は、1)。 他 Dinic :: addedge(R2(I)、R3(j)は、1); } } Dinic :: maxflow()==のt * nを返します。 } int型のmain(){ // setIO( "入力")。 scanf関数( "%d個の%のD"、&N&K)。 {(; iが<= N I ++ I = 1 INT)のため のscanf( "%sの"、STR + 1)。 用(INTのJ = 1; J <= N; ++ j)は(STR [J] == 'Y')Gなら[I] [J] = 1。 } int型のL = 1、R = N、中間、ANS = 0。 一方、(L <= R){ 半ば=(L + R)>> 1。 (チェック(MID))であればANS =中間、L =ミッド+ 1。 他に、R =半ば1; } のprintf( "%dの"、ANS)。 0を返します。 }