标签:
不早了,先上个模板,做些题再来分析一下;
强连通Tarjan算法+前向星 模板如下:
const int MAXN=110; const int MAXM=10010; struct edge { int to,next; }; edge E[MAXN]; int head[MAXN],Ecou; int Stack[MAXN],top; int Belong[MAXN],lfcou; int Index; int DFN[MAXN],LOW[MAXN]; bool inStack[MAXN]; void Tarjan(int u) { int v; LOW[u]=DFN[u]=++Index; Stack[top++]=u; inStack[u]=1; for(int i=head[u];i!=-1;i=E[i].next) { v=E[i].to; if(!DFN[v]) { Tarjan(v); if(LOW[u]>LOW[v]) LOW[u]=LOW[v]; } else if(inStack[v]&&LOW[u]>DFN[v]) LOW[u]=DFN[v]; } if(LOW[u]==DFN[u]) { ++lfcou; do { v=Stack[--top]; inStack[v]=0; Belong[v]=lfcou; }while(v!=u) } } void getSCC(int n) { for(int i=1;i<=n;i++) if(!DFN[i]) Tarjan(i); } void add_edge(int u,int v) { E[Ecou].to=v; E[Ecou].next=head[u]; head[u]=Ecou++; } void init(int n) { Ecou=Index=lfcou=top=0; for(int i=1;i<=n;i++) { inStack[i]=DFN[i]=0; head[i]=-1; } }
标签:
原文地址:http://www.cnblogs.com/atmacmer/p/5180818.html