「24ネットワークフロー問題」惑星間転送

効果:$ n個の$宇宙ステーションにおいて、$ 1参照、...、N $、$ 0 $地球、月$ -1 $、$ M $船、船は、$ I $ $キャリア$ H_I缶誰が定期的に集合$ S_I $、すべての動きが$ 1 $のために時間を要する船で停止します。満月最短時間に$ K $の個人的なボートを作る方法を模索地球で最初の$ kは$個人、。

 

- 記録$ I $の$のT $宇宙ステーション・ステータス・時間$(I、T)$。

S $ $ $(0,0)に接続エッジ$ $のk $、$の( - 1、T)$ $ T $側$用INF $に接続され、$(I、T)$ $(I、T + 1に)$も、$ INF $縁。

列挙時間は、最大電流の流れは$ K $の場合宇宙船は、ティムの内部ネットワークに転送されるたびに、あなたが到達することができます。

書式#include <iostreamの> 
の#include <sstream提供> 
する#include <アルゴリズム> 
書式#include <cstdioを> 
する#include <math.h>の
書式#include <設定> 
書式#include <マップ> 
書式#include <キュー> 
の#include <string>に
する#include < string.hの> 
の#include <ビットセット> 
の#include <unordered_map> 
の#define REP(I、N)のために(INT iは=; I <= N; ++ I)
の#define PER(I、N) - (I; I> = A I = N INT)のため
の#defineのHRのputchar(10)
の#define PB一back 
の#define LC(O << 1)
(| 1 LC)の#define RC 
の#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。
typedefのペア<int型、int型> PII。
CONST int型P = 1E9 + 7、P2 = 998244353、INF = 0x3f3f3f3f。
LLのGCD(-1,11,11- b)は{戻りB GCD(B、%のB):;} 
のLL qpow(-1,11,11- n)で{LLのR = 1%P;(%= Pのために、N ; = *%P、N >> = 1)であれば(N - 1)R = R *%のP、リターンR;} 
?LL INV(LL X){X <= 1を返す:INV(P%以下X)*(PP / X)%P;} 
インラインint型RD(){int型のx = 0; CHAR P = GETCHAR();一方、(P < '0' || P> '9')p = GETCHAR() ;一方、(P> = '0' && P <= '9')、X = X * 10 + P-'0' 、P = GETCHAR();戻りX;} 
//ヘッド



のconst int型N = 1E6 + 10。
N INT、M、K、S、T、TOT。
INT H [N]、R [N]、FA [N]。
ベクター<INT> G [N]。 
    int型V、W、次。
VIS INTヘッド[N]、DEP [N]、[N]、CUR [N]、CNT = 1。
キュー<整数> Q; 
ボイド追加(INT U、V INT、INT W){ 
    E [++ CNT] = {V、W、ヘッド[U]}。
    ヘッド[U] = CNT。
    E [++ CNT] = {U、0、ヘッド[V]}。
    ヘッド[V] = CNT。
} 
(){BFSをint型
    、REP(I、1、TOT)DEP [I] = INF、VIS [I] = 0、[I] =ヘッドcur変換[I] 
    DEP [S] = 0、Q.push(S)。
    一方、(Q.size()){ 
        int型、U = Q.front()。Q.pop(); 
        {(; I I = E [i]は.next [U] I =ヘッドINT)のための
            IF(DEP [E [I] .V]> DEP [U] + 1 && E [I] .W){ 
                DEP [E [I] .V = DEP [U] +1。
                Q.push(E [I] .V)。
            } 
        } 
    } 
    戻りDEP [T] = INF!。
} 
INT DFS(int型のx、int型W){ 
    IF(X == T)戻りW。
    int型= 0を使用。
    {(; I I = E [i]は.next I = CUR [X]をINT)のための
        CUR [X] = I。
        IF(DEP [E [I] .V] == DEP [X] + 1 && E [I] .W){ 
            int型フロー= DFS(E [I] .V、分(W-用い、E [I] .W )); 
            (フロー){もし
                + =流用います。
                E [i]は.W - =流量; 
                E [I ^ 1] .W + =流量; 
                もし(使用== w)をブレーク。
            } 
        } 
    } 
    使用を返します。
} 
int型dinic(){ 
    int型ANS = 0。
    一方、(BFS())ANS + = DFS(S、INF)。
    ANSを返します。
}
 
?;} X:INT(INT X){[X] FAのFAを返す[X] =(FA [X])を探します
ボイド追加(int型のx、int型のY){ 
	X =(X)検索、Y =(y)を探します。
	IF(!X = Y)FA [X] Yを=。
} 
マップ<PII、整数> S。
INT番号(int型のx、int型のY){ 
	IF(s.count(PII(X、Y)))リターンS [PII(X、Y)]。
	リターンS [PII(X、Y)= ++ TOT。
} 

int型のmain(){ 
	scanf関数( "%D%D%D"、&N、&M、およびK); 
	REP(I、1、M){ 
		scanf関数( "%d個の%のD"、H + I、R + I)。
		REP(J、1、R [I]){ 
			int型のX; 
			scanf関数( "%のD"、&x)は、
			G [i]は.pb(X)。
			(G [i]が.front()+ 2、G [i]が.back()+ 2)を追加します。
		} 
		もし、(R [I] == 1)G [I] .clear()、 - I、 - M。
	} 
	、戻りプット( "0")(!(1)=(2)探す)0であれば、
	S = ++ TOT、T = ++ TOT。
	(S、ID(0,0)、k)を加えます。
		追加(ID(0、T-1)、ID(0、t)は、INF)。
		REP(I、1、N){ 
			追加(ID(I、T-1)、ID(I、T)、INF)。
		} 
		REP(I、1、M){ 
			int型L = ID(G [i]が[(T%以下のR [I] -1 + R [I])%のR [I]、T-1)、R = ID (G [i]が[Tの%のR [I]、T); 
			(L、R、H [I])を追加します。
		} 
		(ID(-1、t)は、T、INF)を加えます。
		IF((MF + = dinic())== k)とリターンのprintf( "%Dを\ n"、t)は、0。
	} 
}

 

おすすめ

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