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

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