1.引言

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

2.算法描述

使用n阶布尔矩阵\(R^{(k)}(0\leq k\leq n)\)来表示有向图中任意一对节点 是否含有路径的信息。因此,可将原问题划分为如下决策阶段:

\[R^{(0)},R^{(1)},\cdots,R^{(k)},\cdots ,R^{(n)}
\]

具体来说,当且仅当从节点i到节点j存在一条有向路径,且该路径上的每一个中间节点的编号都不大于k时,矩阵\(R^{(k)}\)的第i行,第j列的元素\(r_{ij}^{(k)}=1\)。

对于\(R^{(k)}\)的计算我们可以由它的前趋\(R^{(k-1)}\) 计算得到(分级推进计算)。

  • \(R^{(0)}\) ——该矩阵不允许它的路径中包含任何中间顶点,即从该矩阵的任意顶点出发的路径不含有中间顶点,此即邻接矩阵。
  • \(R^{(1)}\) ——允许路径中包含第1个顶点(本例编号1)作为中间顶点。
  • \(R^{(2)}\) ——允许路径中包含前2个顶点(本例编号1、2)作为中间顶点。
  • \(R^{(k)}\) ——允许路径中包含前k个顶点作为中间顶点。
  • \(R^{(n)}\) ——允许路径中包含全部 n 个顶点作为中间顶点。

    所以综上所述我们得到\(R^{(k)}\)的计算方式如下:

\[R^{k}[i,j]\leftarrow R^{k-1}[i,j]+R^{k-1}[i,k]\cdot R^{k-1}[k,j]
\]

3.算法实现

for(int k=0;k<N;k++){
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
t[i][j]=t[i][j]||(t[i][k]&&t[k][j]);//由文中公式可得
}
}
}

算法优化

```
for(int k=0;k

参考资料:

离散数学(第三版),清华大学出版社


WarShall算法的更多相关文章

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

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

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

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

  3. POJ 2253 Frogger(warshall算法)

    题意:湖中有很多石头,两只青蛙分别位于两块石头上.其中一只青蛙要经过一系列的跳跃,先跳到其他石头上,最后跳到另一只青蛙那里.目的是求出所有路径中最大变长的最小值(就是在到达目的地的路径中,找出青蛙需要 ...

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

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

  5. Floyd—Warshall算法

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

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

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

  7. Warshall算法和Floyd算法

    不用说这两位都是冷门算法……毕竟O(n^3)的时间复杂度算法在算法竞赛里基本算是被淘汰了……而且也没有在这个算法上继续衍生出其他的算法… 有兴趣的话:click here.. 话说学离散的时候曾经有个 ...

  8. 算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法

    一.名称 动态规划法应用 二.目的 1.掌握动态规划法的基本思想: 2.学会运用动态规划法解决实际设计应用中碰到的问题. 三.要求 1.基于动态规划法思想解决背包问题(递归或自底向上的实现均可): 2 ...

  9. 最短路径---Dijkstra/Floyd算法

    1.Dijkstra算法基础: 算法过程比prim算法稍微多一点步骤,但思想确实巧妙也是贪心,目的是求某个源点到目的点的最短距离,总的来说dijkstra也就是求某个源点到目的点的最短路,求解的过程也 ...

随机推荐

  1. c# 使用资源文件

    1.新建项目 2.新建资源文件 3. 代码中使用嵌入资源 using System;using System.Collections.Generic;using System.Text;using S ...

  2. 包建强的培训课程(2):Android与设计模式

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  3. css3动画:transition和animation

    概述 之前写过css3 动画与display:none冲突的解决方案,但是最近却发现,使用animation效果比transition好得多,而且不和display:none冲突.下面我把相关新的记录 ...

  4. Oracle merge合并更新函数

    本博客介绍一下Oracle merge合并函数,业务场景:新增数据的时候要先查询数据库是否已经有改数据,有数据就更新数据,没数据才新增数据,这是很常见的业务场景,如果是用Oracle数据库的话,其实直 ...

  5. python中numpy.ndarray.shape的用法

    今天用到了shape,就顺便学习一下,这个shape的作用就是要把矩阵进行行列转换,请看下面的几个例子就明白了: >>> import numpy as np >>> ...

  6. 一文了解Python中的循环(for while break continue 嵌套循环...)

    循环 目标 程序的三大流程 while 循环基本使用 break 和 continue while 循环嵌套 01. 程序的三大流程 在程序开发中,一共有三种流程方式: 顺序 —— 从上向下,顺序执行 ...

  7. th:标签

    https://blog.csdn.net/xxb5502296/article/details/78319898(挺全的) https://blog.csdn.net/qq_43279637/art ...

  8. Python编程Day4——if判断、while循环、for循环

    一.if判断 语法一: if条件: 代码块1 代码块2 代码块3 示例: sex='female' age=18 is_beautiful=True if sex =='female'and age& ...

  9. nginx介绍(一) 简介篇

    Nginx(发音为"engine x")是一款由俄罗斯软件工程师Igor Sysoev年发布以来nginx一直关注于高性能.高并发.低内存的使用,另外还有一些特色的Web服务器功能 ...

  10. [java核心外篇]__Object类与对象类型的转型

    前言 我们在之前的学习中提过很多次了,java是面向对象的,java的基础可以说是建立在类和对象上面的.然后我们又学到了类的继承,发现了在java类库中,类的继承是极为普遍的,一个类继承另一个类,就像 ...