题目的意思非常明显,就是告诉你一些人之间的关系,一些床位可以容纳一些人。问在校且不回家的人数加上外来人数是否能被所有床位容纳。
这题需要注意每次求二分图的最大匹配之前的初始化,我就是在这里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;
}