Floyed算法-Javascript实现

原理

Floyed算法是典型的暴力搜索,不过用到了动态规划的思想,整体的使用过程是,我们会考虑中间点的作用,简单的说,对于任何一个点ij我们考虑下是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>");
            }
        }

猜你喜欢

转载自blog.csdn.net/qq_41199852/article/details/107965895