Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的Dijkstra代码失败了?_Java_Algorithm_Graph Theory_Dijkstra_Shortest Path - Fatal编程技术网

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

Java 为什么我的Dijkstra代码失败了?,java,algorithm,graph-theory,dijkstra,shortest-path,Java,Algorithm,Graph Theory,Dijkstra,Shortest Path,我想解决一个关于Dijkstra算法的黑客问题-。我用的是我自己的Dijkstra代码逻辑。虽然我的代码解决了更简单的测试用例,但在更高的测试用例中失败了。我猜我的代码在某个地方缺少一些可传递性,并且某些节点的值高于预期值。你能帮我找出我的错误吗? 问题: 输入格式 第一行包含T,表示测试用例的数量。 每个测试用例的第一行有两个整数N,表示图中的节点数,M,表示图中的边数。 下一行由三个空间分隔的整数x y r组成,其中x和y表示无向边存在的两个节点,r表示这些对应节点之间的边长度。 最后一行有

我想解决一个关于Dijkstra算法的黑客问题-。我用的是我自己的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();
        }
    }
}
import java.io.*;
导入java.util.*;
导入java.text.*;
导入java.math.*;
导入java.util.regex.*;
公共类解决方案{
公共静态void main(字符串[]args){
扫描仪sc=新的扫描仪(System.in);
int number=sc.nextInt();
for(int i=0;i0{//如果mat[g][k]==0,则表示节点之间没有边,因此它们不是邻居。
如果(g==k)
继续;
if(dist[k]>=dist[g]+mat[k][g]){
dist[k]=dist[g]+mat[k][g];
q、 添加(k);
}
}
}
}
对于(int f=1;f
乍一看,您说过可以有多条边,但据我所知,您只存储一条边,输入中总是最新的:mat[r][c]=权重;这(和下一行ofc)只是覆盖了可能已经存在且权重较小的边。你应该在两个节点之间存储最小加权边。

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

请显示输入数据和我要使用的所需输出格式。不幸的是,引擎把它误认为是代码,不停地让我缩进它。请访问上述链接了解整个问题,包括I/O格式。请显示输入数据和我想要的输出格式。不幸的是,引擎把它误认为是代码,不停地让我缩进它。请访问上述链接了解整个问题,包括I/O格式。下一行是为了确保矩阵是对称的。约束条件是边的数量为n*(n-1)/2。这确保两个节点之间只有一条边。因此,我没有覆盖任何内容。顺便说一下,这是一个无向图。请随意询问有关逻辑的任何问题或任何其他疑问。谢谢你的帮助:)你能举一个例子说明你的程序失败了,或者网站只是说它错了?在这行中有一个建议(它不能解决问题):“if(dist[k]>=dist[g]+mat[k][g]){”严格的>就足够了。如果它们相等,那么就找不到更好的解决方案,节点的重新测试将是多余的。代码确实解决了较小的基本情况。但在较高的测试情况下失败。输入是-预期的输出是-可以通过在计算机中运行代码来接收输出。2长时间后,下一行是done,以确保矩阵是对称的。约束条件是边的数目为n*(n-1)/2.这确保了两个节点之间只有一条边。因此,我没有覆盖任何内容。顺便说一句,这是一个无向图。请随意询问有关逻辑的任何问题或任何其他疑问。感谢您的帮助:)您能否给出一个示例输入,说明您的程序失败,或者网站只是说它错了?一个建议(它不能解决问题)在这行:“if(dist[k]>=dist[g]+mat[k][g]){”严格的>就足够了。如果它们相等,那么就找不到更好的解决方案,对节点的重新测试将是多余的。代码确实解决了较小的基本情况。但在较高的测试情况下失败。输入是-预期输出是-可以通过在计算机中运行代码来接收输出。2 long to post i