思路:匈牙利算法求二分图最大匹配,左部为非回家者,右部为在学校者。
或许已然不复,或许久存苍穹。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int T,n,stu[105],home[105],vis[105],pre[105],kno[105][105];
int find(int u){
if(vis[u]) return 0;
vis[u]=1;
for(int v=1;v<=n;v++){
if(!kno[u][v]||!stu[v]) continue;
if(!pre[v+n]||find(pre[v+n])){
pre[v+n]=u;
return 1;
}
}
return 0;
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&stu[i]);
for(int i=1;i<=n;i++) scanf("%d",&home[i]);
memset(pre,0,sizeof(pre));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++) scanf("%d",&kno[i][j]);
if(stu[i]) kno[i][i]=1;
}
int flag=1;
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
if(!home[i]) flag&=find(i);
}
if(flag) printf("^_^\n");
else printf("T_T\n");
}
return 0;
}