Tarjan-SCC-NOIP2015message

This article is made by Jason-Cow.
Welcome to reprint.
But please post the writer's address.

http://www.cnblogs.com/JasonCow/

连临街表都不用,每个节点的出度为1,数组搞定访问

#include <cstdio>
#include <algorithm>
using namespace std;
#define N 200010
int GI(){
  int x=0,c=getchar(),f=0;
  while(c<'0'||c>'9'){if(c=='-')f=1;c=getchar();}
  while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
  return f?-x:x;
}
int dfn[N],low[N],s[N],in[N],idx,top,ans=1<<30,to[N];
void tarjan(int u){
    dfn[u]=low[u]=++idx;
    s[++top]=u,in[u]=1;
    int v=to[u];
    if(!dfn[v])tarjan(v),low[u]=min(low[u],low[v]);
    else if(in[v])       low[u]=min(low[u],dfn[v]);
    if(low[u]==dfn[u]){
        int sz=0;
        do++sz,in[top]=0;
        while(s[top--]!=u);
        if(sz>1)ans=min(ans,sz);
    }
}
int main(){
    int n=GI(),u,v;
    for(v=1;v<=n;v++)to[v]=GI();
    for(u=1;u<=n;u++)tarjan(u);
    return printf("%d",ans),0;
}



posted @ 2017-05-05 19:07  墨鳌  阅读(228)  评论(0编辑  收藏  举报