题解
这种让来让去让我想到了二分图!!
注意细节!!剩余的就是模拟了
code
#include<bits/stdc++.h>
using namespace std;
int stu[55],gohome[55],know[55][55];
int n;
int belong[55]={0};
int vis[55]={0};
int settle(int now)
{
if(vis[now])return 0;
vis[now]=1;
for(int i=1;i<=n;i++)
{
if(know[now][i]&&stu[i])//想借别人的床不仅得认识他,他还得有床!!即是个学生
{
if(!belong[i]||settle(belong[i]))
{
belong[i]=now;//用了别人的床位要记录!!!
return 1;
}
}
}
return 0;
}
int main()
{
int t;
cin>>t;
while(t--)
{
memset(belong,0,sizeof belong);//不要写成sizeof 0!!!!
cin>>n;
for(int i=1;i<=n;i++) cin>>stu[i];
for(int i=1;i<=n;i++) cin>>gohome[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) cin>>know[i][j];
know[i][i]=1;//你也可以睡自己的床
}
int ans=1;
for(int i=1;i<=n;i++)
{
if(gohome[i]&&stu[i]) continue;
ans&=settle(i);
memset(vis,0,sizeof vis);
if(!ans)break;
}
if(ans)printf("^_^\n");
else printf("T_T\n");
}
return 0;
}
标签:vis,假期,55,belong,int,P2055,ZJOI2009,now,know
From: https://www.cnblogs.com/pure4knowledge/p/18061156