乙個號稱只有5行**的演算法, 由2023年圖靈獎獲得者、史丹福大學電腦科學系教授羅伯特·弗洛伊德命名。該演算法有於求乙個帶權有向圖(wighted directed graph)的任意兩點的最短距離的演算法,運用了動態規劃的思想, 演算法的時間複雜度為o(v^3),空間複雜度o(v^2)。
其核心思想是,在兩個頂點之間插入乙個或乙個以上的中轉點,比較經過與不經過中轉點的距離哪個更短。同時,我們需要引入2個矩陣,乙個鄰接矩陣d,用來計算每個相鄰點的距離,也就是我們的已知條件,第二個矩陣p,則用來表示中間點k的代數。比如說p中p[i,j]的值就是i與j兩點的中間點代數。
我們在進行floyd演算法的時候,也要像dijkstra演算法一樣,不停的更新這兩個矩陣。當我們根據一點規律變化中間點k的時候,也要遍歷所有的最小距離和中間點,若d[i,j]這個中轉點的思想,我們可以想象現實中的自ekd旅行駕遊問題,有的城市間的道路好走,比如存在高速公路,其需要的時間就越短,有的城市間只有原始的泥濘小道,行駛時就很耗時間。
比如a地直接到b地需要7小時
a地經由c地再到b地,則要1+4=5小時
a地經由c地再到d地再到b地,則要1+1+1小時。
換言之,這類似動態規則的揹包問題,從a地到b地,每個中轉點可以選擇也可以不選擇,這個邏輯就是對應**中的鬆弛操作。要求出所有地方(頂點)之間的最短距離,就需要n^3次鬆弛操作(三重迴圈)
floyd的核心5行**:
for(k=0;kd[i][k]+d[k][j])//鬆弛操作
d[i][j]=d[i][k]+d[k][j];
需要注意的是,floyd演算法都是圍繞頂點展開,因此其表示法只能選擇相鄰距陣。在相鄰距陣中,我們預設所有頂點的權重是無限大,表示它們都不相鄰,其實這在floyd演算法有點不對,因為頂點到它自身的距離應該為零,因此這個要改動一下。
其完整實現如下:
class graphbymatrix
}var map = {}
for (var i = 0; i < vertices.length; i++)
this.matrix = matrix; // 矩陣
this.vertices = vertices; // 頂點陣列(裡面只能是索引值)
this.map = map
this.isdirected = false;
}addedge(a, b, weight)
this.matrix[aindex][bindex] = weight || 1
if(!this.isdirected)
}tostring(obj) else
}return str
}obj = obj || this.matrix;
return obj.map(function (row) ).join(' ')
}).join("n");
}floyd()
}for (var k = 0; k < n; k++) }}
}}console.log("鄰接矩陣")
console.log(this + "")
console.log("最短路徑")
console.log(this.tostring(distance))
console.log("path矩陣")
console.log(this.tostring(path))
this.printpath(distance, path, n)
}genpath(path, i, j, s)
this.genpath(path, i, k, s);
s.push(k)
this.genpath(path, k, j, s);
}printpath(distance, path, n)
var s = this.vertices[i] + '到' + this.vertices[j] + " 最短距離為:" + distance[i][j] + 'n'
dij最短路 堆優化
dij乙個主要思路,將所有點分為兩個集合s,t,初始集合s中只包含了起點,t集合包含所有點,要做的就是從t集合中不斷選取與s集合中的點距離最短的並且未被加入s集合中的點,將這個點加入s集合,並用這個點去更新所有與這個點相鄰的點,重複操作直到所有點都被加入s集合中。下面看一下dij的過程 dij演算法...
Floyd演算法(未優化版)
其實整個演算法的思想就是動態規劃,我覺得這個動態規劃的過程還是得自己去劃一劃,下面最重要的 就是那一段遞推的那一段,遞推是動態規劃的核心,其實理解到了乙個問題的變化,自己能推出它的遞迴方程了你就可以輕鬆解決這個問題了。include include const int inf 0x3f3f3f3f ...
ACM 演算法 堆優化Dijkstra演算法
對於乙個邊權為正的圖,我們可以利用dijkstra演算法求出單源最短路徑 sssp 對於常規的dijkstra演算法,其複雜度為 o n 2 o n 2 o n2 顯然在 n nn 較大的時候,可能導致耗時過長,通過優化我們可以獲得一種更加快速的dijkstra演算法,時間複雜度為 o m logn...