`

Tarjan算法模板(求有向图的连通分量)

 
阅读更多

 

#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
#define maxn 500//图的规模
using namespace std;

vector<int> G[maxn];//邻接表存图
int pre[maxn], lowlink[maxn], sccno[maxn], dfs_clock, scc_cnt;
stack<int> S;

void dfs(int u){
       pre[u] = lowlink[u] = ++dfs_clock;
       S.push(u);
       for(int i=0; i < G[u].size(); i++){
              int v = G[u][i];
              if(!pre[v]){
                     dfs(v);
                     lowlink[u] = min(lowlink[u], lowlink[v]);
              }else if(!sccno[v]) {
                     lowlink[u] = min(lowlink[u], pre[v]);
              }
       }
       if(lowlink[u] == pre[u]) {
              scc_cnt ++ ;
              for(;;) {
                     int  x = S.top(); S.pop();
                     sccno[x] = scc_cnt;
                     if(x == u) break;
              }
       }
}

void find_scc(int n){
       dfs_clock = scc_cnt = 0;
       memset(sccno, 0, sizeof(sccno));
       memset(pre, 0, sizeof(pre));
       for(int i = 0; i < n; i++)
              if(!pre[i]) dfs(i);
}
int main()
{
       int T,i;
       scanf("%d",&T);
       while(T--)
       {
              int n,m;
              scanf("%d%d",&n,&m);
              for(i=0;i<m;i++)
              {
                     int a,b;
                     scanf("%d%d",&a,&b);
                     G[a].push_back(b);
              }
              find_scc(n);
              for(i=0;i<n;i++)
              {
                     printf("%d ",sccno[i]);
              }
              printf("\n");
       }
	return 0;
}

 

     图用 邻接表存储

sccno[i]表示  i所在的连通分量数
scc_cnt       表示一共的连通分量数

 

 

 

 

 

分享到:
评论

相关推荐

    求有向图的强连通分量(scc)Tarjan算法.docx

    "有向图的强连通分量(scc)Tarjan算法" Tarjan算法是基于深度优先搜索的算法,用于求解有向图的强连通分量(scc)。强连通分量是指图中每两个顶点之间至少存在一条路径的子图。Tarjan算法的主要思想是通过深度...

    Tarjan 的强连通分量算法的Python实现

    Tarjan 的算法将一个有向(可能是循环的!)图作为输入,并以拓扑顺序返回其强连通分量作为输出 循环依赖 在各种情况下,依赖关系可能是循环的,并且必须同时执行一组相互依赖的操作。同时执行成本高昂的情况并不...

    Tarjan 算法论文 DEPTH-FIRST SEARCH AND LINEAR GRAPH ALGORITHMS.pdf

    论文的摘要部分指出,Tarjan算法利用深度优先搜索技术解决图论问题具有重要价值,并提供了两个例子:一种改进的算法用于查找有向图中的强连通分量;另一种用于查找无向图的双连通分量。算法的空间和时间复杂度被限制...

    Tarjan算法精讲

    Tarjan算法是一种用于查找有向图中强连通分量的高效算法,它基于深度优先搜索(DFS)的思想。在有向图中,如果两个顶点之间存在双向的有向路径,即从一个顶点可以到达另一个顶点,同时另一个顶点也能反向到达第一个...

    Tarjan算法模板

    C++实现Tarjan算法的一个简单模板,求有向图的强连通分量。时间复杂度为O(N+M)。

    tarjan算法

    通过以上分析可以看出,Tarjan算法是一种高效寻找有向图中所有强连通分量的方法。该算法不仅简洁,而且在实际应用中表现出了较高的运行效率。与 Kosaraju 算法相比,Tarjan 算法仅需对原图进行一次 DFS,而无需构建...

    tarjan求割边

    Tarjan算法是图论中的一种常见算法,用于寻找有向图中的割点和割边。割边是指删除该边后,图将被分割成两个或多个连通分量的边。 Tarjan算法可以快速地找到所有的割边。 割边的定义与割点的定义类似。若去掉某边,...

    Tarjan算法[收集].pdf

    《Tarjan算法——高效求解有向图强连通分量》 Tarjan算法是一种用于求解有向图强连通分量的高效算法,它基于深度优先搜索(DFS)策略,由著名计算机科学家Robert Tarjan提出。在有向图中,如果两个顶点之间存在双向...

    C++Tarjan算法实现.zip

    Tarjan算法,全称为Robert Tarjan的强连通分量算法,是图论中的一个经典算法,主要用于找出有向图中的强连通分量。在C++编程中,它能有效地处理复杂的图结构问题,尤其是在分析网络流、最短路径等场景下。本文将深入...

    图论- 图的连通性- Tarjan 求强连通分量.rar

    Tarjan算法是一种求解有向图中强连通分量的有效算法,由Robert Tarjan于1972年提出。该算法基于深度优先搜索(DFS)的基本思想,同时引入了低链接(low link)和访问序列(discovery time)的概念,用于识别强连通...

    Tarjan算法 讲解

    通过以上分析,我们可以看出Tarjan算法是一种高效且直观的方法来寻找有向图中的所有**强连通分量**。该算法利用了DFS的基本思想,并通过巧妙地维护DFN和LOW两个变量来识别出图中的**强连通分量**。此外,Tarjan算法...

    图论- 图的连通性- Tarjan 求双连通分量.rar

    本资源“图论- 图的连通性- Tarjan 求双连通分量.rar”着重讨论了图的连通性以及一种用于求解双连通分量的著名算法——Tarjan算法。 首先,我们理解一下图的连通性。一个无向图是连通的,如果任意两个顶点之间都...

    ACM-ICPC_algorithm_template.pdf

    + 有向图强连通分量 Tarjan 算法(Tarjan 算法+静态邻接表) + 有向图强连通分量 Gabow 算法 + 无向图连通分支(dfs/bfs 邻接阵) + 有向图强连通分支(dfs/bfs 邻接阵)O(n^2) + 有向图最小点基(邻接阵)O(n^2) * ...

    有向图的路径问题实验报告(内附源代码)

    4. **强连通分量**:在有向图中,如果存在从节点u到节点v的路径,同时也存在从节点v到节点u的路径,那么称u和v是强连接的。强连通分量是指图中任意两个节点都是强连接的子图。Kosaraju算法和Tarjan算法常用于检测强...

    Tarjan及2-SAT讲课PPT

    Tarjan算法的基本概念在于,它能够用于求解有向图的强连通分量,即将一个有向图中的强连通分量压缩成单个节点,从而将其转化为有向无环图(DAG)。强连通分量是指在有向图中,任何两个节点之间都可以相互到达的子图...

    有向图缩点:tarjan强连通缩点(模板)

    有向图缩点是图论中的一个重要概念,...通过这个模板,可以方便地在实际问题中应用Tarjan算法解决有向图的强连通分量问题。在使用时,需要根据具体的有向图数据结构和需求,调整输入和输出部分,以适应不同的应用场景。

    图中强连通分量的寻找

    而强连通分量则是有向图中的一个子集,其中的每个顶点都可以通过有向边到达其他任何顶点,同时其他任何顶点也能到达这个子集中的每一个顶点。换句话说,强连通分量是最小的强连通子图。 检测强连通分量通常采用深度...

    有向图的强连通分量

    详细地介绍了如何计算强连通分量,图文并茂地阐述了tarjan算法的流程和原理,两者均有模板。

Global site tag (gtag.js) - Google Analytics