tarjan 算法求强连通分量

Posted notnight

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tarjan 算法求强连通分量相关的知识,希望对你有一定的参考价值。

技术分享
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1e4+5;
 4 int cmp[N],dfn[N],tot,n,m;// dfn为节点的时间戳
 5 bool vis[N];
 6 stack<int> st;
 7 vector<int> e[N];
 8 void init()
 9 {
10     memset(cmp,0,sizeof(cmp));
11     memset(vis,0,sizeof(vis));
12     memset(dfn,0,sizeof(dfn));
13     for(int i=1;i<=n;i++) e[i].clear();
14     tot=1;
15 }
16 int tarjan(int v,int t)
17 {
18     st.push(v); dfn[v]=t; vis[v]=true;
19     int res=t; //res为后继节点的最小时间戳
20     for(int i:e[v])
21     {
22         if(vis[i]) res=min(res,dfn[i]);
23         else res=min(res,tarjan(i,t+1));
24     }
25     if(res==t)
26     {
27         while(!st.empty())
28         {
29             int cur=st.top(); st.pop();
30             cmp[cur]=tot;
31             if(cur==v) break;
32 
33         }
34         tot++;
35     }
36     return res;
37 }
38 int main()
39 {
40     while(~scanf("%d%d",&n,&m) && (n||m))
41     {
42         init();
43         for(int i=1;i<=m;i++)
44         {
45             int f,t; scanf("%d%d",&f,&t);
46             e[f].push_back(t);
47         }
48         for(int i=1;i<=n;i++) if(!cmp[i]) tarjan(i,1);
49     }
50     return 0;
51 }
View Code

 

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

Tarjan 算法求 LCA / Tarjan 算法求强连通分量

算法Tarjan算法求强连通分量

求强连通分量Tarjan算法

tarjan 算法求强连通分量

poj 2186 tarjan求强连通分量

tarjan算法+缩点:求强连通分量 POJ 2186