HDU3605 Escape (最大流 縮點)

2022-06-18 02:06:10 字數 1601 閱讀 8046

2012如果這是世界末日怎麼辦?我不知道怎麼做。但現在科學家們發現,有些恆星可以生存,但有些人卻不適合生活在一些星球上。現在科學家們需要你的幫助,就是確定所有的人都能在這些星球上生活。

輸入多組測試資料,每個資料的開頭是n(1<=n<=10萬),m(1<=m<=10)n表示地球上有n個人,m代表m星球,行星和人的標籤都是從0開始的。這裡有n行,每行代表乙個適合居住的人,每行有m個數字,第i個數字是1,表示乙個人適合居住在第i個星球,或者是0,表示這個人不適合居住在第i個星球。

最後一行有m個數字,第i個數字ai表示第i個星球最多能容納ai人。。

0<=ai<=100000

輸出決定是否所有的人都能不辜負這些明星

如果可以輸出yes,否則輸出no。

點數很多,但是考慮到每個人只有1000種選擇方案,可以縮點後跑網路流,時間複雜度是合理的。

#includeusing

namespace

std;

typedef

long

long

ll;const

int maxn=2e5+100

;const ll inf=1e18;

intn,m;

struct

node edge[maxn

<<1

];int

head[maxn],tot;

void addedge (int u,int

v,ll w)

ll dep[maxn],inq[maxn],cur[maxn],wjm,maxflow,s,t;

bool

bfs ()

dep[s]=0

; queue

q;q.push(s);

while

(q.size()) }}

}if (dep[t]!=inf) return1;

return0;

}ll dfs (

intu,ll flow)

ll used=0

;

for (int i=cur[u];i!=-1;i=edge[i].nxt) } }

return

used;

}ll dinic ()

}return

maxflow;

}int

main ()

mp[tt]++;

}s=0

; t=mp.size()+m+1

;

for (int i=0;i<=t;i++) head[i]=-1;tot=0;wjm=0;maxflow=0

;

int cnt=0

;

for (auto it=mp.begin();it!=mp.end();it++)

for (int i=1;i<=m;i++)

//printf("%lld\n",dinic());

if (dinic()==n)

printf(

"yes\n");

else

printf(

"no\n");

}}

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個,所以把每個星球適合住的人數存...