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


目录
相关文章
|
4月前
|
JSON Java API
【干货满满】分享京东API接口到手价,用Java语言实现
本示例使用 Java 调用京东开放平台商品价格及优惠信息 API,通过商品详情和促销接口获取到手价(含优惠券、满减等),包含签名生成、HTTP 请求及响应解析逻辑,适用于比价工具、电商系统集成等场景。
|
2月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
295 35
|
2月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
242 18
|
2月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
105 4
|
2月前
|
存储 算法 搜索推荐
《数据之美》:Java数据结构与算法精要
本系列深入探讨数据结构与算法的核心原理及Java实现,涵盖线性与非线性结构、常用算法分类、复杂度分析及集合框架应用,助你提升程序效率,掌握编程底层逻辑。
|
2月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
3月前
|
存储 Java Apache
Java语言操作INI配置文件策略
以上步骤展示了基本策略,在实际项目中可能需要根据具体需求进行调整优化。例如,在多线程环境中操作同一份配置时需要考虑线程安全问题;大型项目可能还需考虑性能问题等等。
175 15
|
4月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
400 0
|
4月前
|
JSON Java API
【干货满满】分享拼多多API接口到手价,用Java语言实现
本方案基于 Java 实现调用拼多多开放平台商品详情 API,通过联盟接口获取商品到手价(含拼团折扣与优惠券),包含签名生成、HTTP 请求及响应解析逻辑,适用于电商比价、导购系统集成。
|
4月前
|
JSON Java API
【干货满满】分享淘宝API接口到手价,用Java语言实现
本文介绍了如何使用 Java 调用淘宝开放平台 API 获取商品到手价,涵盖依赖配置、签名生成、HTTP 请求与响应解析等核心实现步骤。