信息传递

原先t了很长时间,今天复习了下tarjan,打了一遍,自认为自己的tarjan模板简洁 这道题只有基环树,所以tarjan就可以了

#include<iostream>
#include<stack>
#include<cstdio>
using namespace std;
int n,cnt=-1,ans=1<<29,time;
stack<int>s;
int head[400010],Next[400010],to[400010],dfn[200010],low[200010];
inline int max(int x,int y)
{
    return x>y?x:y;
}
inline int min(int x,int y)
{
    return x<y?x:y;
}
inline void insert(int u,int v)
{
    Next[++cnt]=head[u];
    head[u]=cnt;
    to[cnt]=v;
}
void tarjan(int u)
{
    dfn[u]=low[u]=++time;
    s.push(u);
    for(int i=head[u];i;i=Next[i])
    {
        int v=to[i];
        if(!dfn[v])
        {
            tarjan(v);
        }
        low[u]=min(low[u],low[v]);
    }
    if(dfn[u]==low[u])
    {
        int MAX=0;
        while(s.top()!=u)
        {
            s.pop();
            MAX++;
        }
        MAX++;
        s.pop();
        if(MAX!=1) ans=min(MAX,ans);
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int u;scanf("%d",&u);
        insert(i,u);
    }
    for(int i=1;i<=n;i++)
    {
        if(!dfn[i]) tarjan(i);
    }
    printf("%d
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/19992147orz/p/6049140.html