ポジティブなソリューション:ネットワークフロー
レポートの問題解決:
ネットワークの流れは非常に高価に見える,,,そこで問題は今$ QwQ $図を構築する方法になります。
まず、直接のような最大フロー図をビルドして実行するために必要な唯一の要件は、存在する場合。
今となっており、同時に満たさなければならない2つの要件があり、解決する方法を検討?
スプリットポイントを考えてみましょう、人々は、それぞれ、二つの点にも、食品やホテルを分割して、最大流量を実行し、$ QwQ $を終えました
$以上$
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #define ILインライン の#define LF二重 の#defineのGC GETCHAR() の#define T(I)エッジ[I] .TO の#define N(I)エッジ[I] .nxt の#define W(I)は、エッジ[I] .wei #define INTレジスタRI の#define RBブールレジスタ の#defineチャー登録RCを の#define(++ iは; iが= Yを<RI I = x)からのRP(I、x、y)を #defineする私の(I、X、Yを)(RI I = xについて、I> = Y; - I) の#define E(I、X)(RI I =ヘッドの[X];〜I; I =エッジ[I] .nxt)のconst int型 N = 100 + 5、M = N * 20、INF = 1E9。 int型のヘッド[M]、ed_cnt = - 1 、N、P、Q、S、T、CUR [M]、nod_cnt、DEP [M]。 構造体 ED { INTに、NXT、ウェイ;}エッジ[M << 1 ]。 ILのINTのリード() { RI X = 0 ; RBのY = 1 ; RC CH = GC。 しばらく(CH =!' - ' &&(CH> ' 9 ' || CH < ' 0 '))CH = GC; もし(CH == ' - ')CH = GC、Yは= 0 ; 同時に(CH> = ' 0 ' && CH <= ' 9 ')X =(X << 1)+(X << 3)+(CH ^ ' 0 ')、CH = GC。 返す yはX: - ?X; } IL ボイド広告(RIのXは、R Yは、R Z){エッジ[++ ed_cnt] =(ED){X、ヘッド[Y]、Z};頭部[Y] = ed_cnt、エッジ[++ ed_cnt] = (編){Y、ヘッド[X]、0 };頭部[X] = ed_cnt;} IL BOOL BFS() { キュー < INT > Q; Q.push(S)のmemset(DEP、0、はsizeof(DEP )); DEP [S] = 1 。 同時に(!Q.empty()){RI NW = Q.front(); Q.pop(); E(I、NW)であれば(!W(I)&& DEP [T(I)])DEP [T( I)] = DEP [NW] + 1 、Q.push(T(I));} 戻りDEP [T]を。 } のIL INTのDFS(RI NW、RIフロー) { 場合(!NW == T ||フロー)リターン・フロー; RI RET = 0 。 用(RI&I = CUR [NW];〜I; I = N(I))であれば()I(W && DEP [T(I)] == DEP [NW] + 1){RI TMP = DFS(T (I)、分(流れ、W(I))); flow- = TMP、W(I) - = TMP、RET + = TMP、W(I ^ 1)+ = TMP;} 戻りRET。 } のIL int型 dinic(){RI RET = 0。同時に(BFS()){RP(I、S、T)CUR [I] =頭部[I]。一方、(INT D =のDFS(S、INF))RET + = D;} 戻りRET;} int型のmain() { memsetの(頭、 - 1、はsizeof(ヘッド)); N =(読み取り); P =読み取ります() ; Q = リード()。 S = 0、T =のp + Q +(N << 1)+ 1 ; RP(I、1、P)AD(I、S、1); RP(I、1、n)は、広告(iは+ P + N 、私は、Pを+ 1); RP(I、1、Q)広告(T、I +のp +(N << 1)、1 )。 RP(I、1、n)のRP(j、1、P){RI TMP =読み取ります()。もし(TMP)AD(iはPを+、J、1);} RP(I、1、n)のRP(j、1、Q){RI TMP =読み取ります()。場合(TMP)広告(J + P +は(N << 1)、iがP + N + 1 };) のprintf(" %Dを\ n " 、dinic())。 リターン 0 ; }