最短路径(迪杰斯特拉算法)

来源:互联网 发布:java 字符串压缩算法 编辑:程序博客网 时间:2024/04/29 08:15

1 构造图


2 代码

package leaning.graph;/* * 迪杰斯特拉算法求最短路径 *  * */public class Dijkstra {// 表示V0顶点到v8顶点的最短路径的值private int[] D = new int[9]; // 最短路径private  int[] P = new int[9]; //定义无穷大的数private int MAX = Integer.MAX_VALUE/2;//定义地图变量private int[][] map = new int[9][9];//定义顶点变量private String[] points = {"v0","v1","v2","v3","v4","v5","v6","v7","v8"};//初始化地图public void createMap(){this.map[0] = new int[]{  0,  1,  5,MAX,MAX,MAX,MAX,MAX,MAX};this.map[1] = new int[]{  1,  0,  3,  7,  5,MAX,MAX,MAX,MAX};this.map[2] = new int[]{  5,  3,  0,MAX,  1,  7,MAX,MAX,MAX};this.map[3] = new int[]{MAX,  7,MAX,  0,  2,MAX,  3,MAX,MAX};this.map[4] = new int[]{MAX,  5,  1,  2,  0,  3,  6,  9,MAX};this.map[5] = new int[]{MAX,MAX,  7,MAX,  3,  0,MAX,  5,MAX};this.map[6] = new int[]{MAX,MAX,MAX,  3,  6,MAX,  0,  2,  7};this.map[7] = new int[]{MAX,MAX,MAX,MAX,  9,  5,  2,  0,  4};this.map[8] = new int[]{MAX,MAX,MAX,MAX,MAX,MAX,  7,  4,  0};}//迪杰斯特拉算法核心public void dijkstraCore(){  // 1 定义变量  int[] final_ = new int[9] ; // final_[w]=1 表示已经从顶点V0访问了顶点Vw  // 2 初始化定义变量  for(int i = 0 ; i < this.points.length ;i++){  final_[i] = 0;  P[i] = 0;  D[i] = this.map[0][i];  }  // 3 V0 -> V0节点      final_[0] = 1;   // 4 V0 -> 其它节点     for(int i = 1 ; i < this.points.length ;i++){     int min = this.MAX ;     int k = -1;    // 4.1 得到D带权数组最小值     for(int j = 0 ; j < this.points.length ; j++ ){     if( final_[j]!=1 && min > D[j]){     min = D[j];     k = j;     }     }     final_[k] = 1;    // 4.2 调整 P和D的值     for(int j = 0 ; j < this.points.length ;j++){     if(final_[j]!=1 && ( min + this.map[k][j] ) < D[j] ){    D[j] = min + this.map[k][j];    P[j] = k;     }     }           }    }// 输出v0顶点到pointName顶点的最短路径public void show(String pointName){int position = getNumber(pointName);System.out.println("V0顶点到顶点"+pointName+"\n最短路径值为: "+this.D[position] + " \n路径为 : " + this.getPath(pointName));}// 得到v0顶点到pointName顶点的路径public String getPath(String pointName){StringBuffer path = new StringBuffer();path.append(this.invertStr(pointName));int position = getNumber(pointName);int point = this.P[position];while(point!=0){path.append(" >- " + this.invertStr(this.points[point]) );point = this.P[point];}String pathString = path.append(" >- " + this.invertStr("v0") ).toString();return this.invertStr(pathString);}// 得到字符串从后往前顺序的结果public String invertStr(String str){StringBuffer result = new StringBuffer();for(int i = str.length() -1 ; i >= 0 ; i-- ){result.append(str.charAt(i));}return result.toString();}// 得到pointName在points数组中的位置public int getNumber(String pointName){int position = -1;for(int i = 0 ;  i < this.points.length ;i++  ){if(this.points[i].endsWith(pointName.replace(" ", ""))){position = i;break;}}return position;}public static void main(String[] args) {Dijkstra dijkstra = new Dijkstra();dijkstra.createMap();dijkstra.dijkstraCore();dijkstra.show("v8");}}

3 变量D和变量P解释


4 v0到v8输出结果




0 0
原创粉丝点击