题意:在一个图中求一个长度大于等于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; }