利用Dijkstra算法求顶点v1到其他各顶点的最短路径Java实现

简介: 利用Dijkstra算法求顶点v1到其他各顶点的最短路径Java实现

利用Dijkstra算法求顶点v1到其他各顶点的最短路径

以下代码仅供参考

以下代码仅供参考

以下代码仅供参考

/**
 *作者:魏宝航
 *2020年11月23日,下午15:31
 */
import java.io.IOException;
import java.util.Scanner;
public class MatrixUDG {
   private int mEdgNum;
   private char[] mVexs;
   private int[][] mMatrix;
   private static final int INF = Integer.MAX_VALUE;
   public MatrixUDG(char[] vexs, int[][] matrix) {
      int vlen = vexs.length;
      mVexs = new char[vlen];
      for (int i = 0; i < mVexs.length; i++)
         mVexs[i] = vexs[i];
      mMatrix = new int[vlen][vlen];
      for (int i = 0; i < vlen; i++)
         for (int j = 0; j < vlen; j++)
            mMatrix[i][j] = matrix[i][j];
      mEdgNum = 0;
      for (int i = 0; i < vlen; i++)
         for (int j = i+1; j < vlen; j++)
            if (mMatrix[i][j]!=INF)
               mEdgNum++;
   }
   private int getPosition(char ch) {
      for(int i=0; i<mVexs.length; i++)
         if(mVexs[i]==ch)
            return i;
      return -1;
   }
   public void dijkstra(int vs, int[] prev, int[] dist) {
      boolean[] flag = new boolean[mVexs.length];
      for (int i = 0; i < mVexs.length; i++) {
         flag[i] = false;
         prev[i] = 0;
         dist[i] = mMatrix[vs][i];
      }
      flag[vs] = true;
      dist[vs] = 0;
      int k=0;
      for (int i = 1; i < mVexs.length; i++) {
         int min = INF;
         for (int j = 0; j < mVexs.length; j++) {
            if (flag[j]==false && dist[j]<min) {
               min = dist[j];
               k = j;
            }
         }
         flag[k] = true;
         for (int j = 0; j < mVexs.length; j++) {
            int tmp = (mMatrix[k][j]==INF ? INF : (min + mMatrix[k][j]));
            if (flag[j]==false && (tmp<dist[j]) ) {
               dist[j] = tmp;
               prev[j] = k;
            }
         }
      }
      System.out.printf("dijkstra(%c): \n", mVexs[vs]);
      for (int i=0; i < mVexs.length; i++)
         System.out.printf("  shortest(%c, %c)=%d\n", mVexs[vs], mVexs[i], dist[i]);
   }
   private static class EData {
      char start;
      char end;
      int weight;
      public EData(char start, char end, int weight) {
         this.start = start;
         this.end = end;
         this.weight = weight;
      }
   };
   public static void main(String[] args) {
      char[] vexs = {'1', '2', '3', '4', '5', '6'};
      int matrix[][] = {
             {   0 ,  1 , INF ,  1 , INF,  1},
             {   1 ,  0 ,  1  ,  1 ,  1 , INF},
             {  INF,  1 ,  0  , INF,  1 , INF},
             {   1 ,  1 ,  INF,  0 ,  1 ,  1},
             {  INF,  1 ,  1  ,  1 ,  0 , INF},
             {   1 , INF,  INF,  1 , INF,  0}};
      MatrixUDG pG;
      pG = new MatrixUDG(vexs, matrix);
      int[] prev = new int[pG.mVexs.length];
      int[] dist = new int[pG.mVexs.length];
      pG.dijkstra(0, prev, dist);
   }
}


目录
相关文章
|
24天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
60 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
26天前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
91 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
26天前
|
算法 Java Linux
java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
这篇文章介绍了如何在Java中使用Graphics2D在图片上绘制文字,并实现自动换行的功能。
66 0
|
1月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)
|
1月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
17 0
|
11天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
88 38
|
8天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
2天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
3天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
19 4
|
3天前
|
消息中间件 供应链 Java
掌握Java多线程编程的艺术
【10月更文挑战第29天】 在当今软件开发领域,多线程编程已成为提升应用性能和响应速度的关键手段之一。本文旨在深入探讨Java多线程编程的核心技术、常见问题以及最佳实践,通过实际案例分析,帮助读者理解并掌握如何在Java应用中高效地使用多线程。不同于常规的技术总结,本文将结合作者多年的实践经验,以故事化的方式讲述多线程编程的魅力与挑战,旨在为读者提供一种全新的学习视角。
24 3