又一道水题。
交换相邻两行其实就是随便换~~~
把横坐标和纵坐标连边,然后跑二分图匹配。
时间戳大法好!!!!!
#include<cstdio>
#include<cstring>
int T,n,mch[210],v[210],now;
bool map[210][210];
bool fd(int x)
{
for(int i=1;i<=n;i++)
{
if(map[x][i]&&v[i]!=now)
{
v[i]=now;
if(mch[i]==0||fd(mch[i]))
{
mch[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
scanf("%d",&T);
while(T--)
{
memset(map,0,sizeof(map));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int x;
scanf("%d",&x);
if(x)
map[i][j]=1;
}
}
memset(mch,0,sizeof(mch));
memset(v,0,sizeof(v));
now=0;
bool tf=0;
for(int i=1;i<=n;i++)
{
now++;
if(!fd(i))
{
puts("No");
tf=1;
break;
}
}
if(!tf)
puts("Yes");
}
}