Floyd-Warshall算法

本次使用方法:引入中转点k,如果i到k的距离 + k到j的距离 < i到j的距离,更新i到j的最短距离,将每个点做为中转点更新距离后就可以得到任意两点最短距离。递归解:https://blog.csdn.net/ideaqjx/article/details/78881044

import java.util.*;
public class Floyd {
    public static void main(String args[]){
        int array[][]=new int[][]{{0,1,26,44},{99,0,2,33},{6,8,0,4},{5,7,10,0}};
        int pre[][]=new int[4][4];
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                pre[i][j]=j;  //注意初始化前驱的方式
            }
        }
        //FLoyd 算法求任意一对点最短路径,三层循环是关键
        for(int k=0;k<4;k++){
            for(int i=0;i<4;i++){
                for(int j=0;j<4;j++){
                    if(array[i][k]+array[k][j]<array[i][j]){
                        array[i][j]=array[i][k]+array[k][j];
                        pre[i][j]=pre[i][k];
                    }
                }
            }
        }
        System.out.println("最短路径");
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                System.out.print(array[i][j]+" ");
            }
            System.out.println();
        }
        System.out.println("前驱");
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                System.out.print(pre[i][j]+" ");
            }
            System.out.println();
        }
        //打印中间节点,即路径
        int v=0,w=3;
        int k=pre[v][w];
        System.out.print(v+" ");
        while(k!=w){
            System.out.print(k+" ");
            k=pre[k][w];
        }
        System.out.println(w);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值