上周模拟赛由于二分图不熟白白将这个题拱手送出。。。今天来一雪前耻。
说下建图:把最终在校的学生连向和他关系好的人的床和自己的床,然后做二分图匹配即可。
二分图细节:
if(!mapp[i]||xiongyali(mapp[i])) {
mapp[i]=x;
return true;}
①注意if语句中的顺序,递归在后
②注意xiongyali()里是mapp[i]而不是i,这调了我半个小时wwwu
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 105
int t,n,a[maxn][maxn],b[maxn],c[maxn],cnt,sum,v[maxn],mapp[maxn];
bool xiongyali(int x){
for(int i=1;i<=n;i++){
if(a[x][i]&&!v[i]){
v[i]=1;
if(!mapp[i]||xiongyali(mapp[i])) {
mapp[i]=x;
return true;}}}return false;}
int main(){scanf("%d",&t);
while(t--){
memset(a,0,sizeof(a));memset(mapp,0,sizeof(mapp));
cnt=0,sum=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]))cnt++;}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int q;scanf("%d",&q);
if((!b[i]||(b[i]&&!c[i]))&&q&&b[j])a[i][j]=1;
}if(b[i]&&!c[i])a[i][i]=1;}
for(int i=1;i<=n;i++){
memset(v,0,sizeof(v));
if(xiongyali(i)) {
sum++;}}
if(sum==cnt)printf("^_^\n");
else printf("T_T\n"); }
return 0;}