//即求不为1的最小的强连通分量
#include<cstdio>
#include<iostream>
using namespace std;
const int maxn = 200050;
struct node{
int hou,ne;
}g[maxn];
int stack[maxn],instack[maxn],dfn[maxn],low[maxn];
int top = 0,bcnt,ans = 0x7fffffff,index,tmp;
int sum[maxn],f[maxn],haoyu[maxn];
int mark;
void Tarjan(int u){
stack[top++] = u;
instack[u] = 1;
dfn[u] = low[u] = ++index;
for(int i = f[u];i != 0;i = g[i].ne){
int v = g[i].hou;
if(!dfn[v]){
Tarjan(v);
low[u] = min(low[v],low[u]);
}
else if(instack[v]){
low[u] = min(low[u],dfn[v]);
}
}
if(dfn[u] == low[u]){
bcnt++;
int v;
while(u != v){
v = stack[--top];
haoyu[v] = bcnt;
instack[v] = 0;
sum[bcnt]++;
}
}
}
void in(int x,int y){
tmp++;
g[tmp].hou = y;
g[tmp].ne = f[x];
f[x] = tmp;
}
int main(){
int n,m,a,b,t;
cin>>n;
for(int i = 1;i <= n;i++){
cin>>b;
in(i,b);
}
for(int i = 1;i <= n;i++){
if(!dfn[i]) Tarjan(i);
}
for(int i = 1;i <= n;i++){
if(sum[haoyu[i]] < ans && sum[haoyu[i]] > 1){
ans = sum[haoyu[i]];
}
}
cout<<ans<<endl;
return 0;
}
CODEVS 4511 信息传递
最新推荐文章于 2017-07-09 15:22:11 发布