【NOI2008]ボランティア募集(コストフロー)

効果:$ N $、日々$ I $ $ $ a_iを$ M $ボランティアが種をボランティア、それぞれ無限、作業時間の種類$ I $ $ [S_I、T_I] $コストの$ C_Iの$。 、最小コストを見つけます。

 

$ $ソースSでも初日に、容量INF $ $

$ N + 1 $最初の日もの$ T $をシンク、$容量の$ INF

初日のバックでも$ I $ $ INF-a_iをします$

$ T_I + 1 $、容量の$ INFの$、コスト$ C_I $にそれぞれのボランティアにも$ S_I $

$ T $最小コスト最大フローに$ S $ができ得

 

書式#include <iostreamの> 
の#include <sstream提供> 
する#include <アルゴリズム> 
書式#include <cstdioを> 
する#include <cmath> 
の#include < 設定 > 
書式#include <マップ> 
書式#include <キュー> 
の#include < 文字列 > 
の#include <CStringの> 
#include <ビットセット> 
の#include <機能> 
の#include <ランダム>
 の#define REP(I、N)のために(INT iは=、iが<= N; ++ I)
 の#define PER(I、N )のために(INT I = N; I> =。
--I) の#defineのHRのputchar(10)
 の#define PB一back
#define LC(O << 1)
 の#define RC(LC | 1)
 の#define中間((L + R)>> 1)
 の#define LSのLC、L、中
 の#define RSのRC、ミッド+ 1であり、R
 の#define X最初
 の#define yの第二
 の#define IOのstd :: IOS :: sync_with_stdio(偽)
 の#define ENDL '\ N'
 の#define DB(A)({REP(__ I、1、n)はCOUT << [__ I] < < '';時間;})
 使用して 名前空間STDを、
typedefの長い 長いLL。
CONSTの INT N = 1E6 + 10、INF = 0x3f3f3f3f、S = N 2、T = N- 1 ;
int型N、M、流量;
構造体の縁{
     int型、にV、W、次。
    エッジ(INT =に0INT W = 0INT V = 0INT次= 0 ):(に)に、(W)W、V(V)、次の(次の){}
}また、[C]。
int型 [N]、CNT = Fヘッド[N]、DEP [N]、VIS [N]、CUR [N]、1 INT プレ[N]、PRE2 [N]。
キュー < 整数 > Q;
LLコスト;
int型spfa(){
    REP(I、1、N + 1)VIS [I] = DEP [I] = INF、F [I] = 0 ;
    F [S] = DEP [S]がF [T]がDEP [T]を= = = INF。
    DEP [S] = 0 、Q.push(S)。
    一方、(Q.size()){
         int型、U = Q.front()。Q.pop();
        VIS [U] = 0 ;
        int型 ; iはi = [U] I =ヘッド{E [I] .next)
             場合(DEP [E [i]は.TO]> DEP [U] + E [I] .V && E [I]。 W){
                DEP [E [i]は.TO] = DEP [U] + E [I] .V。
                プレ[E [i]は.TO] = U、PRE2 [E [i]は.TO] = I。
                F [E [i]は.TO] = 分(F [U]、E [I] .W)。
                もし(!VIS [E [i]の.TO]){
                    VIS [E [i]を.TO] = 1 
                    Q.push(E [I] .TO)。
                }
            }
        }
    }
    返す!DEP [T] = INFを。
}
ボイドEK(){
     一方(spfa()){
         int型、W = F [T]。
        INT U = T; U = S;!Uは= [U]をPRE){
            E [PRE2 [U]ワット - = W。
            E [PRE2 [U] ^ 1 ] .W + = W。
        }
        フロー + = W、コスト+ =(LL)W * DEP [T]。
    }
}
ボイド追加(int型 U、int型 V、INT W、int型の{k)を
    E [ ++ CNT] = エッジ(V、W、K、ヘッド[U])。
    ヘッド[U] = CNT。
    E [ ++ CNT =エッジ(U、0、 - K、頭[V])。
    ヘッド[V] = CNT。
}



INT {main()の
    scanf関数(" %d個の%のD "、&​​N、&M)。
    REP(I、1 、N){
         int型のT。
        scanf関数(" %のD "、&T)。
        追加(I、I + 1、INF-T、0 );
    }
    (S、追加1、INF、0 );
    追加(N + 1、T、INF、0 );
    REP(I、1 、M){
         int型、S、T、C。
        scanf関数(" %D%D%D "、&​​S、&T&C)。
        追加(S、T + 1 、INF、C)。
    }
    (A)。
    printf(" %LLDの\ nを" 、コスト)。
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/uid001/p/11718910.html