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