https://www.lydsy.com/JudgeOnline/problem.php?id=1433
这题题意有点绕。。。要注意一些理解
1.在校生才有床
2.非在校生都要睡一张床
3.在矩阵中自己不认识自己,但是能睡自己的床,也能睡自己认识的人的床。
那么就可以建图了,看所有要睡床的人能不能都匹配到就行了
#include<bits/stdc++.h>
using namespace std;
const int maxl=1e3+10;
int n,sum,ans,cnt;
int match[maxl],ehead[maxl];
int w[maxl][maxl];
bool vis[maxl],isstu[maxl],gohome[maxl];
struct ed
{
int to,nxt;
}e[maxl<<1];
inline void add(int u,int v)
{
e[++cnt].to=v;e[cnt].nxt=ehead[u];ehead[u]=cnt;
}
inline void prework()
{
scanf("%d",&n);
for(int i=1;i<=2*n;i++)
match[i]=0,ehead[i]=0;
int x;sum=n;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
isstu[i]=x;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
if(isstu[i])
{
gohome[i]=x;
if(x) sum--;
}
}
cnt=0;
for(int i=1;i<=n;i++)
{
if(isstu[i] && !gohome[i])
add(i,i+n);
for(int j=1;j<=n;j++)
{
scanf("%d",&w[i][j]);
if(w[i][j])
{
if((!isstu[i] || (!gohome[i] && isstu[i])) && isstu[j])
add(i,j+n);
}
}
}
}
inline bool dfs(int u)
{
int v;
for(int i=ehead[u];i;i=e[i].nxt)
{
v=e[i].to;
if(!vis[v])
{
vis[v]=true;
if(!match[v] || dfs(match[v]))
{
match[v]=u;
return true;
}
}
}
return false;
}
inline void mainwork()
{
ans=0;
for(int i=1;i<=n;i++)
if(!isstu[i] || (isstu[i] && !gohome[i]))
{
memset(vis,false,sizeof(int)*(2*n+1));
if(dfs(i))
ans++;
}
}
inline void print()
{
if(ans==sum)
puts("^_^");
else
puts("T_T");
}
int main()
{
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
prework();
mainwork();
print();
}
return 0;
}