宇宙飛行プログラムの問題(ネットワークフロー24個の質問)

問題の意味

そこメートルの実験は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); 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/sto324/p/11334074.html