http://uoj.ac/problem/146
题解:强连通分量 tarjan模板题。同时试了一下codeblock
#include<bits/stdc++.h> using namespace std; const int maxn=2e5+5; vector<int> E[maxn]; int dfn[maxn],low[maxn],tot,n,ans=maxn,vis[maxn]; stack<int> S; void tarjan(int x){ low[x]=dfn[x]=++tot; S.push(x);vis[x]=1; for(int i=0;i<E[x].size();i++){ int v=E[x][i]; if(!dfn[v]){ tarjan(v); low[x]=min(low[x],low[v]); }else if(vis[x]){ low[x]=min(low[x],dfn[v]); } } if(low[x]==dfn[x]){ int cnt=0; while(1){ int now=S.top(); S.pop(); vis[x]=0; cnt++; if(now==x)break; } if(cnt>1)ans=min(ans,cnt); } } int main(){ cin>>n; for(int i=1;i<=n;i++){ int x; scanf("%d",&x); E[i].push_back(x); } for(int i=1;i<=n;i++){ if(!dfn[i])tarjan(i); } cout<<ans<<endl; }