我如何实现Dijkstra只使用队列而不是优先级队列 。这可能吗?如果不是,为什么?这是我在Java中的代码..最新我的错误?
“S”是起始节点“W”是权重“N”是矩阵的大小。自从第一个节点是“1”以来,我在adj矩阵的长度上加了1。Dijkstra算法实现无向优先队列的无向循环图
这是HackerRank链接了一个问题:https://www.hackerrank.com/challenges/dijkstrashortreach
import java.io.*;
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner in = new Scanner (System.in);
int cases = in.nextInt();
for(int i=0; i<cases; i++){
int N = in.nextInt();
int M = in.nextInt();
int adj[][] = new int[N+1][N+1];
for(int j=0; j<N+1; j++){
for(int k=0; k<N+1; k++){
adj[j][k] = 0;
}
}
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 S = in.nextInt();
Queue<Integer> que = new LinkedList<Integer>();
que.add(S);
int dist[] = new int[N+1];
Arrays.fill(dist,Integer.MAX_VALUE);
boolean vis[] = new boolean[N+1];
dist[S] = 0;
vis[S] = true;
while(!que.isEmpty()){
int q = que.poll();
for(int j=1; j<=N; j++){
if(!vis[j]&&q!=j && adj[q][j]!=0){
if(dist[j]>dist[q]+adj[q][j]){
dist[j] = dist[q]+adj[q][j];
que.add(j);
}
}
}
vis[q] = true;
}
for(int j=1; j<=N; j++){
if(dist[j]!=0)
System.out.print(dist[j]+" ");
}
}
}
}
两个明显的问题是1.为什么你想要? 2.什么让你觉得这是可能的? –
是否可能。如果不是,你能解释为什么。我只是好奇 。谢谢 – SSR
@SSR Dijksrta的基础是优先队列。这就像要求实现合并排序而不合并。这是可能的,但结果可能完全是一种不同的算法。 – kajacx