美文网首页
强连通分量算法

强连通分量算法

作者: nnznk | 来源:发表于2017-11-24 18:11 被阅读0次

计算机系DSA第二次Programming Assignment中第三题涉及到这个算法

【问题描述】

  • 一个有向图中,有一些节点上有5角钱硬币,求问从指定的a顶点走到指定的b顶点,最多总共可以拿到多少硬币

【问题分析】

  1. 一个有向图可以分解为强连通分量(Strongly Connected Component),将每个强连通分量缩成一点之后会得到一张新图,是一个有向无环图。强连通分量中的每个点对两两之间有双向可达的路径。

  2. 故此题等效于强连通分量缩点之后,包含起点的分量到包含终点的分量之间,规划一条可以获得硬币最多的路径。

【强连通量分解算法】
一、Kosaraju 算法

(一)算法内容

主要包含两次DFS

  1. 第一次DFS,称作Visit遍历。从起点开始DFS,每DFS结束一个点,就将它push进一个stack中。于是在栈中,一定有性质:如果DFS树中有从a到达b的通路,那么a一定比b更靠近栈顶(压入栈时是tree_1 tree_2 tree_3 ... tree_n root的后续遍历顺序,root一定在栈顶)。

  2. 从栈顶做第二次DFS,称作Assign遍历。这次遍历顾名思义是给每个节点指派一个代表其所属强连通分量的root。
    具体的,Assign(u, root)可以描述如下:

/// Assign(u, root)
if(u has been assigned root) return;
u.root = root;
for( v if exists_edge(v, u) ) {
    // exists_edge(v, u) 保证了v可以到达u
    // 此时必然有u可以到达v,因为:
    // 假设u不可以到达点v,那么按照Visit操作,必然先到达v,后到达u. 所以会先访问结束u,后访问结束v,这样在栈中应该v更靠近顶部,矛盾.
    Assign(v, root); // 既然u, v可以互相到达,那么都属于root下的强连通分量
}

进行计算时,只需要

for(u in stack) {
    Assign(u, u);
}

即可以给每个顶点标记出所属的强连通分量

(二)Kosaraju算法的拓扑序性质

  • 从缩点后的有向无环图上看,报告强连通分量的顺序就是拓扑排序“零入度算法”给出的图的拓扑排序序列的顺序。

(三)算法复杂度:
如果采用邻接表表示图,那么对图进行两次DFS遍历的复杂度是:



其中需要在第一次遍历时建立原图的反图——即图上所有边反向的图

二、Tarjan 算法

// To be updated

参考资料:
【1】 强连通分量:https://en.wikipedia.org/wiki/Strongly_connected_component
【2】 Kosaraju 算法:https://en.wikipedia.org/wiki/Kosaraju%27s_algorithm

相关文章

  • Kosaraju算法详解

    Kosaraju算法是干什么的? Kosaraju算法可以计算出一个有向图的强连通分量 什么是强连通分量? 在一个...

  • 强连通分量和Kosaraju算法

    内容概要: 基于深度优先后序遍历的DAG图拓扑排序 强连通分量 求解强连通分量Kosaraju算法 拓扑排序的另一...

  • 强连通分量算法

    计算机系DSA第二次Programming Assignment中第三题涉及到这个算法 【问题描述】 一个有向图中...

  • 数据结构与算法--图论之寻找连通分量、强连通分量

    数据结构与算法--图论之寻找连通分量、强连通分量 寻找无向图的连通分量 使用深度优先搜索可以很简单地找出一幅图的所...

  • tarjan

    tarjan:寻找出度为0的强连通分量,并求出该强连通分量中有多少个点。 sig表示的是强连通分量的个数其中col...

  • Tarjan算法求强连通分量

    首先先要明确概念:强连通图意为在该图中任意两点间都能够相互到达,而强连通分量即为一个强连通图中的子图,如图中{1,...

  • 常用图算法实现--Spark

    使用Spark实现PageRank,强连通分量等图算法 PageRank 数据准备 边: 网页: 将这两个文件放入...

  • 强连通分量

    强连通分量 相关概念 强连通:在有向图G中,如果两个顶点u,v间存在一条u到v的路径且也存在 一条v到u的路径,则...

  • tarjan

    tarjan寻找出度为0的强连通分量,从小到大输出此强连通分量中的点 poj 2553 The Bottom of...

  • tarjan-寻找图中有多少个强连通分量

    tarjan寻找图中有多少个强连通分量 hdu 1269 迷宫城堡判断图否是属于一个强连通分量

网友评论

      本文标题:强连通分量算法

      本文链接:https://www.haomeiwen.com/subject/bjdfbxtx.html