1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| const int INF=0x3f3f3f3f; const int MAX=200000+10; int Low[MAX],DFN[MAX],Stack[MAX],Belong[MAX]; int n,x; int ind,top; int scc; bool InStack[MAX]; int num[MAX]; vector <int> e[MAX]; void tarjan(int u,int fa){ int v; Low[u]=DFN[u]=++ind; Stack[top++]=u; InStack[u]=true; int size=e[u].size(); for(int i=0;i<size;i++){ v=e[u][i]; if(v==fa) continue; if(!DFN[v]){ tarjan(v,u); Low[u]=min(Low[u],Low[v]); }else if(InStack[v]){ Low[u]=min(Low[u],DFN[v]); } } if(Low[u]==DFN[u]){ scc++; do{ v=Stack[--top]; InStack[v]=false; Belong[v]=scc; num[scc]++; }while(v!=u); } } void solve(int n){ memset(DFN,0,sizeof(DFN)); memset(InStack,false,sizeof(InStack)); memset(num,0,sizeof(num)); ind=scc=top=0; for(int i=1;i<=n;i++) if(!DFN[i]) tarjan(i,-1); } int main(){ freopen("in","r",stdin); sf(n); fi(i,1,n+1){ sf(x); e[i].push_back(x); e[x].push_back(i); } solve(n); int _min=INF; fi(i,1,scc+1){ if(num[i]!=1 && _min>num[i]) _min=num[i]; } pf(_min); return 0; }
|