原理
Floyed算法是典型的暴力搜索,不过用到了动态规划的思想,整体的使用过程是,我们会考虑中间点的作用,简单的说,对于任何一个点i
到j
我们考虑下是i
直接到j
短还是i
先到k
再到j
短,哪个短选哪个,所以我们在使用的时候就可以把每个点都作为中间点看其他点是否要经过自身所以就有了这个算法。
对于动态规划就是
dp[i][j] = Math.min(dp[i][j],dp[i][k] + dp[k][j]);
代码
数据
var NumNodes = 9;
var NumEdges = 16;
var start = [0,0,1,1,1,2,2,3,4,3,4,4,5,6,6,7];
var end = [1,2,2,3,4,4,5,4,5,6,6,7,7,7,8,8];
var weight = [1,5,3,7,5,1,7,2,3,3,6,9,5,2,7,4];
function floyed(){
//floyed所考虑的就是从一个点到达另外一个点是直接到达好还是有中间点到达好
let Nodelength = new Array(NumNodes);
for (let i = 0; i < NumNodes; i++) {
let temp = new Array(NumNodes);
for (let j = 0; j < NumNodes; j++) {
if (i === j) {
temp[j] = 0;
} else {
temp[j] = 9999;
}
}
Nodelength[i] = temp;
}
for (let i = 0; i < weight.length; i++) {
//start[i],end[i],weight[i]
Nodelength[start[i]][end[i]] = weight[i];
Nodelength[end[i]][start[i]] = weight[i];
}
for(let k = 0; k < NumNodes; k++){
for(let i = 0; i < NumNodes; i++){
for(let j = 0; j < NumNodes; j++){
Nodelength[i][j] = Math.min(Nodelength[i][j],Nodelength[i][k] + Nodelength[k][j])
}
}
}
for(let i = 0; i < NumNodes; i++){
for(let j = 0; j < NumNodes; j++){
document.write(Nodelength[i][j] + " ");
}
document.write("</br>");
}
}