NKOI 1948 星際轉移

2021-07-17 01:40:06 字數 2482 閱讀 9006

【線性規劃與網路流24題 13】星際轉移

time limit:10000ms  memory limit:65536k

total submit:15 accepted:0

case time limit:1000ms

description

由於人類對自然資源的消耗,人們意識到大約在2300 年之後,地球就不能再居住了。於是在月球上建立了新的綠地,以便在需要時移民。令人意想不到的是,2177 年冬由於未知的原因,地球環境發生了連鎖崩潰,人類必須在最短的時間內遷往月球。現有n個太空站

位於地球與月球之間,且有m 艘公共運輸太空船在其間來回穿梭。每個太空站可容納無限多的人,而每艘太空船i 只可容納h[i]個人。每艘太空船將周期性地停靠一系列的太空站,

例如:(1,3,4)表示該太空船將周期性地停靠太空站134134134…。每一艘太空船從乙個太空站駛往任一太空站耗時均為1。人們只能在太空船停靠太空站(或月球、地球)時上、下船。初始時所有人全在地球上,太空船全在初始站。試設計乙個演算法,找出讓所有人盡快地全部轉移到月球上的運輸方案。

程式設計任務:

對於給定的太空船的資訊,找到讓所有人盡快地全部轉移到月球上的運輸方案。

input

第1行有3 個正整數n(太空站個數),m(太空船個數)和k(需要運送的地球上的人的個數)。其中 1<=m<=13, 1<=n<=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…等正點時刻才能上下太空船。

output

程式執行結束時,將全部人員安全轉移所需的時間輸出。如果問題無解,則輸出0。

sample input

2 2 1

1 3 0 1 2

1 3 1 2 –1

sample output

5
source

感謝 wo_ai_wangyuan 放上資料

無解很好判斷,乙個dfs就可以搞定

接下來我們考慮構圖

方便起見,我們把每乙個太空站(包括地球月球)的編號加上乙個3,源點為0,匯點為1

首先開始的時候,我們將源點和地球連上一條容量為inf的邊,月球和匯點連上一條容量為inf的邊

然後順序列舉天數,對於第t天,將源點和連上一條容量inf的邊,將和匯點連上一條容量為inf的邊

然後對於每乙個太空船,如果它在第t-1天到達太空站a,在第t天到達太空站b,那麼將,連上一條容量為該太空船的最大容量的邊

對於每乙個太空站i,由於可以延時轉移且容量無限大,將和連上一條容量為inf的邊

然後就求最大流,記住每一次求最大流都是在上一次求完之後的殘量網路上進行的

用sum來記錄當前求出的所有的最大流的和,如果sum>=k就說明所有人都從地球轉移到月球了,輸出此時的t

用sap要超時,所以用了劉汝佳提供的isap**,怕有重邊所以用的鄰接表

#include#include#include#include#define getid(xx,day) ((day)*(n+2)+(xx))

using namespace std;

const int maxn=1500,inf=1e9;

inline void _read(int &x)

for(x=0;t>='0'&&t<='9';t=getchar())x=x*10+t-'0';

if(!sign)x=-x;

}int n,m,k,last[maxn],h[60],cnt[60];

int ck[60][60],tot,op,ed,sum,end[maxn],last[maxn<<2],next[maxn<<2];

int dis[maxn],vd[maxn],earth=3,moon=2,cur;

bool vis[60];

struct wr

};

vectors;

void insert(int a,int b,int c)

void add(int x,int y)

bool find(int x)

int dfs(int x,int flow)

mind=min(mind,dis[y]);

}if(!sud)

return sud;

}void sap(){

memset(vd,0,sizeof(vd));

memset(dis,0,sizeof(dis));

vd[0]=tot;

while(dis[op]

星際轉移問題

由於人類對自然資源的消耗,人們意識到大約在 2300 年之後,地球就不能再居住了。於是在月球上建立了新的綠地,以便在需要時移民。令人意想不到的是,2177 年冬由於未知的原因,地球環境發生了連鎖崩潰,人類必須在最短的時間內遷往月球。現有 n 個太空站位於地球與月球之間,且有 m 艘公共運輸太空船在其...

星際轉移問題

s向地球連k的邊,每天每個地方由上一天連inf邊,每天月亮向t連邊 列舉天數獲取每天飛船的位置,由上一天的位置向這一天連滿載的邊 跑到人都送完位置,在合適的時候 玄學 break輸出無解 include include include include include define ll long l...

網路流 24 題 星際轉移

題目描述 由於人類對自然資源的消耗,人們意識到大約在 2300 年之後,地球就不能再居住了。於是在月球上建立了新的綠地,以便在需要時移民。令人意想不到的是,2177 年冬由於未知的原因,地球環境發生了連鎖崩潰,人類必須在最短的時間內遷往月球。現有 n n n 個太空站位於地球與月球之間,且有 m m...