tarjan算法——强连通分量
Posted wuliking
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tarjan算法——强连通分量相关的知识,希望对你有一定的参考价值。
简述:
用dfn作为时间戳,对图进行dfs并对路径上的点入栈,求出每个点可以访问到的最早的时间戳,此时栈中从这个点开始的点便为一个强连通分量。
模板:
1 void tarjan(int x,int lay,int &sccnum) 2 low[x]=lay; 3 dfn[x]=lay; 4 vis[x]=1; 5 sta[++cnt]=x; 6 for(int i=head[x];~i;i=e[i].net) 7 int v=e[i].v; 8 if(!vis[v]) tarjan(v,++lay,sccnum); 9 if(vis[v]==1) low[x]=min(low[x],low[v]); 10 11 if(dfn[x]==low[x]) 12 ++sccnum; 13 do 14 low[sta[cnt]]=sccnum; 15 vis[sta[cnt]]=2; 16 while(sta[cnt--]!=x); 17 18 19 int main() 20 21 memset(head,-1,sizeof(head)); 22 memset(vis,0,sizeof(vis)); 23 int lay=1,sccnum=0; 24 for(int i=1;i<=n;i++) 25 if(!vis[i]) 26 tarjan(i,lay,sccnum); 27 return 0; 28
例题:
poj2186 Popular Cows
p2746 Network of Schools
以上是关于tarjan算法——强连通分量的主要内容,如果未能解决你的问题,请参考以下文章