我如何實現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