对于40%的数据,n≤10
对于100%的数据,n≤2000, t≤5
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,i,j,k,now,f[2003];
int a[2003][2003];
bool dfs(int x,int num)
{
if (num>3) return false;
for (int i=1;i<=m;i++)
if (a[x][i]==1)
{
a[x][i]=0;//无需回溯,因为如果有环从哪里开始都是一样的
if (i==now&&num==3||dfs(i,num+1)) return true;
dfs(i,num+1);
}
return false;
}
int main()
{
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%d\n",&m);
for (j=1;j<=m;j++)
{
char s[2003];
gets(s);
for (k=1;k<=m;k++)
a[j][k]=s[k-1]-48;
}
int f=false;
for (j=1;j<=m;j++)
{
now=j;
if (dfs(j,1))
{
printf("Yes\n"); f=true;
break;
}
}
if (f==false)
printf("No\n");
}
}