#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算法" Tarjan算法是基于深度优先搜索的算法,用于求解有向图的强连通分量(scc)。强连通分量是指图中每两个顶点之间至少存在一条路径的子图。Tarjan算法的主要思想是通过深度...
Tarjan 的算法将一个有向(可能是循环的!)图作为输入,并以拓扑顺序返回其强连通分量作为输出 循环依赖 在各种情况下,依赖关系可能是循环的,并且必须同时执行一组相互依赖的操作。同时执行成本高昂的情况并不...
论文的摘要部分指出,Tarjan算法利用深度优先搜索技术解决图论问题具有重要价值,并提供了两个例子:一种改进的算法用于查找有向图中的强连通分量;另一种用于查找无向图的双连通分量。算法的空间和时间复杂度被限制...
Tarjan算法是一种用于查找有向图中强连通分量的高效算法,它基于深度优先搜索(DFS)的思想。在有向图中,如果两个顶点之间存在双向的有向路径,即从一个顶点可以到达另一个顶点,同时另一个顶点也能反向到达第一个...
C++实现Tarjan算法的一个简单模板,求有向图的强连通分量。时间复杂度为O(N+M)。
通过以上分析可以看出,Tarjan算法是一种高效寻找有向图中所有强连通分量的方法。该算法不仅简洁,而且在实际应用中表现出了较高的运行效率。与 Kosaraju 算法相比,Tarjan 算法仅需对原图进行一次 DFS,而无需构建...
Tarjan算法是图论中的一种常见算法,用于寻找有向图中的割点和割边。割边是指删除该边后,图将被分割成两个或多个连通分量的边。 Tarjan算法可以快速地找到所有的割边。 割边的定义与割点的定义类似。若去掉某边,...
《Tarjan算法——高效求解有向图强连通分量》 Tarjan算法是一种用于求解有向图强连通分量的高效算法,它基于深度优先搜索(DFS)策略,由著名计算机科学家Robert Tarjan提出。在有向图中,如果两个顶点之间存在双向...
Tarjan算法,全称为Robert Tarjan的强连通分量算法,是图论中的一个经典算法,主要用于找出有向图中的强连通分量。在C++编程中,它能有效地处理复杂的图结构问题,尤其是在分析网络流、最短路径等场景下。本文将深入...
Tarjan算法是一种求解有向图中强连通分量的有效算法,由Robert Tarjan于1972年提出。该算法基于深度优先搜索(DFS)的基本思想,同时引入了低链接(low link)和访问序列(discovery time)的概念,用于识别强连通...
通过以上分析,我们可以看出Tarjan算法是一种高效且直观的方法来寻找有向图中的所有**强连通分量**。该算法利用了DFS的基本思想,并通过巧妙地维护DFN和LOW两个变量来识别出图中的**强连通分量**。此外,Tarjan算法...
本资源“图论- 图的连通性- Tarjan 求双连通分量.rar”着重讨论了图的连通性以及一种用于求解双连通分量的著名算法——Tarjan算法。 首先,我们理解一下图的连通性。一个无向图是连通的,如果任意两个顶点之间都...
+ 有向图强连通分量 Tarjan 算法(Tarjan 算法+静态邻接表) + 有向图强连通分量 Gabow 算法 + 无向图连通分支(dfs/bfs 邻接阵) + 有向图强连通分支(dfs/bfs 邻接阵)O(n^2) + 有向图最小点基(邻接阵)O(n^2) * ...
4. **强连通分量**:在有向图中,如果存在从节点u到节点v的路径,同时也存在从节点v到节点u的路径,那么称u和v是强连接的。强连通分量是指图中任意两个节点都是强连接的子图。Kosaraju算法和Tarjan算法常用于检测强...
Tarjan算法的基本概念在于,它能够用于求解有向图的强连通分量,即将一个有向图中的强连通分量压缩成单个节点,从而将其转化为有向无环图(DAG)。强连通分量是指在有向图中,任何两个节点之间都可以相互到达的子图...
有向图缩点是图论中的一个重要概念,...通过这个模板,可以方便地在实际问题中应用Tarjan算法解决有向图的强连通分量问题。在使用时,需要根据具体的有向图数据结构和需求,调整输入和输出部分,以适应不同的应用场景。
而强连通分量则是有向图中的一个子集,其中的每个顶点都可以通过有向边到达其他任何顶点,同时其他任何顶点也能到达这个子集中的每一个顶点。换句话说,强连通分量是最小的强连通子图。 检测强连通分量通常采用深度...
详细地介绍了如何计算强连通分量,图文并茂地阐述了tarjan算法的流程和原理,两者均有模板。