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


目录
相关文章
|
6天前
|
监控 算法 网络协议
Java 实现局域网电脑屏幕监控算法揭秘
在数字化办公环境中,局域网电脑屏幕监控至关重要。本文介绍用Java实现这一功能的算法,涵盖图像采集、数据传输和监控端显示三个关键环节。通过Java的AWT/Swing库和Robot类抓取屏幕图像,使用Socket进行TCP/IP通信传输图像数据,并利用ImageIO类在监控端展示图像。整个过程确保高效、实时和准确,为提升数字化管理提供了技术基础。
40 15
|
3月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
101 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
12天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
25 6
|
3月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
161 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
3月前
|
算法 Java Linux
java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
这篇文章介绍了如何在Java中使用Graphics2D在图片上绘制文字,并实现自动换行的功能。
166 0
|
3月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)
|
11天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
13天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
13天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。
|
13天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
37 3

热门文章

最新文章