按照正解的做法,我只得了80。
首先我们要明确这是一张竞赛图。
然后有一个点,在竞赛涂上如果存在环,那么就一定有三元的环。
这样找到的第一个三元环是1->3->4->1
观察一下图,看一下代码。嘻嘻
shipinjiangjie
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<algorithm>
#define N 5009
using namespace std;
int st[N],top,cst[N],pos[N],map[N][N];
int vis[N],len,n;
char s[N];
bool dfs(int x)
{
vis[x]=1,st[++top]=x,pos[x]=top;
for(int i=1;i<=n;i++)
if(map[x][i])
{
if(vis[i]==1)
{
len=top-pos[i]+1;
for(int j=0;j<len;j++) cst[j+1]=st[pos[i]+j];
return true;
}
else if(vis[i]==0)
{
bool found=dfs(i);
if(found) return true;
}
}
top--;vis[x]=2;
return false;
}
void answer()
{
for(int i=2;i<len;i++)
if(map[cst[i+1]][cst[1]]){
printf("%d %d %d",cst[1],cst[i],cst[i+1]);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",s);
for(int j=0;j<strlen(s);j++)
map[i][j+1]=(s[j]=='1');
}
for(int i=1;i<=n;i++)
{
if(!vis[i]){
bool found=dfs(i);
if(found)
{
answer();
return 0;
}
}
}
printf("-1
");
return 0;
}