为什么我的Dijkstra代码失败了?

时间:2016-06-17 09:51:57

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

我正在尝试解决Dijkstra算法中的黑客问题 - 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();
        }
    }
}

1 个答案:

答案 0 :(得分:2)

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