题目:
题目链接:[LUOGU P2055 假期的宿舍]
题解:最大匹配板子题,就是巧妙在建图上,有床留校者则连即可,最后处理判断是否完全匹配即可。
代码:
#include<bits/stdc++.h>
using namespace std;
const int sea=200;
int T,n,a[sea][sea],g[sea][sea],pre[sea],v[sea],ff[sea],vv[sea];
inline int read()
{
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch<='9'&&ch>='0')s=s*10+ch-'0',ch=getchar();
return s*w;
}
bool hgry(int x)
{
for(int i=1;i<=n;i++)
if(!v[i]&&g[x][i])
{
v[i]=1;
if(!pre[i]||hgry(pre[i])) {pre[i]=x;return 1;}//就是这里手滑写错了,,,~5555~调了好长时间,之前就没错过hgry板子啊,,~555555~
}
return 0;
}
int main()
{
T=read();
while(T--)
{
memset(g,0,sizeof(g));
memset(pre,0,sizeof(pre));
n=read(); int tmp=0;
for(int i=1;i<=n;i++) ff[i]=read();
for(int i=1;i<=n;i++) vv[i]=read();
for(int i=1;i<=n;i++) if(!vv[i]&&ff[i]) g[i][i]=1;
for(int i=1;i<=n;i++) if(!ff[i]||(ff[i]&&!vv[i])) ++tmp;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
{
int x=read();
if(x&&ff[j]) g[i][j]=1;
}
int ans=0;
for(int i=1;i<=n;i++)
if(!ff[i]||(ff[i]&&!vv[i]))
{
memset(v,0,sizeof(v));
if(hgry(i)) ++ans;
}
if(ans==tmp) puts("^_^");else puts("T_T");
}
return 0;
}