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);
    }
}


目录
相关文章
|
17天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
51 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
13天前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
35 3
|
16天前
|
移动开发 Java 大数据
深入探索Java语言的核心优势与现代应用实践
【10月更文挑战第10天】深入探索Java语言的核心优势与现代应用实践
28 4
|
23天前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
54 2
|
21天前
|
分布式计算 安全 Java
Java语言的特点?
Java语言的特点?
|
25天前
|
算法 安全 Go
Python与Go语言中的哈希算法实现及对比分析
Python与Go语言中的哈希算法实现及对比分析
29 0
|
27天前
|
存储 算法 C++
弗洛伊德(Floyd)算法(C/C++)
弗洛伊德(Floyd)算法(C/C++)
|
8天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
26天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
5天前
|
人工智能 算法 数据安全/隐私保护
基于遗传优化的SVD水印嵌入提取算法matlab仿真
该算法基于遗传优化的SVD水印嵌入与提取技术,通过遗传算法优化水印嵌入参数,提高水印的鲁棒性和隐蔽性。在MATLAB2022a环境下测试,展示了优化前后的性能对比及不同干扰下的水印提取效果。核心程序实现了SVD分解、遗传算法流程及其参数优化,有效提升了水印技术的应用价值。