由於人類對自然資源的消耗,人們意識到大約在 2300 年之後,地球就不能再居住了。於是在月球上建立了新的綠地,以便在需要時移民。令人意想不到的是,2177 年冬由於未知的原因,地球環境發生了連鎖崩潰,人類必須在最短的時間內遷往月球。
現有 n 個太空站位於地球與月球之間,且有 m 艘公共運輸太空船在其間來回穿梭。每個太空站可容納無限多的人,而每艘太空船 i 只可容納 h[i]個人。每艘太空船將周期性地停靠一系列的太空站,例如:(1,3,4)表示該太空船將周期性地停靠太空站 134134134…。每一艘太空船從乙個太空站駛往任一太空站耗時均為 1。人們只能在太空船停靠太空站(或月球、地球)時上、下船。初始時所有人全在地球上,太空船全在初始站。試設計乙個演算法,找出讓所有人盡快地全部轉移到月球上的運輸方案。
對於給定的太空船的資訊,找到讓所有人盡快地全部轉移到月球上的運輸方案。
格式:
第 1 行有 3 個正整數 n(太空站個數),m(太空船個數)和 k(需要運送的地球上的人的個數)。其中 n<=13 m<=20, 1<=k<=50。
接下來的 m 行給出太空船的資訊。第 i+1 行說明太空船 pi。第 1 個數表示 pi 可容納的人數 hpi;第 2 個數表示 pi 乙個週期停靠的太空站個數 r,1<=r<=n+2;隨後 r 個數是停靠的太空站的編號(si1,si2,…,sir),地球用 0 表示,月球用-1 表示。時刻 0 時,所有太空船都在初始站,然後開始執行。在時刻 1,2,3…等正點時刻各艘太空船停靠相應的太空站。人只有在 0,1,2…等正點時刻才能上下太空船。
程式執行結束時,將全部人員安全轉移所需的時間輸出。如果問題無解,則輸出 0。
先吐槽一下,為什麼只用轉移50個人。。
這道題是乙個我沒有get到的技能點,分層圖網路流。(也許餐巾計畫算,可當時並沒有意識到這個是一類問題)。
對於這類問題,我們可以按照時間把圖分層。對於每一天的太空站,我們都用乙個節點去表示。
地球是每一列的1號節點與s連線,月球是每一列的最後乙個節點與t連線。
如果地球->月球有存在路徑,則問題有解。所以先dfs判斷可行性。
然後轉移的時候就是也按照時間來跑,列舉時間來加邊。算一下前一天那個飛船所在位置,然後從前一天的星球到這一天的星球連一條飛船容量的邊。因為人可以原地停留,所以每個星球不同天之間連邊。
如果最大流大等於了人數,那麼就停止列舉,當前天數就是最短天數。(-1是所用時間)。
特別需要注意的是。。網路流問題中節點的表示要深思熟慮,不要因為這個除錯一年。。
#include
using
namespace
std;
const
int n=305;
const
int maxn=4e5+5;
const
int inf=1e9;
int chuan[n][n*10],rong[n],times[n];
bool flag=0;
struct edgee[maxn<<2],fe[maxn<<2];
int head[maxn],cur[maxn],cnt=1,s,t,n,m,k;
int fhead[maxn],fcnt=0;
inline
void add(int u,int v,int w),head[u]=cnt;}
inline
void fadd(int u,int v),fhead[u]=fcnt;}
queue
q;int dep[maxn];
bool bfs(int x)}}
if(!dep[t])return
0; return1;}
int dfs(int u,int flow)}}
return0;}
int dinic()
return ans;
}bool vis[maxn];
void lt(int u,int fa)
for(int i=fhead[u];i;i=fe[i].next)
}int main()
}lt(0,0);
if(!flag)
// int p=10;
// for(int i=1;i<=times[p];i++)coutadd(n+2,t,inf),add(t,n+2,0);
while(ans1)+1,inf),add(base*(day-1)+1,s,0);//連s,t。
add(base*day,t,inf),add(t,base*day,0);
// cout}
for(int i=1;i<=m;i++)
ans+=dinic();
// cout<<"day:"<}
cout
<<--day;
return
0;}
星際轉移問題
s向地球連k的邊,每天每個地方由上一天連inf邊,每天月亮向t連邊 列舉天數獲取每天飛船的位置,由上一天的位置向這一天連滿載的邊 跑到人都送完位置,在合適的時候 玄學 break輸出無解 include include include include include define ll long l...
網路流24題 星際轉移問題
這個問題的難點在於如何表示時間的流逝很容易 想到源點 是地球,然後中間 一串的空 間站,最 後連向匯 點月 球很容易想到源點是地球,然後中間一串的空間站,最後連向匯點月球 很容易想到源 點是地球 然後中 間一串的 空間站,最後連向 匯點月球空間 站間各自 連邊,流 量是飛船 的容 量空間站間各自連邊...
網路流24題 星際轉移問題
description 由於人類對自然資源的消耗,人們意識到大約在 2300 年之後,地球就不能再居住了。於是在月球上建立了新的綠地,以便在需要時移民。令人意想不到的是,2177 年冬由於未知的原因,地球環境發生了連鎖崩潰,人類必須在最短的時間內遷往月球。現有 n 個太空站位於地球與月球之間,且有 ...