最短路徑之Dijkstra演算法Java實現
阿新 • • 發佈:2019-02-03
Dijkstra演算法步驟
以下圖為例,求頂點v1到其他頂點的最短路徑
- 初始化dis陣列,怎麼初始化呢?v1→v1設定為0,不能直接到達的設定為無窮大,能直接到達的附權值,並且定義集合T,初始化為{v1},集合T表示已經確定最短路徑的頂點,結果如下:
- 找出dis陣列中最小的值(不包括集合T中的頂點),這裡最小值為 10,所以v1→v3的最短路徑就是10 ,將v3加入到集合T中,T變為{v1,v3},
隨著v3加入集合T中,陣列dis會怎麼變化呢?v3→v4為50,那麼v1→v4可以通過v3中轉v1→v3→v4=10+50=60,因為60 < dis[3],所以dis[3]=60,如圖:
重複步驟2,3,直到頂點全部加入到集合T中,
此題的Java程式碼實現
上面的集合T,在程式碼中用boolean[] visited表示
public class Dijkstra {
public static void main(String[] args) {
int[][] graph=new int[][]{{0,Integer.MAX_VALUE,10,Integer.MAX_VALUE,30,100},
{Integer.MAX_VALUE,0,5,Integer.MAX_VALUE ,Integer.MAX_VALUE,Integer.MAX_VALUE},
{Integer.MAX_VALUE,Integer.MAX_VALUE,0,50,Integer.MAX_VALUE,Integer.MAX_VALUE},
{Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,0,Integer.MAX_VALUE,10},
{Integer.MAX _VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,20,0,60},
{Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,Integer.MAX_VALUE,0}};
int[] dis=new int[6];
boolean[] visited=new boolean[6];
visited[0]=true;
for(int i=0;i<6;i++)
dis[i]=graph[0][i];
dijkstra(graph, dis, visited);
for(int i=0;i<dis.length;i++)
System.out.print(dis[i]+" ");
}
public static void dijkstra(int[][] graph,int[] dis,boolean[] visited){
while(true){
int min=Integer.MAX_VALUE;
int index=-1;
for(int i=0;i<dis.length;i++){
if(visited[i])
continue;
else{
if(dis[i]<min){
index=i;
min=dis[i];
}
}
}
if(index==-1) break;
visited[index]=true;
for(int i=0;i<graph.length;i++){
if(graph[index][i]!=Integer.MAX_VALUE){
dis[i]=dis[i]<(min+graph[index][i])?dis[i]:min+graph[index][i];
}
}
}
}
}