D : 图的顶点可达闭包
Description
给定有向图的邻接矩阵A,其元素定义为:若存在顶点i到顶点j的有向边则A[i,j]=1
,若没有有向边则A[i,j]= 0
。试求A
的可达闭包矩阵A*
,其元素定义为:若存在顶点i
到顶点j
的有向路径则A*[i,j]=1
,若没有有向路径则A*[i,j]= 0
。
Input
第1行顶点个数n
第2行开始的n行有向图的邻接矩阵,元素之间由空格分开
Output
Sample
Input
Output
解题思路
一开始我不知道闭包是啥东西,查了一下,通俗点讲就是:如果在图中存在一个从顶点i到顶点j的有向路径(不论这个路径有多长),则在A中,元素A[i, j] = 1。知道了这个之后就会想到Floyd算法,这个算法是**考虑所有可能的中间顶点,并逐步更新每一对顶点之间的最短路径。**放在这道题就是从顶点i到顶点j之间的所有可能的顶点,全部逐步拼接起来。先来看看Floyd算法:
三重循环的工作原理
如何更新距离矩阵
在这三个循环中,距离矩阵dist[i][j]
表示从顶点i到顶点j的当前已知最短路径长度。在每次迭代中,算法馋死通过中间顶点k来改进这个距离。具体的,算法检查是否dist[i][k] + dist[k][j]
(即通过k的路径长度)小于当前的dist[i][j]
。如果是,那么就更新dist[i][j]
为这个较小的值。
这意味着算法在每次迭代中都在考虑加入一个新的中间顶点,看是否可以通过这个新的中间顶点找到更短的路径。通过逐步考虑所有可能的中间顶点,算法能够确保找到所有顶点对之间的最短路径。
为什么k放在第一个循环
AC代码:
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。