Algorithm 迪克斯特拉';无优先级队列的无向循环图的s算法实现

Algorithm 迪克斯特拉';无优先级队列的无向循环图的s算法实现,algorithm,queue,shortest-path,Algorithm,Queue,Shortest Path,如何仅使用队列而不是优先级队列来实现Dijkstra .这可能吗?若否,原因为何?这是我用java编写的代码。。我犯了什么错? “S”是起始节点“W”是权重“N”是矩阵的大小。因为第一个节点是“1”,所以我在adj矩阵的长度上加了1 这是来自HackerRank链接的问题: import java.io.*; 导入java.util.*; 公共类解决方案{ 公共静态void main(字符串[]args){ 扫描仪输入=新扫描仪(系统输入); int cases=in.nextInt(); 对于

如何仅使用队列而不是优先级队列来实现Dijkstra .这可能吗?若否,原因为何?这是我用java编写的代码。。我犯了什么错?
“S”是起始节点“W”是权重“N”是矩阵的大小。因为第一个节点是“1”,所以我在adj矩阵的长度上加了1

这是来自HackerRank链接的问题:

import java.io.*;
导入java.util.*;
公共类解决方案{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
int cases=in.nextInt();

对于(inti=0;i是的,可以这样实现它,但它不是最优的。 因为您使用队列而不是优先级队列,所以您可能必须多次展开图的同一部分。因此,您可以使用类似于N^2的内容替换logN(如果我没有弄错的话)

如果您没有多次展开节点(就像您在代码中所做的那样),那么这是错误的,因为您使用的成本高于最小值。假设您有两个节点,其直接链接成本为20,或间接链接通过第三个节点,其两边的成本为1。您可以展开第二个节点,假设最小距离为20(因为它首先到达队列)但如果您等待,您将找到一个成本为2的路径。如果间接路径的成本不明显,请向其添加更多节点

至少做一次线性搜索,找到最小值,使其回到N(设置的总体复杂度O(N^2))。最好的实现是复杂度O((N+M)logN)

代码中的另一个错误是读取数据:

 for(int j=0; j<M; j++){
        int A = in.nextInt();
        int B = in.nextInt();
        int W = in.nextInt();

        adj[A][B] = W;
        adj[B][A] = W;
    }

for(int j=0;j是的,可以这样实现它,但它不是最优的。
因为您使用队列而不是优先级队列,所以您可能必须多次展开图的同一部分。因此,您可以使用类似于N^2的内容替换logN(如果我没有弄错的话)

如果您没有多次展开节点(就像您在代码中所做的那样),那么这是错误的,因为您使用的成本高于最小值。假设您有两个节点,其直接链接成本为20,或间接链接通过第三个节点,其两边的成本为1。您可以展开第二个节点,假设最小距离为20(因为它首先到达队列)但如果您等待,您将找到一个成本为2的路径。如果间接路径的成本不明显,请向其添加更多节点

至少做一次线性搜索,找到最小值,使其回到N(设置的总体复杂度O(N^2))。最好的实现是复杂度O((N+M)logN)

代码中的另一个错误是读取数据:

 for(int j=0; j<M; j++){
        int A = in.nextInt();
        int B = in.nextInt();
        int W = in.nextInt();

        adj[A][B] = W;
        adj[B][A] = W;
    }

用于(int j=0;j这两个明显的问题是:1.你为什么要这样做?2.是什么让你认为这是可能的?可能吗?如果不可能,你能解释为什么吗?我只是好奇。Thanks@SSRDIJKSRTA的基础是优先级队列,它就像要求实现合并排序而不合并,这是可能的,但是结果可能是一个差异。完全是nt算法。谢谢@kajacx我明白了。我想它会类似于优先级队列算法。对不起,我的不好。非常感谢!算法需要找到成本最小的节点。这就是优先级队列的用途。但是,如果你能找到成本最小的节点,你可以使用其他结构。例如,原始实现ion使用了一个简单的列表。基本点是最小提取,这是用一个简单的队列无法完成的。两个明显的问题是:1.你为什么要这样做?2.什么让你认为这是可能的?可能吗?如果不可能,你能解释为什么吗?我只是好奇。Thanks@SSRDIKKSRTA的基础是优先级队列,就像问我一样。implement合并排序而不合并。这是可能的,但结果可能会是一个完全不同的算法。谢谢@kajacx,我明白了。我认为它将类似于优先级队列算法。对不起,我的不好。非常感谢!算法需要找到代价最小的节点。这就是优先级队列的用途。但是,哟如果你能找到最小成本节点,你可以使用其他结构。例如,最初的实现使用了一个简单的列表。基本点是最小提取,这不能用一个简单的队列来完成。非常感谢我终于得到了它!你的最好!非常感谢我终于得到了它!你的最好!