码迷,mamicode.com
首页 > 编程语言 > 详细

tarjan算法——强连通分量

时间:2019-09-10 23:50:51      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:cow   class   gif   none   one   sch   void   poj   spl   

简述:

  用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算法——强连通分量

标签:cow   class   gif   none   one   sch   void   poj   spl   

原文地址:https://www.cnblogs.com/wuliking/p/11503681.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!