網路流24題 CTSC1999 家園

2022-03-03 17:27:17 字數 1782 閱讀 8512

對於這種乙個點(表面意義上的乙個點,比如說乙個位置)對應多種情況的(比如說隨著時間的推移有著不同的狀態,而且這種狀態》2),我們考慮在類似於分層圖上面跑網路流。

比如說這道題,週期的暴力處理顯然是一件很棘手的事情,我們看到資料範圍這麼小,就可以想一想把每個時間點的圖都建出來——

每個點對應哪乙個空間站在第幾個單位時間的狀態,然後把地球和月球也拆成在該單位時間時的狀態。

對於無解的情況,只需要並查集維護,如果不存在有從地球到月亮的路徑就是無解了。有解的情況,我們依次列舉答案,在建圖之後跑最大流,如果此時最大流大於需要運送的人數,那麼顯然就可以了。

怎麼建圖呢?

首先地球是起始站,源點肯定要向每個時刻的地球連邊吧,容量inf。然後月球是終點,所以要向每個時刻的月球連邊,容量inf。之後對於在空間站的人們就是兩種情況——1、人們可以選擇此時在該空間站的飛船,飛向下乙個空間站(/地球/月球)。2、無法移動,所以留在此處。顯然我們把時刻拆開之後,很輕易就能計算出對於每個飛船,當前時刻的位置和下一時刻的位置,直接在分層圖上連邊即可,容量為最大載重。因為人有可能無法移動,而且空間站的容量為無限大,所以對於每個空間站,要向下乙個時刻連一條邊,容量inf。

最後一點,此題與一般的網路流題問你決策最優化有所不同,是問你乙個數量需要在什麼情況下才小於等於最大流,注意可以用列舉答案來變成判定性問題呢(和二分的思路有點像?其實應該也可以直接二分答案,然後不斷地建立新圖跑看是否可行。但是因為是dinic演算法啦,乙個乙個列舉答案然後在殘圖上面繼續拓展就不需要建立新圖了。qwqwq)

**如下:

#include#include#include#include#include#include#define maxn 100010

#define maxm 1010

#define s 0

#define t 10001

using namespace std;

int n,m,k,t=1,ans,all,sum;

int to[maxm][maxm],num[maxn],cap[maxn],head[maxn],dis[maxn],cur[maxn],fa[maxn];

vectorv[maxm];

struct edgeedge[maxn<<1];

inline void add(int from,int to,int dis)

inline int find(int x)

inline void uni(int x,int y)

inline bool bfs()

}if(dis[t]==0x3f3f3f3f) return false;

return true;

}inline int dfs(int x,int f)

}return used;

}inline int dinic()

int main()

}if(find(n+1)!=find(n+2))

all=n+2;

add(s,all-1,2147483647);

add(all,t,2147483647);

for(ans=1;;ans++)

add(s,all*ans+all-1,2147483647);

add(ans*all+all,t,2147483647);

for(int j=1;j<=n;j++)

add((ans-1)*all+j,ans*all+j,2147483647);

sum+=dinic();

if(sum>=k)

}return 0;

}

網路流24題 CTSC1999 家園

地球和月球中間有 n n 個太空站,有 m role presentation m m艘太空船,k k 個人要從地球前往月球。已知每個太空站可以容納無限多的人,每艘太空船的承載人數為 hi role presentation hih i,以及它們的行駛路線 經過的每乙個太空站編號 任意兩個太空站之間...

CTSC1999 網路流24題 家園

題目 洛谷p2754。題目大意 有 n 個空間站,m 個飛船,每個飛船有各自的停靠站點,並且從第乙個停靠站點開始,不斷迴圈。每個飛船有不同的容量 1為月球,0為地球 每個飛船初始停在第乙個停靠站上,每過1s就會到下乙個停靠站。在空間站上的人可以選擇上飛船,也可以選擇不上飛船。現在有 k 個人要從地球...

CTSC 1999 家園 網路流24題 星際轉移

直接把每乙個點,每一天拆成乙個點。然後每個點到下一天連 inf 的邊。然後把飛船的路徑用容量為飛船容量的邊連線。然後跑網路流判斷是否滿流。include include include include include using namespace std define f i,j,k for in...