円卓会議の問題(ネットワークフロー24個の質問)

問題の意味

ユニットのn個の数がありますが、一部の人々がいる各ユニットは、m個のテーブルがあり、各テーブルには、人々の数を取ることができ、各ユニットは、テーブル、出力プログラムで座ることができません。

1 <= N <= 150、1 <= M <= 270。

問題の解決策

それらに一つずつ入れ、その後、ポイントとしてみんなに始まり、貪欲である(これはネットワークストリーミングとは何であってもよい)、その後、彼はあきらめました。いくつかの並べ替えを必要とする、本当に**貪欲することができ、問題の解決策を参照してください。

次いで、溶液をシンクとテーブルとの間に、偶数側流条件は、ソースノードとテーブルとユニットとの間のユニット側流量に接続されたユニット数との間に確保することができるユニット及びテーブル、の2つの部分として、ネットワークに流れます。偶数テーブルエッジ流れ容量。

(愚かな私)

そして、前の最後の狂気の点Tを書き、明らかにすべての非常に高速な通常のネットワークストリームの波を支払い、その後、多くの議論を見てみると、最後の点Tであり、いくつかは、現在のアークが彼女を最適化すると言います。

dalaoを参照して、問題の解決策を見に行ってきました(勉強したくないが)、半分答えをポイントアーク最適化を解体せずにこの問題と言う、XJBマップの建物は(顔を疑う)きれいです。(休息!)場合の外観は、唯一の内部のDFSで、何も異なるものを感じてブレーク。

離陸の場所のプラス直接の結果。

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、

CONST  INT MAXN = 506 const  int型 MAXM = 90006 ;
INTのN、M、TOT。
INT CNT = 1 、S、T、ヘッド[MAXN]。
構造体のエッジ{
   int型のX、Y、ヴァル、次。
} E [MAXM]。

ボイド追加(int型のx、int型の Y、int型のval){ 
  E [ ++ CNT] = (エッジ){X、Y、ヴァル、ヘッド[X]}。
  ヘッド[X] = CNT。
} 

INT D [MAXN]。

BOOL BFS(){
  キュー <int型 > 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))。
      E [i]は.val - = K。
      E [I ^ 1 ] .val + = K。
      残り - = K;
      もし(!休憩)破ります; 
    } 
  } 
  を返す flow- 休息を。
} 

int型dinic(){
   int型 RES = 0 一方、(BFS())RES + = DFS(S、0x3f3f3f )。
  リターンのres; 
} 

int型のmain(){ 
  scanf関数(" %D%dの"、&​​N、&M)。
  S = 0、T = N + M + 1 int型 i = 1 ; iが<= N iが++ ){
     int型のX; scanf関数(" %のD "、&x)は、 
    TOT + =のx; 
    追加(S、I、X)。
    追加(I、S、0 );
    int型 J = N + 1、J <= N + M; J ++ ){ 
      追加(I、J、1 )。
      追加(J、I、0 ); 
    } 
  } 
  のためのint型 I = N + 1 ; iがM <= N + iが++ ){
     int型のX; scanf関数(" %のD "、&x)は、
    追加(I、T、X)。
    追加(T、I、0 ); 
  } 
  INT ANS = dinic()。
  もし(ANS!= TOT){のprintf(" 0 "); 戻り 0 ;} 
  のprintf(" 1 \ n " );
   のためint型 i = 1 ; iが++; iが<= N {)
     のためにINT J; J = J =頭部[I] 、E [J]。 )次の
      場合!(E [J] .val)のprintf(" %dの"、E [J] .y- ; N)
    のputchar(10 ); 
  } 
}
コードの表示

 

おすすめ

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