C. Cycle
time limit per test
2.5 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
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.
Examples
input
Copy
5
00100
10000
01001
11101
11000
output
Copy
1 3 2
input
Copy
5
01111
00000
01000
01100
01110
output
Copy
-1
#include<bits/stdc++.h>
#define IL inline
#define RI register int
#define N 200000+200
#define clear(a) memset(a,0,sizeof a)
#define rk for(RI i=1;i<=n;i++)
#define ll long long
using namespace std;
const int maxn=5000+66;
const ll mod=1e9+7;
vector<int>v[maxn];
IL void read(int &x)
{
int f=1;
x=0;
char s=getchar();
while(s>'9'||s<'0')
{
if(s=='-')
f=-1;
s=getchar();
}
while(s<='9'&&s>='0')
{
x=x*10+s-'0';
s=getchar();
}
x*=f;
}
int n,m;
int flag;
int vis[maxn];
char ch[maxn][maxn];
int dfs(int x,int fa,int step)
{
if(step>4)return false;
vis[x]=1;
for(int i=1; i<=n; i++) //---
{
if(ch[x][i]-'0')
{
if(ch[i][fa]-'0')
{
printf("%d %d %d\n",fa,x,i);//---
return true;
}
if(vis[i]==0)
if (dfs(i,x,step+1))return true;//---//
}
}
return false;
}
int main()
{
read(n);
for (int i=1; i<=n; i++)
{
scanf("%s",ch[i]+1);
}
for(int i=1; i<=n; i++)
{
if(vis[i])
continue;
if(flag)
break;//---
flag=dfs(i,i,1);//---
}
if(!flag)
printf("-1\n");
}