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 
View Code

 

例题:

  poj2186  Popular Cows

  p2746 Network of Schools

以上是关于tarjan算法——强连通分量的主要内容,如果未能解决你的问题,请参考以下文章

有向图强连通分量的Tarjan算法

tarjan算法(强连通分量 + 强连通分量缩点 + 桥 + 割点 + LCA)

图论-强连通分量-Tarjan算法

有向图强连通分量的Tarjan算法——转自BYVoid

有向图强连通分量的Tarjan算法

强连通分量——tarjan算法