【问题标题】:Why is my Dijkstra code failing?为什么我的 Dijkstra 代码失败?
【发布时间】:2016-06-17 09:51:57
【问题描述】:

我正在尝试解决有关 Dijkstra 算法的hackerrank 问题-https://www.hackerrank.com/challenges/dijkstrashortreach。我正在使用我自己的 Dijkstra 代码逻辑。虽然我的代码解决了更简单的测试用例,但它在更高的测试用例中失败了。我猜我的代码在某处缺少一些传递性,并且某些节点的值高于预期值。你能帮我找出我的错误吗? 题: 输入格式 第一行包含 T,表示测试用例的数量。 每个测试用例的第一行有两个整数 N,表示图中的节点数和 M,表示图中的边数。 接下来的每一行由三个空格分隔的整数 x y r 组成,其中 x 和 y 表示之间存在无向边的两个节点,r 表示这些对应节点之间的边的长度。 最后一行有一个整数 S,表示起始位置。 如果同一对节点之间存在不同权重的边,则将它们视为原样,就像多条边一样。

输出格式 对于每个测试用例,打印一行由 N-1 个空格分隔的整数组成,表示 N-1 个节点到起始位置 S 的最短距离。 对于无法访问的节点,打印 -1

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

public class Solution {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int number = sc.nextInt();
        for (int i = 0; i < number; i++) {
            int n = sc.nextInt();
            n++;
            int m = sc.nextInt();
            int mat[][] = new int[n][n];
            for (int v = 0; v < m; v++) {
                int r = sc.nextInt();
                int c = sc.nextInt();
                int weight = sc.nextInt();
                mat[r][c] = weight;
                mat[c][r] = weight;
            }

            int dist[] = new int[n];
            for (int bb = 0; bb < n; bb++) { 
                dist[bb] = Integer.MAX_VALUE;
            }
            Queue<Integer> q = new LinkedList<Integer>();
            int source = sc.nextInt();
            q.add(source);
            dist[source] = 0;
            while (!q.isEmpty()) {
                int g = q.remove();
                for (int k = 1; k < n; k++) {
                    if (mat[g][k] > 0)  { // if mat[g][k]==0, it means there is no edge between the nodes and hence they are not neighbours.
                        if (g == k)
                            continue;
                        if (dist[k] >= dist[g] + mat[k][g]) {
                            dist[k] = dist[g] + mat[k][g];
                            q.add(k);               
                        }
                    }
                }
            }
            for (int f = 1; f < n; f++) {
                if (f == source)
                    continue;
                if (dist[f] == Integer.MAX_VALUE)
                    System.out.print("-1" + " ");
                else
                    System.out.print(dist[f] + " ");
            }
            System.out.println();
        }
    }
}

【问题讨论】:

  • 请显示输入数据和所需的输出格式
  • 我要去。不幸的是,引擎把它误认为是代码,并不断要求我缩进它。请访问上面提到的链接以了解包括 I/O 格式在内的整个问题。 hackerrank.com/challenges/dijkstrashortreach

标签: java algorithm graph-theory dijkstra shortest-path


【解决方案1】:

乍一看,你说可以有多个边,但据我所知,你只存储一个,总是输入中最新的:mat[r][c] = weight;这(以及下一行 ofc)只是覆盖了可能已经存在且权重较小的边缘。您应该存储两个节点之间的最小加权边。

【讨论】:

  • 下一行是为了保证矩阵是对称的。约束是边数为 n*(n-1)/2。这确保了两个节点之间只有一条边。因此,我不会覆盖任何东西。顺便说一下,它是一个无向图。随意询问有关逻辑或任何其他疑问的任何问题。感谢您的帮助:)
  • 您能否提供一个示例输入,该输入对于您的程序失败,或者网站只是说它是错误的?这一行中的一个建议(它不能解决问题):“if (dist[k] >= dist[g] + mat[k][g]) {”严格的 > 就足够了。如果它们相等,那么不会为您找到更好的解决方案,节点的重新测试将是多余的。
  • 代码确实解决了较小的基本情况。但它在更高的测试用例中失败了。输入是-hr-testcases-us-east-1.s3.amazonaws.com/5595/… 预期输出是-hr-testcases-us-east-1.s3.amazonaws.com/5595/… 可以通过在您的计算机中运行代码来接收输出。 2 长发布它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 2013-04-27
  • 1970-01-01
  • 2016-03-18
  • 2021-12-26
  • 2011-12-28
相关资源
最近更新 更多