contest: Codeforces Round #161 (Div. 2), problem: (D) Cycle in Graph 图论

题意:在一个图中求一个长度大于等于k的回路

做法:DFS的同时记录每个点的深度,然后在再看任何一个与他相连,且已经DFS过的点,看他们之间的深度差是否不小于K,然后记录符合条件的情况

#include <iostream>
#include <cstring>
#include <cstdio>
#include <utility>
#define LMT 100003
using namespace std;
int cnt,k,lev[LMT],all,vis[LMT],next[LMT],top,ans[LMT],stack[LMT];
struct line
{
    int u,v,next;
}e[LMT<<1];
void insert(int u,int v)
{
    e[all].u=u;
    e[all].v=v;
    e[all].next=next[u];
    next[u]=all++;
}
int dfs(int u)
{
    vis[u]=1;
    stack[top++]=u;
    lev[u]=top;
    for(int x=next[u];x!=-1;x=e[x].next)
    {
       if(vis[e[x].v]&&lev[u]-lev[e[x].v]>=k)
       {
           for(int i=lev[e[x].v]-1;i<lev[u];i++)
           ans[cnt++]=stack[i];
           return 1;
       }
       if(0==vis[e[x].v])
      {
        if(dfs(e[x].v))return 1;
      }
    }
        top--;
    return 0;
}
int main()
{
    int N,M,u,v;
    cin>>N>>M>>k;
    memset(next,-1,sizeof(next));
    while(M--)
    {
        scanf("%d%d",&u,&v);
        insert(u,v);
        insert(v,u);
    }
    for(int i=1;i<=N;i++)
    if(0==vis[i])
    {
        cnt=0;
        if(dfs(i))break;
    }
        printf("%d\n",cnt);
    for(int i=0;i<cnt;i++)
    printf("%d ",ans[i]);
    return 0;
}


你可能感兴趣的:(contest: Codeforces Round #161 (Div. 2), problem: (D) Cycle in Graph 图论)