WarShall算法求传递闭包(可达矩阵)

这篇具有很好参考价值的文章主要介绍了WarShall算法求传递闭包(可达矩阵)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


最近在复习离散数学,顺便记录记录自己对warshall算法的理解。

1、传递闭包(可达矩阵)

传递闭包是有向图的一个重要性质,它指的是在有向图中从任意一个节点出发,可以到达的所有节点的集合。在某些应用中,需要求解给定有向图的传递闭包,以便更好地分析和理解图的结构和性质。

2、WarShall算法

步骤如下:

(1)构造邻接矩阵

根据有向图的边集构造一个邻接矩阵A,其中矩阵的每个元素表示一条边的权重或者是否存在边。

(2)初始化传递闭包矩阵

构造一个大小和邻接矩阵相同的传递闭包矩阵A,初始化为邻接矩阵的值。

(3)迭代计算传递闭包矩阵

对所有的j如果A[j,i]=1,则对k=1,2,3…,n都有A[j,k]=A[j,k] V A[i,k]

(4)输出传递闭包矩阵

最终的传递闭包矩阵即为求解结果,其中的每个元素表示两个节点之间是否存在路径。如果元素的值为1,则表示存在路径;否则表示不存在路径。

3、代码实现

#include<iostream>

using namespace std;
int n;	//n为矩阵的阶数 
void warshall(int** matrix){
	for(int i = 0;i < n;i++){
		for(int j = 0;j < n;j++){
			if(matrix[j][i] == 1){	//	第j行与第i行进行或操作,并最终赋值到第j行 
				for(int k = 0;k < n;k++){
					matrix[j][k] = matrix[j][k] | matrix[i][k];
				} 
			}		
		}	
	}
}

int main(){
	cout << "输入矩阵的阶数:" << endl;
	cin >> n ;
	int *matrix[n];
	for(int i = 0;i < n;i++){
		matrix[i] = new int[n];
		for(int j = 0;j < n;j++){
			cin >> matrix[i][j];
		}
	} 
	warshall(matrix);
	
	for(int i = 0;i < n;i++){
		for(int j = 0;j < n;j++){
			cout << matrix[i][j] << " ";
		}
		cout << endl;
	} 
	delete[] matrix;
	return 0;
}

WarShall算法求传递闭包(可达矩阵)
需要注意的是,Warshall算法的时间复杂度为O(N^3),其中N为节点数。在实际应用中,如果图的规模非常大,可能需要采用其他更高效的算法或者数据结构来求解传递闭包。文章来源地址https://www.toymoban.com/news/detail-478393.html

到了这里,关于WarShall算法求传递闭包(可达矩阵)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Floyd - Warshall (弗洛伊德算法)

    图中任意两点之间的最短路径问题 Dijkstra和Bellman-Ford也可以以所有点为源点,求出任意两点之间的最短距离,但是Dijstra不能解决带负权的的边,Bellman-Ford 效率慢点 Floyd算法考虑的是一条最短路径的中间节点,即简单路径p={v1 , v2,  ...  ,vn}上除v1和vn的任意节点 设K是p的一个

    2024年02月06日
    浏览(37)
  • 多源最短路径算法:Floyd-Warshall算法分析

    在有向赋权图中(可以存在 带负权值的路径 ,但不能存在 总权值为负数的环路 ),Floyd-Warshall算法可以求出 任意两个顶点间 的最短路径 假设图中有 N 个顶点,顶点按照 0~N-1 进行编号 算法中使用 二维数组 Dist 来记录点与点之间的最短路径长度, Dist[i][j] 表示第i个顶点到第j个顶点

    2024年02月09日
    浏览(36)
  • Warshall算法(用法详解,并转换成代码的形式)

    关于Warshall算法,我先通过离散数学中求传递闭包来解释他的使用规则。 一般的,给定一个矩阵A(行列相等),我们对其使用Warshall算法: //注,该矩阵上只有0或1两种元素,做加法时,1+1还是1 1、先找到该矩阵的对角线,并从对角线的左上方开始为第一个元素 2、以对角线上

    2024年02月01日
    浏览(33)
  • 算法——弗洛伊德算法(Floyd-Warshall)(图论)(c++)

    (蒟蒻的第四篇文章,希望dalao勿喷) (希望没问题) 声明: 1.本人变量定义的名称很low 2.本人用的方法也很low 3.但我觉得文章应该不low  (盲目自信) 第四篇文章讲讲Floyd算法 Floyd算法是一种寻找最短路径的常见算法,其特点是: 短,好理解(虽然其他算法也挺好理解的

    2023年04月09日
    浏览(33)
  • Floyd判联通(传递闭包) & poj1049 sorting it all out

    Floyd传递闭包顾名思义就是把判最短路的代码替换成了判是否连通的代码,它可以用来判断图中两点是否连通。板子大概是这个样的: 给定 n个变量和 m个不等式。其中 n小于等于 26,变量分别用前 n的大写英文字母表示。 不等式之间具有传递性,即若 AB 且 BC,则 AC。 请从前

    2024年02月04日
    浏览(34)
  • UVa247 Calling Circles(Floyd warshall算法)

    给定两个人相互打电话,如果a打给b,b打给c,c打给a,则说a,b,c在同一电话圈中。给出n个人的m次通话,输出所有的电话圈 用graph[u][v]=1表示u和v之间有打电话。在使用floyd算法计算所有的点对之间的值。graph[u][v]=1表示u,v之间有直接或者间接打电话。如果graph[u][v] = 1并且graph[v][u]

    2024年02月12日
    浏览(37)
  • Floyd_Warshall算法详解及实现(多源最短路径)

    小明要去这样的城市旅游(城市交通图如下),为了减轻经济负担,小明想知道任意两个城市之间的最短路径。 从图中,可以得到:小明打算去4个城市(节点数)旅游,而这4个城市之间有8条公路(边数)连通,公路上的数字(权重)表示这条公路的长短。 现在需要设计一

    2023年04月17日
    浏览(36)
  • 第三章 图论 No.3 flody之多源汇最短路,传递闭包,最小环与倍增

    flody的四个应用: 多源汇最短路 传递闭包 找最小环 恰好经过k条边的最短路 倍增 多源汇最短路:1125. 牛的旅行 1125. 牛的旅行 - AcWing题库 直径概念:同一连通块中,两个距离最远的点之间的距离 如何求直径?由于图中存在着两个连通块,所以直接对全图做一个flody,就能更

    2024年02月14日
    浏览(44)
  • 离散数学---判断矩阵:自反性,反自反性,对称性得到矩阵的自反闭包,对称闭包。

    目录 1-自反性,反自反性,对称性 2--矩阵的自反闭包,对称闭包 题目:从键盘输入集合A的元素值,键盘输入A到A 关系矩阵M。 判断该关系矩阵M是否具有 (1)自反性、 (2)反自反性、 (3)对称性、 输出以上各性质的判定结果。       那么对于这个程序的执行,我们想法是

    2024年01月20日
    浏览(38)
  • 引用计数 vs 根可达算法:深入比较对象存活判定

    🔭 嗨,您好 👋 我是 vnjohn,在互联网企业担任 Java 开发,CSDN 优质创作者 📖 推荐专栏:Spring、MySQL、Nacos、Java,后续其他专栏会持续优化更新迭代 🌲文章所在专栏:JVM 🤔 我当前正在学习微服务领域、云原生领域、消息中间件等架构、原理知识 💬 向我询问任何您想要的

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包