A tournament is a directed graph without self-loops in which every pair of vertexes is connected by exactly one directed edge. That is, for any two vertexes u and v (u ≠ v)
exists either an edge going from u to v, or an edge
from v to u.
You are given a tournament consisting of n vertexes. Your task is to find there a cycle of length three.
Input
The first line contains an integer n (1 ≤ n ≤ 5000).
Next n lines contain the adjacency matrix A of the
graph (without spaces). Ai, j = 1 if
the graph has an edge going from vertex i to vertex j,
otherwise Ai, j = 0. Ai, j stands
for the j-th character in the i-th line.
It is guaranteed that the given graph is a tournament, that is, Ai, i = 0, Ai, j ≠ Aj, i(1 ≤ i, j ≤ n, i ≠ j).
Output
Print three distinct vertexes of the graph a1, a2, a3 (1 ≤ ai ≤ n),
such that Aa1, a2 = Aa2, a3 = Aa3, a1 = 1,
or "-1", if a cycle whose length equals three does not exist.
If there are several solutions, print any of them.
Sample test(s)
input
5
00100
10000
01001
11101
11000
output
1 3 2
input
5
01111
00000
01000
01100
01110
output
-1
找到并输出一条长度为3的环。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
bool v[5555]={0};
int n;
char s[5555][5555];
bool dfs(int i,int dad)
{
v[i]=true;
for (int j=1;j<=n;j++)
{
if (s[i][j]-'0')
{
if (s[j][dad]-'0')
{
printf("%d %d %d\n",dad,i,j);
return true;
}
if (!v[j])
{
if (dfs(j,i)) return true;
}
}
}
return false;
}
int main()
{
cin>>n;
for (int i=1;i<=n;i++)
{
scanf("%s",s[i]+1);
}
for (int i=1;i<=n;i++)
{
if (!v[i])
{
if (dfs(i,i)) return 0;
}
}
printf("-1\n");
return 0;
}