您的位置:首页 > 其它

【BZOJ】1433 [ZJOI2009]假期的宿舍 二分图的最大匹配

2017-02-28 19:50 435 查看
题目的意思非常明显,就是告诉你一些人之间的关系,一些床位可以容纳一些人。问在校且不回家的人数加上外来人数是否能被所有床位容纳。

这题需要注意每次求二分图的最大匹配之前的初始化,我就是在这里WA了好几次……

之后只要贴上匈牙利算法的模板就好了。

其实这题也可以用网络最大流来做,但是我觉得好像并不需要如此装B吧……

附上AC代码:

#include <cstdio>
#include <cstring>
using namespace std;

int t,n,b[51],c[51],sum,x,a[51][51],ans,h[51];

bool so(int x){
for (int i=1; i<=n; ++i)
if (!b[i]&&a[x][i]){
b[i]=1;
if (!h[i]||so(h[i])){
h[i]=x;
return 1;
}
}
return 0;
}

int main(void){
scanf("%d",&t);
while (t--){
memset(a,0,sizeof a);
memset(h,0,sizeof h);
sum=ans=0;
scanf("%d",&n);
for (int i=1; i<=n; ++i) scanf("%d",&b[i]);
for (int i=1; i<=n; ++i) {
scanf("%d",&c[i]);
if (!b[i]||(b[i]&&!c[i])) ++sum;
}
for (int i=1; i<=n; ++i){
for (int j=1; j<=n; ++j){
scanf("%d",&x);
if (x&&(!b[i]||(b[i]&&!c[i]))&&b[j]) a[i][j]=1;
}
if (b[i]&&!c[i]) a[i][i]=1;
}
for (int i=1; i<=n; ++i){
memset(b,0,sizeof b);
if (so(i)) ++ans;
}
if (ans==sum) printf("^_^\n");
else printf("T_T\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: