floyd

本文详细介绍了Floyd算法,并通过具体的图数据结构演示了如何使用该算法来找到图中任意两点之间的最短路径。此外,还展示了如何通过路径矩阵追踪最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
https://blog.youkuaiyun.com/jeffleo/article/details/53349825
*/
let max = Infinity;
function newGraph(){
    return {
        vertexs:['a','b','c','d','e','f','g'],
        edges:[
            [0,12,max,max,max,16,14],
            [12,0,10,max,max,7,max],
            [max,10,0,3,5,6,max],
            [max,max,3,0,4,max,max],
            [max,max,5,4,0,2,8],
            [16,7,6,max,2,0,9],
            [14,max,max,max,8,9,0]
        ]
    };
    return {
        vertexs:['A','B','C','D','E'],
        edges:[
            [0,5,8,max,max],
            [5,0,1,3,2],
            [8,1,0,max,max],
            [max,3,max,0,7],
            [max,2,max,7,0]
        ]
    };
}
function floyd(g){
    let d = g.edges.map(item=>item.map(i=>i));
    //console.info(d);
    //let p = g.edges.map((row,i)=>row.map((col,j)=>null));
    let p = g.edges.map((row,i)=>row.map((col,j)=>j));
    console.info(p);
    /*为什么顺序必须是最外层遍历中间点,然后是起点,最后是终点?
    https://www.zhihu.com/question/30955032

    */
    for(let k=0;k<g.edges.length;k++){//遍历所有中间点
        for(let i=0;i<g.edges.length;i++){//遍历所有起点
            for(let j=0;j<g.edges.length;j++){//遍历所有终点
                if(d[i][j] > d[i][k] + d[k][j]){
                    d[i][j] = d[i][k] + d[k][j];
                    p[i][j] = p[i][k];
                    //p[i][j] = k;
                    console.info(`i=${i},j=${j},k=${k}`);
                    console.info(p);
                }
            }
        }
    }
    console.info(d);
    console.info(p);
    return {d,p};
}
//不包含终点的路径
function path(p,i,j){
    let k = p[i][j];
    if(k !== null){
        let pik = path(p,i,k);
        let pkj = path(p,k,j);
        return pik.concat(pkj);
    }else{
        return [i];
    }
}
function test(){
    let g = newGraph();
    let {d,p} = floyd(g);
    //根据p计算0到4的最短路径
    let i = 0,j = 4;

    /*
    let pij = path(p,i,j);
    pij.push(j);*/

    let k = p[i][j];
    let pij = [i,k];
    while(k != j){
        k = p[k][j];
        pij.push(k);
    }
    console.info(pij);
}
test();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值