戏game

来源:互联网 发布:广电网络建阳分公司 编辑:程序博客网 时间:2024/05/02 07:20

这里写图片描述
这里写图片描述

按照正解的做法,我只得了80。

首先我们要明确这是一张竞赛图。
然后有一个点,在竞赛涂上如果存在环,那么就一定有三元的环。


这里写图片描述
这样找到的第一个三元环是1->3->4->1

观察一下图,看一下代码。嘻嘻
shipinjiangjie

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<vector>#include<algorithm> #define N 5009using 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\n");    return 0;}