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種選擇方案,可以縮點後跑網路流,時間複雜度是合理的。
#includeusingnamespace
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個,所以把每個星球適合住的人數存...