問題の意味
そこメートルの実験はn番目の機器は、行われ、各実験は、いくつかのお金を得るだろう、各実験が完了するまでにいくつかの機器を必要としている最大の利益を求めて、機器を一緒に使用することができ、機器を買うためにお金を過ごすことになります。
N、M <= 50
問題の解決策
直接書き込みアプローチ、と私はそれを望んでいませんでした。
実験側に接続されたソース、結果の流れ実験のお金、機器、さらにはミーティングポイント側、フロー機器の支出にしたい、でも、対応する機器側で流れINFを試します。
すべての実験を行うにはお金を負いません(直面していない)すべてのお金のANSを得ました。
最小カットは再びそれを見つけることができ、ans-最小カットが答えです。
でも、エッジも、機器側を遮断し、実験にこの実験を機器を購入するためにされて切断されていません。
そして、出力方式での通信に出力します。(なぜ私は知りません)
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 105 ; const int型 MAXM = 2705 ; const int型 INF = 1000005 ; INTのN、M、S、T、ANS。 int型のval [MAXN]。 ブールフラグは、取得[MAXN]。 int型の CNT = 1 、頭部[MAXN]。 構造体のエッジ{ int型のX、Y、次に、ヴァル。 } E [MAXM << 1 ]。 無効アドオン(int型のx、int型のy、int型ヴァル){ E [ ++ CNT] = (エッジ){X、Y、ヘッド[x]は、ヴァル}。 ヘッド[X] = CNT。 } テンプレート < クラス T>インラインボイドリード(T&X){ X = 0。チャー CH = GETCHAR()。 しばらく(!isdigit(CH))CH = getchar関数(); 一方、(isdigit(CH)){X =(X << 1)+(X << 3)+(CH ^ 48)、CH = GETCHAR();} フラグ | =(CH == ' \ n ' ); } INT D [MAXN]。 ブール BFS(){ キュー < 整数 > Q; memsetの(D、0、はsizeof (d)参照)。 q.push(S); D [S] = 1 。 一方、(!q.empty()){ int型のx = q.front()。 q.pop(); 以下のために(int型 I =ヘッド[X]; I; I = E [i]は.next){ int型、Y = E [I] .Y。 もし(!E [I] .val && D [Y]){ D [Y] = D [X] + 1 。 もし(Yの== tの)戻り 真。 q.push(Y)。 } } } リターン 偽; } INT DFS(int型のx、int型フロー){ 場合(X == T)リターンフロー。 int型の残り= 流れ、K。 以下のために(int型 I =ヘッド[X]; I; I = E [i]は.next){ int型、Y = E [I] .Y。 もし(E [i]は.val && D [Y] == D [X] + 1 ){ K = DFS(Y、分(残り、E [I] .val))。 もし(!k)をD [Y] = 0 ; E [i]は.val - = K。 E [I ^ 1 ] .val + = K。 K。 残りは - =); } } を返す flow- 休息を。 } int型dinic(){ int型 RES = 0 。 一方、(BFS())RES + = DFS(S、0x3f3f3f )。 リターンのres; } int型のmain(){ (n)を読み出す;(m)を読み出します。 S = 0、T = N + M + 1 。 以下のために(int型私= 1 ; I <= M; iが++ ){ int型のX;(x)を読み出します。 ANS + = X。 追加(S、I、X)。 追加(I、S、0 フラグ = 偽 ; 一方、(!のフラグ){ (x)を読み出します。 追加(I、X + M、INF)。 追加(X + M、I、0 ); } } のための(int型 i = 1 ; iが<= N iが++ ){ int型のX;(x)を読み出します。 追加(iは + M、T、X)。 追加(tは、iが Mを+、0 ); } ANS - = dinic()。 用(int型 iは= 1 ; I <= M Iは++)場合(D [i])とのprintf(" %dの " 、I)。 putchar( 10 ) のために(int型 I =のM + 1 ; iがM <= N +; iが++)場合(D [i])とのprintf(" %dの」、I- M) のputchar(10 ) ; のprintf(" %dの" 、ANS); }