迪杰斯特拉算法(最短路径)
生活随笔
收集整理的這篇文章主要介紹了
迪杰斯特拉算法(最短路径)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
描述
算法過(guò)程
代碼實(shí)現(xiàn)
package com.atguigu.dijkstra;import com.sun.xml.internal.fastinfoset.algorithm.BooleanEncodingAlgorithm;import javax.sound.midi.Soundbank; import java.util.Arrays; import java.util.TimerTask;public class DijkstraAlgorithm {public static void main(String[] args) {char[] vertex = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};//鄰接矩陣int[][] matrix = new int[vertex.length][vertex.length];final int N = 65535;//表示不可連接matrix[0] = new int[]{N, 5, 7, N, N, N, 2};matrix[1] = new int[]{5, N, N, 9, N, N, 3};matrix[2] = new int[]{7, N, N, N, 8, N, N};matrix[3] = new int[]{N, 9, N, N, N, 4, N};matrix[4] = new int[]{N, N, 8, N, N, 5, 4};matrix[5] = new int[]{N, N, N, 4, 5, N, 6};matrix[6] = new int[]{2, 3, N, N, 4, 6, N};//創(chuàng)建Graph對(duì)象Graph graph = new Graph(vertex, matrix);//測(cè)試看看圖的鄰接矩陣是否OKgraph.showGraph();//測(cè)試算法graph.dsj(2);//cgraph.showDijkstra();}}class Graph {private char[] vertex;//頂點(diǎn)數(shù)組private int[][] matrix;//鄰接矩陣private VisitedVertex vv;//已經(jīng)訪問(wèn)的頂點(diǎn)集合//構(gòu)造器public Graph(char[] vertex, int[][] matrix) {this.vertex = vertex;this.matrix = matrix;}//顯示結(jié)果public void showDijkstra(){vv.show();}//顯示圖public void showGraph() {for (int[] link : matrix) {System.out.println(Arrays.toString(link));}}//迪杰斯特拉算法實(shí)現(xiàn)/**** @param index 表示出發(fā)頂點(diǎn)對(duì)應(yīng)的下標(biāo)*/public void dsj(int index){vv = new VisitedVertex(vertex.length, index);update(index);//更新index頂點(diǎn)到周圍頂點(diǎn)的距離和前驅(qū)頂點(diǎn)for (int j = 1; j < vertex.length; j++) {index=vv.updateArr();//選擇并返回新的訪問(wèn)頂點(diǎn)update(index);//更新index頂點(diǎn)到周圍頂點(diǎn)的距離和前驅(qū)頂點(diǎn)}}//更新index下標(biāo)頂點(diǎn)到周圍頂點(diǎn)的距離和周圍頂點(diǎn)的前驅(qū)頂點(diǎn)private void update(int index){int len=0;//根據(jù)遍歷我們的鄰接矩陣的matrix[index].length行for (int j = 0; j < matrix[index].length; j++) {//len含義是:出發(fā)頂點(diǎn)到index頂點(diǎn)的距離+從index頂點(diǎn)到j(luò)頂點(diǎn)的距離的和len=vv.getDis(index)+matrix[index][j];//如果j頂點(diǎn)沒有被訪問(wèn)過(guò),并且len小于出發(fā)頂點(diǎn)到j(luò)頂點(diǎn)的距離,就需要更新if(!vv.in(j)&&len<vv.getDis(j)){vv.updatePre(j,index);//更新j頂點(diǎn)的前驅(qū)為index頂點(diǎn)vv.updateDis(j,len);//更新出發(fā)頂點(diǎn)到j(luò)頂點(diǎn)的距離}}}}// 已訪問(wèn)頂點(diǎn)集合 class VisitedVertex {// 記錄各個(gè)頂點(diǎn)是否訪問(wèn)過(guò) 1表示訪問(wèn)過(guò),0未訪問(wèn),會(huì)動(dòng)態(tài)更新public int[] already_arr;// 每個(gè)下標(biāo)對(duì)應(yīng)的值為前一個(gè)頂點(diǎn)下標(biāo), 會(huì)動(dòng)態(tài)更新public int[] pre_visited;// 記錄出發(fā)頂點(diǎn)到其他所有頂點(diǎn)的距離,比如G為出發(fā)頂點(diǎn),就會(huì)記錄G到其它頂點(diǎn)的距離,會(huì)動(dòng)態(tài)更新,求的最短距離就會(huì)存放到dispublic int[] dis;//構(gòu)造器/***** @param length 表示頂點(diǎn)的個(gè)數(shù)* @param index 出發(fā)頂點(diǎn)對(duì)應(yīng)的下標(biāo),比如G頂點(diǎn),下標(biāo)是6*/public VisitedVertex(int length,int index){this.already_arr=new int[length];this.pre_visited=new int[length];this.dis=new int[length];//初始化dis數(shù)組Arrays.fill(dis,65535);this.already_arr[index]=1;//設(shè)置出發(fā)頂點(diǎn)被訪問(wèn)過(guò)this.dis[index]=0;//是指出發(fā)頂點(diǎn)的訪問(wèn)距離為0}/*** 判斷index頂點(diǎn)是否被訪問(wèn)過(guò)* @param index* @return 如果訪問(wèn)過(guò),就返回true,否則返回false*/public boolean in(int index){return already_arr[index]==1;}/*** 更新出發(fā)頂點(diǎn)到index頂點(diǎn)的距離* @param index* @param len*/public void updateDis(int index,int len){dis[index]=len;}/*** 更新pre這個(gè)頂點(diǎn)的前驅(qū)為index的頂點(diǎn)* @param pre* @param index*/public void updatePre(int pre,int index){pre_visited[pre]=index;}/*** 返回出發(fā)頂點(diǎn)到index頂點(diǎn)的距離* @param index*/public int getDis(int index){return dis[index];}//繼續(xù)選擇并返回新的訪問(wèn)頂點(diǎn),比如這里的G完后,就是A點(diǎn)作為新的訪問(wèn)頂點(diǎn)(注意不是新節(jié)點(diǎn))public int updateArr(){int min=65535,index=0;for (int i = 0; i < already_arr.length; i++) {if(already_arr[i]==0&&dis[i]<min){min=dis[i];index=i;}}//更新index頂點(diǎn)被訪問(wèn)過(guò)already_arr[index]=1;return index;}//顯示最后的結(jié)果//即將三個(gè)數(shù)組的情況輸出public void show(){System.out.println("=================");//輸出already_arrfor(int i:already_arr){System.out.print(i+" ");}System.out.println("=================");//輸出pre_visitedfor(int i:pre_visited){System.out.print(i+" ");}System.out.println("=================");//輸出disfor(int i:dis){System.out.print(i+" ");}System.out.println();//為了好看最后的最短距離,我們處理char[] vertex = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};int count=0;for(int i:dis){if(i!=65535){System.out.print(vertex[count]+"("+i+")");}else{System.out.println("N");}count++;}System.out.println();}}總結(jié)
以上是生活随笔為你收集整理的迪杰斯特拉算法(最短路径)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 教你如何正确选择电脑硬件电脑硬件怎么选择
- 下一篇: 2020蓝桥杯省赛---java---C