HDU 3605 Escape(最大流 縮點轉換)

2022-05-17 17:15:02 字數 1595 閱讀 6444

題目很簡單,要求的就是最後能搬到星球上去的人的個數。剛開始看到,知道是最大流,就把人和星球都設為點,能生存就連線,權值為1,最後建立超級源點和超級匯點。求出最大流量即可。先是re,開大陣列後tle。仔細算了,光光人到星球的便就可達到100w了,超時的概率太大了。後來找了解題報告,知道了縮點這一說,因為星球個數m最大只有10個,所以每個人最多只有1024種情況,把這每一種情況設為點(這裡很抽象),將之與符合情況的星球相連。邊流量就是這種情況總的人數。最後每個星球以限定居住人數為邊流量連超級匯點。建圖完成後就可以用最大流求解了。

1

/*dinic演算法求最大流

*/2 #include3 #include

4#define point_max 100025

5#define edge_max 10000000

6#define inf_max 999999999

7 #include8

using

namespace

std;

9struct

edge

10edge[edge_max];

15int len;/*

邊的數量

*/16

intpoint[point_max];

17int

vertex,edge;

18int

d[point_max];

19void init()/*

初始化*/

2024

int add_edge(int a,int b,int w)/*

新增由a指向b的權值為w的邊

*/25

33int bfs(int

s)3449}

50}51if(d[vertex]>=0)52

return1;

53return0;

54}55long

long min(long

long a,long

long

b)56

59long

long dinic(int t,long

long sum)/*

尋找增廣路

*/6076}

77return os-sum;78}

79long

long dinic(int s)/*

dinic演算法

*/80

8687

intmain()

88105

}106 a[k]++;

107}

108109

for(int i=1;i<=(1

110121

}122

}123

for(int i=0;i)

124130 vertex=t;

131int ans=dinic(0

);132

//cout<133

if(ans>=n)cout<

yes"

<

134else cout<

<

135}

136return0;

137 }

view code

HDU 3605 Escape 最大流,狀壓

最大流,n比較大,但是m只有10,所以對應的人的狀態最多有2 m種,因此可以對人進行歸類,那樣n的資料量就只有1024了,求最大流 g 交會超時 要用c include include include include include define maxn 1100 define maxe 2100...

最大流 縮點 HDU 3605 Escape

有n個人,m個星球。每個人都對不同的星球有自己的喜好,每個星球都有自己的容量。問能否讓所有的人都呆在自己喜歡的星球裡。1 n 100000 m 1 m 10 以為是套模板的題,一直tle,mle。看了大佬的 才明白這題需要縮點。因為最多有10個星球,所以最多有 include include inc...

HDU 3605 Escape (最大流 縮點)

題意 給你n個人,m個星球,每個人對這m個星球的都有一定的適應能力,每個星球都有一定的容納量,問能否讓所有的人在星球上生存。剛開始做的時候一直tle 不知道為什麼,改著改著發現建圖的時候,添了很多邊,這樣跑最大流非常慢,看了網上的思路才知道要縮點,因為星球最多才有10個,所以把每個星球適合住的人數存...