Floyd(弗洛伊德)算法求解每对顶点之间的距离(Java语言)

简介: Floyd(弗洛伊德)算法求解每对顶点之间的距离(Java语言)

1、Floyd(弗洛伊德)算法

Floyd(弗洛伊德)算法求解每对顶点之间的距离(Java语言)

2、设计思想:

利用两个数组

Floy【i】【j】存储 i—>j 的路径长度

Path【i】【j】存储的是 i—>j 的中间节点

利用三重循环

第一层是取不同的中间节点

第二层是取图中不同起点

第三层是取不同终点

如果floy[i][j]>floy[i][k]+floy[k][j],则表明通过该中间节点的路径小于直接到达,经过这三次循环不断修正各个节点之间的路径,最终得到的Floy数组即为最优路径

代码:

/**
 *作者:魏宝航
 *2020年11月27日,上午10:27
 */
import org.omg.CORBA.INTERNAL;
import com.sun.jndi.url.iiopname.iiopnameURLContextFactory;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
public class MatrixUDG {
    private char[] mVexs;
    private int[][] mMatrix;
    private int num;
    public MatrixUDG(char[] vexs, char[][] edges) {
        num = vexs.length;
        mVexs = new char[num];
        for (int i = 0; i < mVexs.length; i++)
            mVexs[i] = vexs[i];
        mMatrix = new int[num][num];
        for(int i=0;i<num;i++){
            for(int j=0;j<num;j++){
                if(edges[i][j]=='∞'){
                    mMatrix[i][j]=Integer.MAX_VALUE;
                }else{
                    mMatrix[i][j]=Integer.parseInt(edges[i][j]+"");
                }
            }
        }
    }
    public void print() {
        System.out.printf("Martix Graph:\n");
        for (int i = 0; i < mVexs.length; i++) {
            for (int j = 0; j < mVexs.length; j++){
                if(mMatrix[i][j]<Integer.MAX_VALUE){
                    System.out.printf("%d ", mMatrix[i][j]);
                }else{
                    System.out.print("∞ ");
                }
            }
            System.out.printf("\n");
        }
    }
   public void Floyd(int x,int y) {
     int[][] floy=new int[1000][1000]; //存储i-j的距离
     int[][] path=new int[1000][1000];//存储i-j的中间节点
     for(int i=0;i<num;i++) {
       for(int j=0;j<num;j++) {
         floy[i][j]=this.mMatrix[i][j];
         if(i!=j&&this.mMatrix[i][j]<Integer.MAX_VALUE) {
           path[i][j]=i;
         }
         else {
           path[i][j]=-1;
         }
       }
     }
     for(int k=0;k<num;k++) {//中间节点
       for(int i=0;i<num;i++) {//起点
         for(int j=0;j<num;j++) {//终点
           if(floy[i][j]>floy[i][k]+floy[k][j]&&(floy[i][k]+floy[k][j])>=0) {
             floy[i][j]=floy[i][k]+floy[k][j];
             path[i][j]=path[k][j];
           }
         }
       }
     }
     System.out.println("每对顶点的最短路径如下:");
     for(int i=0;i<num;i++) {
       for(int j=0;j<num;j++) {
         System.out.print(floy[i][j]+" ");
       }
       System.out.println();
     }
     System.out.println(x+"与"+y+"之间的最短路径为"+floy[x][y]);
   }
    public static void main(String[] args) {
        char[] vexs={'0','1','2','3'};
        char[][] edges=new char[][]{
                {'0','5','∞','7'},
                {'∞','0','4','2'},
                {'3','3','0','2'},
                {'∞','∞','1','0'},
        };
        MatrixUDG g=new MatrixUDG(vexs,edges);
        g.print();
        g.Floyd(0, 3);
    }
}


目录
相关文章
|
2月前
|
Java Maven
使用java语言制作一个窗体(弹窗),用来收集用户输入的内容
该博客文章介绍了如何使用Java Swing中的JFrame创建一个窗体来收集用户输入的内容,并提供了详细的实现步骤和完整代码示例。
使用java语言制作一个窗体(弹窗),用来收集用户输入的内容
|
2月前
|
算法 Java 测试技术
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
这篇文章介绍了基于动态规划法的三种算法:解决背包问题的递归和自底向上实现、Warshall算法和Floyd算法,并提供了它们的伪代码、Java源代码实现以及时间效率分析。
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
|
2月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
39 6
|
2月前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
2月前
|
搜索推荐 算法 Java
经典排序算法之-----选择排序(Java实现)
这篇文章通过Java代码示例详细解释了选择排序算法的实现过程,包括算法的基本思想、核心代码、辅助函数以及测试结果,展示了如何通过选择排序对数组进行升序排列。
经典排序算法之-----选择排序(Java实现)
|
2月前
|
搜索推荐 算法 Java
|
2月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
53 2
|
2月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
41 1
|
2月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
40 1
|
2月前
|
算法 Java
HanLP — HMM隐马尔可夫模型 -- 维特比(Viterbi)算法 --示例代码 - Java
HanLP — HMM隐马尔可夫模型 -- 维特比(Viterbi)算法 --示例代码 - Java
32 0