効果:$ 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 =に0、INT W = 0、INT V = 0、INT次= 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を" 、コスト)。 }