【问题标题】:Dijkstra's Algorithm Implementation using classes [closed]使用类的 Dijkstra 算法实现 [关闭]
【发布时间】:2015-10-01 16:41:15
【问题描述】:

我正在尝试解决 HackerRank 上的一个问题,我已经尝试解决它,我发现它给出了像 -2149088 这样的距离,尽管我的逻辑在 while 循环中最重要的是有问题。谁能指出我的错误我是菜鸟 :) 谢谢。问题陈述HackerRank链接:https://www.hackerrank.com/challenges/dijkstrashortreach

import java.io.*;  
import java.util.*;  
import java.math.*;

public class Solution {

public static void main(String[] args) {

    Scanner in = new Scanner (System.in);
    int cases = in.nextInt();

    for(int i=0; i<cases; i++){
        int N = in.nextInt();
        int M = in.nextInt();
        int adj[][] = new int[N+1][N+1];

        Node nodes[] = new Node[N+1];

        for(int k=1; k<=N; k++)
           nodes[k] = new Node(k);    


        for(int j=0; j<=N; j++)
            for(int k=0; k<=N; k++)
                adj[j][k] = Integer.MAX_VALUE;


        for(int j=0; j<M; j++){

            int A = in.nextInt();
            int B = in.nextInt();
            int W = in.nextInt();

            adj[A][B] = Math.min(W,adj[A][B]);
            adj[B][A] = Math.min(W,adj[A][B]);
        }

        int S = in.nextInt();

        nodes[S].dist = 0;
        PriorityQueue<Node> que = new  PriorityQueue<Node>();

        for(int k=1; k<=N; k++)
            que.add(nodes[k]);


        while(!que.isEmpty()){
            Node q = que.poll();
            int id = q.ID;

            for(int j=1; j<=N; j++){
                if(adj[id][j] != Integer.MAX_VALUE){
                     System.out.println(""+q.dist);
                    if(nodes[j].dist>q.dist+adj[id][j]){
                      nodes[j].dist = q.dist+adj[id][j];

                    } 
                }
            }
        }

        for(int j=1; j<=N; j++){
            if(nodes[j].dist==Integer.MAX_VALUE){System.out.println("-1");}
            else if(nodes[j].dist!=0) {System.out.print(nodes[j].dist+" ");}
        }
    }

}

}

class Node implements Comparable<Node>{

    public int dist;
    public int ID;

    public Node(int getID){
        this.ID = getID;
        dist = Integer.MAX_VALUE;
    }    


    @Override
    public int compareTo (Node node) {
        return Integer.valueOf(this.dist).compareTo(node.dist);
    }   
}

【问题讨论】:

  • “不知道我的代码有什么问题”太模糊了。你应该试着把注意力集中在你的问题上而不是转储代码并写下“它不起作用”......
  • 明白了!问题是我忘记了未附加到图表的节点。所以我不得不将代码中“q”设置为无穷大的dist设置为0。还是谢谢

标签: java algorithm graph-algorithm dijkstra


【解决方案1】:

如果您将 dist 设置为 Integer.MAX_VALUE,然后在此处检查:

                    if(nodes[j].dist>q.dist+adj[id][j]){
                      nodes[j].dist = q.dist+adj[id][j];

                    }

那么 nodes[j].dist 总是大于 q.dist+adj[id][j],因为 MAX_VALUE + adj[id][j]

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多