当前位置: 首页 > 知识库问答 >
问题:

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

庾远航
2023-03-14

我试图解决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();
        }
    }
}

共有1个答案

朱宏爽
2023-03-14

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

 类似资料:
  • 在我的bash脚本中,如果在放弃之前失去了与目标的连接,我将尝试让rsync重试10次。 我知道这段代码会捕获所有错误,但我现在可以接受。 我的代码是: 它没有按预期工作,下面是第一个错误发生的情况: 这是因为美元吗?包含T形三通的返回值,而不是rsync? 我怎样才能解决这个问题?(我个人Linux语法有限:)

  • 我正在做一个编码练习: 给定一个整数序列作为一个数组,确定是否可以通过从数组中移除不超过一个元素来获得一个严格递增的序列。 例 > 对于序列=[1,3,2,1],输出应为false; 下面是我的代码失败的2个输入: 这两个输入都应该返回True,但我的代码返回false。有什么想法吗?

  • 阿波罗查询是这样定义的: 我的架构: 我如何提出请求: UserLevelInput、RanksInput 和 PvpInput: 如果我在localhost:5005/graphql上进行这种变异,它将按预期工作: 此外,如果我提出请求(代码不在 /graphql),然后检查出Apollo开发工具的特定突变,我得到的Int,UserLevelIn的,RanksIn的和PpvIn的类型是未知的。A

  • 我刚开始在 futurelearn.com 学习编程。 我有一个位图和一个球。任务是编码x方向的边界。 工作代码如下所示: 但我有一个逻辑问题。我想知道为什么我不能用“==”代替“ 这是了解的视频。它应该包含所有可能缺少的信息。 https://www.futurelearn.com/courses/begin-programming/7/steps/42942

  • 是的,我知道《埃拉托斯特尼筛》在标准的图书馆Prime类中,但我正在尝试实现自己的练习。 我正在逐字逐句地按照维基百科上的描述进行操作: 通过Eratosthenes的方法找到所有小于或等于给定整数n的素数:1.创建一个从2到n的连续整数列表:(2,3,4,…, n)。 2.最初,让p等于2,第一个素数。 3.从p开始,通过以p为增量计数到n来枚举其倍数,并在列表中标记它们(这些将是2p,3p,4

  • 我应该做些什么来让这个API调用按预期使用cURL工作?