const int MAXN = 10010; //点数 const int MAXM = 100100; //边数 struct edge { int to,next; } edge[MAXM]; int head[MAXN],tot; int Low[MAXN],DFN[MAXN],Stack[MAXN]; int Belong[MAXN]; //标记当前点属于第几个强连通分量 int index,top; int scc; //强连通分量的个数 bool instack[MAXN]; int num[MAXN]; //各个强连通分量包含点的个数 void addedge(int u,int v) { edge[tot].to=v; edge[tot].next=head[u]; head[u]=tot++; } void Tarjan(int u) { int v; Low[u]=DFN[u]=++index; //访问时间 Stack[top++]=u; instack[u]=true; for(int i=head[u]; ~i; i=edge[i].next) { v=edge[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 Low[u]=DFN[v]; } if(Low[u]==DFN[u]) { scc++; do { v=Stack[--top]; instack[v]=false; //出栈 Belong[v]=scc; num[scc]++; } while(v!=u); } } void solve(int n) { memset(DFN,0,sizeof(DFN)); memset(instack,0,sizeof(instack)); memset(num,0,sizeof(num)); index=scc=top=0; for(int i=1; i<=n; ++i) { if(!DFN[i]) Tarjan(i); } } void init() { tot=0; memset(head,-1,sizeof(head)); }
- 版权声明:本文基于《知识共享署名-相同方式共享 3.0 中国大陆许可协议》发布,转载请遵循本协议
- 文章链接:http://www.carlstedt.cn/archives/642 (转载时请注明本文出处及文章链接)
相关文章
- 本文无相关文章
- 本文无相关文章
发表评论
快来吐槽一下吧!