Floyd-Warshall算法是用来求解所有结点对最短路径的知名算法,其还有一个重要的用途就是求解有向图的传递闭包,下面就让我来介绍算法导论中关于有向图闭包计算的有关记载吧。

有向图的传递闭包:我们定义图G的传递闭包为图G* = (V, E*);其中E* ={ (i, j) :如果图G中包含一条从结点i到结点j的路径 }。

  实际计算传递闭包时我们可以给G中的每条边赋予权重1,然后运行Floyd-Warshall算法。如果存在一条从结点i -> j的路径,则有dist[i, j] < n;否则,dist[i, j] = INF。

  还有另外一种类似的办法,该算法复杂度与Floyd-Warshall算法类似,但在实际场景中能够节省时间和空间。该办法以逻辑或操作('||')和逻辑与操作('&&')来替换Floyd-Warshall算法中的min和+操作。

  对于i, j, k = 1, 2, ... n, 我们定义:如果图G中存在一条从结点i到结点j的所有中间结点都取自集合{1, 2, ... k}的路径,则t(i, j, k) = 1;否则为0.我们构建传递闭包G* = (V, E*)的方法为:将边(i, j)置于集合E*当且仅当t(i, j, n)为1。

  下面给出算法导论上的伪代码:

  就我个人理解而言,给出多组二元关系,对这些二元关系进行标号,用如果三个结点之间满足i - > k, k- > j,则根据传递性就得出了i -> j。我们初始化所有的二元关系,然后利用Floyd-Warshall算法就可以找出所有可以间接得到的二元关系。

Floyd-Warshall算法计算有向图的传递闭包的更多相关文章

  1. Floyd—Warshall算法

    我们用DP来求解任意两点间的最短路问题 首先定义状态:d[k][i][k]表示使用顶点1~k,i,j的情况下,i到j的最短路径 (d[0][i][j]表示只使用i和j,因此d[0][i][j] = c ...

  2. 图论之最短路径(1)——Floyd Warshall & Dijkstra算法

    开始图论学习的第二部分:最短路径. 由于知识储备还不充足,暂时不使用邻接表的方法来计算. 最短路径主要分为两部分:多源最短路径和单源最短路径问题 多源最短路径: 介绍最简单的Floyd Warshal ...

  3. Floyd(弗洛伊德)算法(C语言)

    转载:https://blog.csdn.net/qq_35644234/article/details/60875818 Floyd算法的介绍 算法的特点 弗洛伊德算法是解决任意两点间的最短路径的一 ...

  4. Gym 101873D - Pants On Fire - [warshall算法求传递闭包]

    题目链接:http://codeforces.com/gym/101873/problem/D 题意: 给出 $n$ 个事实,表述为 "XXX are worse than YYY" ...

  5. Warshall算法求传递闭包及具体实现

    传递闭包 在数学中,在集合 X 上的二元关系 R 的传递闭包是包含 R 的 X 上的最小的传递关系. 例如,如果 X 是(生或死)人的集合而 R 是关系“为父子”,则 R 的传递闭包是关系“x 是 y ...

  6. WarShall算法

    1.引言 图的连通性问题是图论研究的重要问题之一,在实际中有着广泛的应用.例如在通信网络的联通问题中,运输路线的规划问题等等都涉及图的连通性.因此传递闭包的计算需要一个高效率的算法,一个著名的算法就是 ...

  7. [C++]动态规划系列之Warshall算法

    /** * * @author Zen Johnny * @date 2018年3月31日 下午8:13:09 * */ package freeTest; /* [动态规划系列:Warshall算法 ...

  8. Floyd —Warshall(最短路及其他用法详解)

    一.多元最短路求法 多元都求出来了,单源的肯定也能求. 思想是动态规划的思想:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设Dis(A ...

  9. HDU1181【有向图的传递闭包】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1181 题意很简单. 有用并查集做的.我这里用传递闭包做. 有向图的传递闭包采用Floyd思想,可以判断 ...

随机推荐

  1. 微信小程序中的组件使用2

    需求    上面两个页面是同一个小程序的不同页面,两个页面中都是用到了label,有相似的地方,但是也有不同之处,这个时候,如果我们想要将这些label做出组件,然后复用,有该怎么做呢? 基础组件 首 ...

  2. 廖雪峰Java8JUnit单元测试-2使用JUnit-2异常测试

    1.异常测试 对可能抛出的异常进行测试: 异常本身是方法签名的一部分: * public static int parseInt(String s) throws NumberFormatExcept ...

  3. Linux运维宝典:最常用的150个命令汇总

    一.线上查询及帮助命令(2个) 二.文件和目录操作命令(18个) 三.查看文件及内容处理命令(21个) 四.文件压缩及解压缩命令(4个) 五.信息显示命令(11个) 六.搜索文件命令(4个) 七.用户 ...

  4. http中的filter拦截servlet之后获取body,字符流关闭,无法继续传入控制器

    https://blog.csdn.net/pyxly1314/article/details/51802652

  5. CTO 技能图谱

    岗位职责 建立技术团队文化 规划技术发展路线 落地产品研发成果 宣传公司技术品牌 吸引优秀技术人才 基本素质 正直诚实的道德修养 谦虚谨慎的工作态度 随机应变的处事风格 统领全局的战略思维 硬技能 技 ...

  6. Git全面应用

    Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有事务. Git易于学习,占地面积小,具有闪电般快速的性能. 它超越了Subversion,CVS,Perforce和C ...

  7. C 语言 变量的赋值和初始化

    根据我所了解和理解: int i 当定义一个这样的变量的时候,计算机将在内存中给变量分配空间,此时 i 的值为,此处空间内原来是什么现在还是什么,相当于打开一个房间,你没有清扫它你就住进去了. 多变量 ...

  8. python-day12 MySQL、sqlalchemy

    @第一节上周回顾没看 @博客day11 https://www.cnblogs.com/alex3714/articles/5950372.html @InnoDB,是MySQL的数据库引擎之一 @S ...

  9. (6.2)vim文本编辑器

    vi / vim是Unix / Linux上最常用的文本编辑器而且功能非常强大. vim文本编辑器只有命令,没有菜单.

  10. 多个Gesture响应原理

    默认情况下,一个响应链上只能响应一个Gesture,不过每个Gesture都可以设置一个delegate,当某个gesture的代理方法shouldRecognizeSimultaneouslyWit ...