题目链接:http://codeforces.com/problemset/problem/117/C
题目大意:有没有三个点的回路
思路:按行判断,DFS即可
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <iomanip>
using namespace std;
//#pragma comment(linker, "/STACK:102400000,102400000")
#define maxn 5005
#define MOD 1000000007
#define mem(a , b) memset(a , b , sizeof(a))
#define LL long long
#define ULL unsigned long long
#define FOR(i , n) for(int i = 1 ; i<= n ; i ++)
typedef pair<int , int> pii;
const long long INF= 0x3fffffff;
int n , flag;
int a , b , c;
char arr[maxn][maxn];
int vis[maxn];
void dfs(int u , int v)
{
if(a && b && c) return;
vis[u] = 1;
for(int i = 0 ; i < n &&(!a ||!b || !c); i ++)
{
if(arr[u][i] == '1' )
{
if(v != -1 && arr[i][v] == '1')
{
a = v + 1 , b = u + 1 , c = i + 1;
return ;
}
if(!vis[i]) dfs(i , u);
}
}
}
int main()
{
while(scanf("%d" , &n) != EOF)
{
mem(vis , 0);
for(int i = 0 ; i < n; i ++)
{
scanf("%s" , arr[i]);
}
flag = 0;
a = b = c = 0;
for(int i = 0 ; i < n ; i ++)
{
if(!vis[i])
{
dfs(i , -1);
}
}
if(!a) printf("-1\n");
else printf("%d %d %d\n" , a , b , c);
}
return 0;
}