离散数学中Warshall算法简析

最近学了离散数学的图论,突然感觉离散数学的作用十分强大,相信学好离散数学中的算法,编程的魅力也不言而喻。闲话不多说,这篇博客中记录的是Warshall算法的简单解析及C++代码实现。
问题引出:在一个图结构中,常常需要找两个节点之间有没有一条通路(通路长任意),也就是任意两点之间的可达情况,我们很自然会联想到用邻接矩阵来求可达矩阵,从而得出两点之间的可达情况。如:

在这个图中,可以写出其邻接矩阵为:
0 1 1 1
1 0 0 0
1 0 0 1
1 0 1 0
记为矩阵A。那么很明显在图中,V2与V1存在直接通路(即长是1),V1与V4之间也有直接通路,但是V2与V4之间没有长度是1的通路,但是存在边长是2的通路,然而这在矩阵A中没有相应的体现,因为矩阵元素M(2,4) == 0,于是我们找任意图中一点Vk,只要满足V(2k)乘以V(k4)!= 0[注意:括号中指的是下标],则证明V2可以借助Vk(此图中指的是V1)与V4连通。
以此类推,当想得到任意一点与其他各点通路是2的连接的时候(这里指的是Vi,Vj两点)就可以逐个计算满足:V(ik)乘以V(kj)!= 0的,而V(ik)乘以V(kj)正好是求矩阵A乘以矩阵A的过程,所以矩阵A的平方就可以反应出通过边长为2图中各点之件的可达情况,以此类推,A的3次方、A的4次方……,分别表示了边长是3、边长是4……的可达情况,现在把所有可能长度的通路可达情况加起来(即A1方 + A2方 + A3方 +……),就可以得到近似可达矩阵。
为什么这里说是近似的可达矩阵?因为一个复杂的图中(如互联网模型),通路的长度成千上百都可能,那到底应该加到A的几次方才算有保证呢?很明显,这个算法存在局限性,对于简单的图还凑合,复杂的图就没有全面的保障了。Warshall算法就是为了求一个可靠的可达矩阵。
算法的自己的语言描述:依次遍历邻接矩阵中的所有元素(M[i,j]),比如按照先列后行进行,如果M[i,j] != 0,那么就把i行加到第j行上。
算法的代码描述:

#include <iostream>
using namespace std;
#define COLUMNS 4
#define ROWS 4
void Warshall(int nearArra[ROWS][COLUMNS]);
int main()
{//定义邻接矩阵//此处手动输入图的矩阵表示数据int nearArra[4][4] = { { 1, 1, 0, 0 },{ 0, 0, 1, 0 },{ 0, 1, 0, 0 },{ 0, 1, 0, 0 } };Warshall(nearArra);//输出...for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if (nearArra[i][j] != 0) {cout << 1 << " ";}else {cout << 0 << " ";}}cout << endl;}system("pause");return 0;
}void Warshall(int nearArra[ROWS][COLUMNS]) {//Warshall算法求运用邻接矩阵求图中所有可能的通路(即可达矩阵)//参数 : 图的邻接矩阵for (int i = 0; i < COLUMNS; i++) {for (int j = 0; j < ROWS; j++) {if (0 != nearArra[j][i]) {//若此位置是1,此位置对应的列序号的行(即i)加到当前位置的行(即j)上for (int k = 0; k < COLUMNS; k++) {nearArra[j][k] += nearArra[i][k];}}}}}

还是代码更容易理解些,就是首先运用于二重循环做矩阵的遍历,然后如果满足条件就开始执行I行加到j行的操作,最终在主函数中输出。(注意这里是给定一个矩阵)代码输入
。经过算法处理后矩阵是:

当然这只是单纯的方法,他有许多其他的应用,后续研究时会继续更新,有错误和疑问及时讨论,希望大家支持!最后附上一个不错的关文章:
Warshall算法的C语言实现

离散数学中Warshall算法简析相关推荐

  1. STL中sort算法简析

    STL里sort算法简析 文章目录 STL里sort算法简析 一.引入 二.正解 三.源码 **`sort的源码`**: **`其中,__introsort_loop便是内省式排序:`** 插入排序 ...

  2. 今晚直播 | 强化学习在比赛和自动机器学习中的应用简析

    「AI Drive」是由 PaperWeekly 和 biendata 共同发起的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和 ...

  3. pythonimportre_python中re模块简析

    python中re模块简析 发布时间:2020-05-20 20:01:47 来源:51CTO 阅读:383 re的分组功能 python的re模块有一个分组功能.所谓的分组就是去已经匹配到的内容里面 ...

  4. PHP+新浪微博开放平台+新浪云平台(SAE)开发微博应用——PHP SDK中Demo程序简析

    PHP+新浪微博开放平台+新浪云平台(SAE) --新浪微博应用开发的一个解决方案 一.PHP+新浪微博开放平台+新浪云平台(SAE)方案的基础 二.建立微博应用的过程 三.PHP SDK中Demo程 ...

  5. 离散数学 传递闭包 Warshall算法

    老师布置一个作业,要写Warshall算法课后,这里给写出来了. 这个算法本身很简单,倒是学习了一下参数为二维数组的传递方法,正确代码如下: /* Warshall算法 */ #include < ...

  6. [scRNA-seq]单细胞转录因子分析——SCENIC算法简析

    转录因子(transcription factors, TFs)是直接作用于转录组上,调控DNA转录的蛋白质.它通过与DNA特定区域结合,促进(activator)或阻止(repressor)DNA的 ...

  7. 基于python3.7 numpy scipy matplotlib sklearn的机器学习笔记5—监督学习之KNN、DT、NB算法简析

    1.KNN :通过计算待分类数据点,与 已有数据集中的所点距离.取距离最小的前 K个点,根据"少数服从 多数"的原则,将这个据点划分为出现次数最多的那个类别. 在sklearnsk ...

  8. 完美洗牌算法简析与代码实现

    题目需求 数组[a1,a2,a3,a4,b1,b2,b3,b4],洗牌后变成[b1,a1,b2,a2,b3,a3,b4,a4]. 不得使用额外的空间,即空间复杂度要求为O(1).因为如果用线性空间,直 ...

  9. TF-IDF的Matlab程序,TF-IDF算法简析 - osc_sjg81se7的个人空间 - OSCHINA - 中文开源技术交流社区...

    TF-IDF算法可用来提取文档的关键词,关键词在文本聚类.文本分类.文献检索.自动文摘等方面有着重要应用. 算法原理 TF:Term Frequency,词频 IDF:Inverse Document ...

最新文章

  1. 一个算法同时解决两大CV任务,让目标检测和实例分割互相帮助,地平线实习生论文被AAAI 2020收录...
  2. 【快乐水题】747. 至少是其他数字两倍的最大数
  3. Nginx之升级和构建后添加新的模块
  4. js 正则表达式判断价格
  5. 递归和对面对象编程初步
  6. 软件设计原则(一) 单一职责原则
  7. SpringBoot配置redis
  8. java json-rpc_JSON-RPC(jsonrpc4j)使用demo
  9. CMD 命令 文件操作
  10. 使用最新的跨平台框架Electron 实现 STM32 MCU 嵌入式系统的序列号烧写器上位机开发
  11. 【Python数据分析-8】:Numpy常用操作-arange函数、linspace函数与运算
  12. win10怎样将桌面上回收站快捷键图标隐藏或显示
  13. Windows桌面共享中一些常见的抓屏技术
  14. 14个创意lut电影大片级别调色预设
  15. 最短路径-弗洛伊德算法的java实现
  16. oracle 分组统计效率,Oracle 分组求和函数(rollup、cube、grouping sets)
  17. 编译问题追踪 :高通驱动移植 <utils/Log.h>问题
  18. windows10应用程序需要设置管理员权限自启动
  19. CSP 202112-1 序列查询 python
  20. EDK2之debug

热门文章

  1. (十一:2020.08.28)CVPR 2017 追踪之论文纲要(译)
  2. 【Vue项目复习笔记】详情页的展示
  3. 建行浙江分行总部【等。。。】
  4. total uninstall 7(卸载清除工具) v7.00
  5. 有一种爱,我们不能称之为爱情
  6. B 吃雪糕(科林明伦杯)
  7. 解决mysql sum求和返回null问题或IFNULL应用
  8. 获取OneDrive容量5T及Office365
  9. Python实现对中文文本分句
  10. 带你刷笔试关的小怪|详解指针习题和面试题【C语言/指针/进阶】