codeforces847J学生開始ネットワークフロー

トピックポータル

質問の意味:

  N個の個別、Mの関係、各関係の要件がありますが、1とギフトのための別の人、そして少しの贈り物として、ほとんどの人々のギフト配達に一人だけがあります。そしてギフトプログラムの出力。

考える:この質問は、トラブルのネットワークフローモデル(ナンセンス)を変換です。

  最も重要な要因は、それがこの文はナンセンスですが、お互いに贈り物をすることではなく、一人だけが、贈り物を送信するために別の人を与えることができ、各ペア間の関係である。このため、我々はポイントに合わせて直接構築された人々を考慮すれば、最終的なプログラムは、問題になります。(同じ流量が、プログラム・エラー)。

#pragma GCCの最適化(2)
 の#pragma G ++最適化(2)
 の#pragmaコメント(リンカー、 "/ STACK:102400000,102400000")
の#include <ビット/ STDC ++ H> 
の#include <cstdioを> 
する#include <ベクトル>
 の#define担当者(iは、、B)のための(iは= int型、iが<= bは、iが++)
 の#define DEP(I、B、A)(iはBを= int型;方には> =; i--)
 の#define CLR(B)のmemset(A、B、はsizeof(A))
 の#define PB一back
 の#define PII対<整数、整数>
 使用して 名前空間STDを、
typedefの長い 長いLL。
const  int型 MAXN = 200010 ;
CONST int型 INF = 0x3f3f3f3f 
LL RD()
{ 
    LL、X = 0、F = 1チャー CH = GETCHAR()。
    一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1 ; CH = GETCHAR();}
     一方(CH> = ' 0 ' && CH <= ' 9 '){X = X * 10 + CH- ' 0 ' ; CH = GETCHAR();}
    リターンのx *のF; 
} 
CONST INFLL = LL 0x3f3f3f3f3f3f3f3f const  int型 INF = 0x3f3f3f3f 

構造体のエッジ{
     int型、流れ、NXTに、
    エッジ(){} 
    エッジ(INTに、INT NXT、INT 流れ)に(に)、NXT(NXT)、フロー(流れ){} 
}エッジ[MAXN << 2 ]。

int型のヘッドは、[MAXN]、[MAXN] DEP。
int型S、T;
INT N、N、M、TOT、CNT。
ベクトル <ペア< int型int型 >> VA;
空隙INIT(int型N){ 
    N = N。
    以下のためにint型 i = 0 ; iは= Nを<; ++ I)ヘッド[I] = - 1 
    TOT = 0 ; 
} 

ボイド ADDV(INT U、INT V、INT W、INT RW = 0 ){ 
    エッジ[TOT] = エッジ(V、ヘッド[U]、W)。
    ヘッド[U]は ++ TOTを= 
    エッジ【TOT] = エッジ(U、ヘッド[V]、RW)。
    ヘッド[V] = TOT ++ 
} 

ブールBFS(){
     ためint型 I = 0 ; iが= Nを<; ++ i)はDEP [I] = - 1 
    キュー < 整数 > Q; 
    q.push(S)。
    DEP [S] = 1 しばらく(!q.empty()){
         int型のu = q.front(); 
        q.pop(); 
        int型 ;〜I I = I =ヘッド[U] {エッジ[i]は.nxt)
             場合 - (エッジ[I] .flow && DEP [エッジ[I] .TO] == 1 ){ 
                DEP [エッジ[I] .TO] = DEP [U] + 1 
                q.push(エッジ[I] .TO)。
            } 
        } 
    } 
    戻り DEP [T] < 001 
} 

INT DFS(INT U、INT F){
     場合(Uは== T || Fの== 0リターンF。
    INT =使用、wは0 int型 ;〜I; I =ヘッド[U] I = エッジ[I] .nxt){
         場合(エッジ[I] .flow && DEP [エッジ[I] .TO] == DEP [U] + 1 ) { 
            W DFS(エッジ= [I] .TO、分(F -使用、エッジ[I] .flow))。
            エッジ[I] .flow - = W。
            エッジ[I ^ 1 ] .flow + = W。
            使用 + = W。
            もし(使用==のF)リターンF。
        } 
    } 
    もし、[U] = DEP - (使用!)1 リターンが使用され; 
} 

int型Dicnic(){
     int型 ANS = 0 一方、(BFS()){ 
        ANS + = DFS(S、INF)。
    } 
    戻りANS。
} 
INT [VS 5010 ] [ 5010 ]。
ブールチェック(INT RES){ 
    初期化(T)。
    担当者(I、1 、M){ 
        ADDV(I + N、T、1 ); 
    } 
    担当者(I、1 、N){ 
        ADDV(S、I、RES)。
    } 
    担当者(I、0、M- 1 ){
         int型、U = VA [i]が1次回、V = VA [i]は.second。
        ADDV(U、I + 1 + nは、1 )。
        ADDV(V、I + 1 + nは、1 )。
    } 
    int型フロー= Dicnic()。
    もし(フロー> = M){
         戻り 
    } 
    を返す 
} 

int型のmain(){
     ながら(〜のscanf(" %d個の%のD "、&​​N、&M)){ 
        va.clear()。
        S = 0、T = N + M + 1 
        担当者(I、1 、M){
             int型Uを、V。
            scanf関数(" %d個の%d個"、&​​U&V); 
            va.push_back({U、V})。
        } 
        int型の L = 0、R = N +1、半ば、ANS = - 1 ;
        一方、(L <= R){ 
            半ば =(L + R)>> 1 もし(チェック(MID)){ 
                ANS = ミッド。
                R =半ば1 
            } { 
                L =ミッド+ 1 
            } 
        } 
        
        チェック(ANS)。
        printf(" %d個の\ n " 、ANS)。
        INTの流れ= Dicnic()。
        以下のためのint型のu = 1 ; U <= N; U ++ ){
             ためint型のI =ヘッド[U]は、I =! - 1 ; I = エッジ[I] .nxt){ 
                
                場合(エッジ[I] .flow == 0 &&エッジ[I ] .TO> N){
                     int型 ID =エッジ[I] .to- N。
                    INT X =(VA [ID- 1 ] 1次回== U VA [ID-?1 ] .second:VA [ID- 1 ] 1次回)。
                        printf(" %D%D \ n " 、U、X)。
                } 
            } 
        } 
    } 
}

 

  私たちはn個の点の確立を考慮する必要があり、人に対応する各ポイントは、次に、m個の点を作成し、各点は、各個人が所有するれた関係、容量側のシンク1に接続されたそれぞれの関係に対応しますすべての関係は、このように、上記は、この条件が成立したと述べた製造、容量側1に接続されています。その後、我々は、各マップを再構築することができ、人々の流れに各ソースポイント仮想放射源点、2点を作成します。

  最終的に出力方式は、プログラムの流出容量の各点は、0側です。

 

おすすめ

転載: www.cnblogs.com/mountaink/p/11610466.html