Dijkstra 算法错误路径总是从 0 开始

如何解决Dijkstra 算法错误路径总是从 0 开始

我目前正在做数据结构和算法的最后一个作业。我作业中的编程问题之一是基于 Dijkstra 算法。我参考这个链接来帮助我的任务:https://algorithms.tutorialhorizon.com/print-all-paths-in-dijkstras-shortest-path-algorithm/。但是,我注意到这个程序实现中有一个错误。请允许我解释一下:

 import java.util.Comparator;
 import java.util.LinkedList;
 import java.util.PriorityQueue;
 import javafx.util.Pair;

 public class Graph {

 int vertices;
 LinkedList<Edge>[] adjacencylist;

 Graph(int vertices) {
  this.vertices = vertices;
  adjacencylist = new LinkedList[vertices];
  //initialize adjacency lists for all the vertices
  for (int i = 0; i <vertices ; i++) {
     adjacencylist[i] = new LinkedList<>();
  }
 }

 public void addEdge(int source,int destination,int weight) {
   Edge edge = new Edge(source,destination,weight);
   adjacencylist[source].addFirst(edge);

   edge = new Edge(destination,source,weight);
   adjacencylist[destination].addFirst(edge); //for undirected graph
 }

 public void dijkstra_PrintPaths(int sourceVertex){

   boolean[] SPT = new boolean[vertices];
   //distance used to store the distance of vertex from a source
   int [] distance = new int[vertices];

   int [] parentVertex = new int[vertices];

   //parent of the source vertex will be -1
   parentVertex[0] = -1;

   //Initialize all the distance to infinity
   for (int i = 0; i <vertices ; i++) {
     distance[i] = Integer.MAX_VALUE;
   }
   //Initialize priority queue
   //override the comparator to do the sorting based keys
   PriorityQueue<Pair<Integer,Integer>> pq = new PriorityQueue<>(vertices,new 
   Comparator<Pair<Integer,Integer>>() {
      @Override
      public int compare(Pair<Integer,Integer> p1,Pair<Integer,Integer> p2) {
       //sort using distance values
        int key1 = p1.getKey();
        int key2 = p2.getKey();
        return key1-key2;
      }
      });
      //create the pair for for the first index,0 distance 0 index
    distance[0] = 0;
    Pair<Integer,Integer> p0 = new Pair<>(distance[0],0);
    //add it to pq
    pq.offer(p0);

    //while priority queue is not empty
   while(!pq.isEmpty()){
   //extract the min
    Pair<Integer,Integer> extractedPair = pq.poll();

    //extracted vertex
     int extractedVertex = extractedPair.getValue();
     if(SPT[extractedVertex]==false) {
        SPT[extractedVertex] = true;

       //iterate through all the adjacent vertices and update the keys
        LinkedList<Edge> list = adjacencylist[extractedVertex];
        for (int i = 0; i < list.size(); i++) {
        Edge edge = list.get(i);
        int destination = edge.destination;
        //only if edge destination is not present in mst
        if (SPT[destination] == false) {
            ///check if distance needs an update or not
            //means check total weight from source to vertex_V is less than
            //the current distance value,if yes then update the distance
            int newKey =  distance[extractedVertex] + edge.weight ;
            int currentKey = distance[destination];
            if(currentKey>newKey){
                Pair<Integer,Integer> p = new Pair<>(newKey,destination);
                pq.offer(p);
                distance[destination] = newKey;
                parentVertex[destination] = extractedVertex;
               }
           }
       }
   }
   }
   //print Shortest Path Tree
    printDijkstra(parentVertex,distance,sourceVertex);
   }

    public void printDijkstra(int[] parent,int [] distance,int sourceVertex){
       System.out.println("Dijkstra Algorithm: (With all paths)");
       for (int i = 0; i <vertices ; i++) {
          System.out.print(" " + sourceVertex + "--> " +   + i + ": distance="+distance[i] + "  Path : ");
          printPathUtil(parent,i);
          System.out.println();
       }
       }

     public void printPathUtil(int parent[],int destination){
     //if vertex is source then stop recursion
        if(parent[destination] == -1) {
          System.out.print("0 ");
          return;
        }
        printPathUtil(parent,parent[destination]);
        System.out.print(destination + " ");
     }

    public static void main(String[] args) {
     int vertices = 6;
     Graph graph = new Graph(vertices);
     graph.addEdge(0,1,5);
     graph.addEdge(0,2,3);
     graph.addEdge(1,1);
     graph.addEdge(1,3,2);
     graph.addEdge(2,4);
     graph.addEdge(3,4,2);
     graph.addEdge(4,5,6);
     graph.dijkstra_PrintPaths(0);

     System.out.println();

     graph.dijkstra_PrintPaths(3);
     }

边缘类:

 public class Edge {

   int source;
   int destination;
   int weight;

 public Edge(int source,int weight) {
   this.source = source;
   this.destination = destination;
   this.weight = weight;
 }
 }

对于图类中的main方法,我调用了dijkstra_PrintPaths函数2次来打印从不同节点开始的路径。

Output:

Dijkstra Algorithm: (With all paths)
0--> 0: distance=0  Path : 0 
0--> 1: distance=4  Path : 0 2 1 
0--> 2: distance=3  Path : 0 2 
0--> 3: distance=6  Path : 0 2 1 3 
0--> 4: distance=8  Path : 0 2 1 3 4 
0--> 5: distance=14  Path : 0 2 1 3 4 5 

Dijkstra Algorithm: (With all paths)
3--> 0: distance=0  Path : 0 
3--> 1: distance=4  Path : 0 2 1 
3--> 2: distance=3  Path : 0 2 
3--> 3: distance=6  Path : 0 2 1 3 
3--> 4: distance=8  Path : 0 2 1 3 4 
3--> 5: distance=14  Path : 0 2 1 3 4 5 

这是错误出现的地方,如输出的第二部分所示。它是从 3 开始,但打印出来的路径与 0 类似。只有路径从 3 开始,然后从节点到节点,直到目的地才有意义。希望大家帮帮忙,谢谢。

解决方法

简单看一下:参数 sourceVertex 并没有真正用于 dijkstra_PrintPaths。所以我想这就是问题所在。

我猜这个初始化是错误的:

 //create the pair for for the first index,0 distance 0 index
    distance[0] = 0;
    Pair<Integer,Integer> p0 = new Pair<>(distance[0],0);
    //add it to pq
    pq.offer(p0);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-