CODEVS 4511 信息传递

来源:互联网 发布:西门子ug软件侵权 编辑:程序博客网 时间:2024/05/19 19:59
//即求不为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;}
0 0
原创粉丝点击