寻找最小环
#include <cstdio> #include <cstring> #include <iostream> using namespace std; const int MAXN=200000+10; int vis[MAXN],ru[MAXN],vi=0,N,lev[MAXN],fa[MAXN]; int ans=1<<30; void dfs(int x,int dep){ vis[x]=vi; lev[x]=dep; int next=fa[x]; if(!vis[next]) dfs(next,dep+1); else if(vis[next]!=vi) return; else{ ans=min(ans,dep-lev[next]+1); return; } } int main(){ scanf("%d",&N); for(int i=1;i<=N;i++){ scanf("%d",&fa[i]); ru[fa[i]]++; } for(int i=1;i<=N;i++){ if(ru[fa[i]]==0) continue; if(!vis[i]){ vi++; dfs(i,1); } } printf("%d\n",ans); return 0; }
vis[i]表示i属于哪个图的连通分量,0表示没有访问过
lev[i]表示在当前连通分量中第几个访问到i的
如果vis[x]==0 继续dfs
否则 如果访问到了上一个联通分量的内容 return
否则 即访问到的本连通分量中已经访问的点,出现环,则用这个环的长度dep-lev[next]+1更新ans