- 主题:弗洛伊德算法有一点不太懂
void floyd() {
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
}
为何三重循环以后就更新了*所有*节点对之间的最短路径长度?
意思是说,前面执行阶段得到了部分节点对之间的最短路径长度,会影响后面阶段计算的最短路径,
那么,后面阶段计算的最短路径,如果再运行一次该函数,会不会使部分节点间计算出来的最短路径更短?
--
FROM 218.108.223.*
程序员遇事不决问ai
【 在 ooolinux 的大作中提到: 】
:
: void floyd() {
: for (int k = 0; k < n; k++) {
: for (int i = 0; i < n; i++) {
: for (int j = 0; j < n; j++) {
--
FROM 58.37.173.*
你说了也没用,他是选择性忽略的
我昨天都说了用AI搜了
【 在 RuralHunter 的大作中提到: 】
: 程序员遇事不决问ai
:
--
FROM 123.115.128.*
AI说得没那么清楚
【 在 RuralHunter 的大作中提到: 】
: 程序员遇事不决问ai
:
--
FROM 218.108.223.*
AI的回答没那么清楚:
通常情况下,再次运行该函数不会使部分节点间计算出来的最短路径更短。原因如下:
算法收敛性:弗洛伊德算法经过一次完整的三重循环后,已经考虑了所有可能的中间节点组合,从而得到了所有节点对之间的最短路径。也就是说,在第一次运行结束后,dist 数组中存储的已经是最终的最短路径长度。
无负权环假设:弗洛伊德算法在没有负权环的图中是收敛的。如果图中存在负权环,那么最短路径的概念就变得没有意义,因为可以沿着负权环不断循环,使得路径长度不断减小。但在正常情况下,假设图中不存在负权环,再次运行函数不会改变已经得到的最短路径长度。
--
FROM 218.108.223.*
上wiki查啊,简单的数学归纳法。
【 在 ooolinux 的大作中提到: 】
: void floyd() {
: for (int k = 0; k < n; k++) {
: for (int i = 0; i < n; i++) {
: ...................
--
FROM 116.230.17.*
附件(10.9KB) Floyd-Warshal.md这个文档是一般的介绍
【 在 Jacqueline 的大作中提到: 】
: 上wiki查啊,简单的数学归纳法。
--
FROM 218.108.223.*
这上面已经写得足够细致了,如果你看不懂,是高中数学没学好,
不是人家写得不清楚。
【 在 ooolinux 的大作中提到: 】
: 这个文档是一般的介绍
--
FROM 116.230.17.*
算了
【 在 Jacqueline 的大作中提到: 】
: 这上面已经写得足够细致了,如果你看不懂,是高中数学没学好,
: 不是人家写得不清楚。
--
FROM 218.108.223.*
找一本几十年前的高中甲种本,或者数理化自学丛书,翻到数列与数学归纳法那章,
先把n条直线最多能把平面分成几块,n个平面最多能把空间分成几块的证明搞清楚,
回来再看这个算法,自然能懂。都是同一难度的简单证明。
【 在 ooolinux 的大作中提到: 】
: 算了
--
修改:Jacqueline FROM 116.230.17.*
FROM 116.230.17.*