羅区$ P $ 1402ホテルキングネットワークフロー

ポジティブなソリューション:ネットワークフロー

レポートの問題解決:

ポータル!

ネットワークの流れは非常に高価に見える,,,そこで問題は今$ 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 ; 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/lqsukida/p/11237055.html