迪克斯特拉(迪杰斯特拉-Dijkstra)算法--荷兰计算机科学家迪克斯特拉提出。从一个顶点到其他各个顶点的最短路径算法。
每次遍历从起点开始到未访问过的顶点的最短距离
字母表示顶点
字母中间的线段,表示两个顶点联通,所以如图所示,A点和C点未联通,不能从A点直接到达C点.
数字表示两个联通的点之间的距离,点B和点F之间的6,表示两点的距离是6.所以从点A到点C,可以是点A-->B-->C,距离是5,也可以是A-->D-->C,距离是10.
下面想要求出从点A开始到各个点之间的最短的距离.
设计一维数组dis,用来存放点A到各个点的最短距离。
设计一维数组flag,用来存放某点是否已经取得最优路径。flase表示没有取得最优路径。
设计一维数组pre,用来存放访问某点之前,先访问那点
设计mat二维数组,用来存放各相邻点之间的距离.
1000表示两点没有相连,或者是点自己本身.
代码:
package com.wanmait.demo; import java.util.Arrays; public class Demo { private char point[] = {'A','B','C','D','E','F'}; private int dis[] = new int[point.length];//A到个顶点的最短距离 //dis[2]存放A点到C的最短距离 private boolean flag[] = new boolean[point.length]; //标记各点距离是否最优 如果flag[3]的值为true 表示A到D的距离已经是最优 private char pre[] = new char[point.length]; //对应的访问各点之前 先访问的点 例如pre[2]为D 表示访问C之前先访问D private int[][] mat = new int[point.length][point.length]; //相邻点之间的距离 //start起始点的下标 找point[start]点到各点的最优距离 public void search(int start) { Arrays.fill(dis, 1000);//默认最优距离都是1000 dis[start] = 0;//起始点到起始点自己的最优距离是0 this.update(start); //更新起点到各个直接到达的点的距离 //除了起始点之外 其他的各点的最优距离 for (int i = 0; i < point.length-1; i++) { //从没有确定最优距离的点中间 找最小距离和点下标 int minIndex = -1; int minDis = 1000; for(int j=0;j<point.length;j++) { if(flag[j]==false&&dis[j]<minDis) { minIndex = j; minDis = dis[j]; } } //更新最小距离的点到其他各点的距离 this.update(minIndex); } } //更新某个点 到其他各点之间的最短距离 //index下标对应的点到各点之间的距离 public void update(int index) { flag[index] = true;//标记index下标对应的点,已经访问过 for(int i=0;i<point.length;i++) { if(flag[i]==false)//下标i对应的点还没有最优路径 { int length = dis[index]+mat[index][i]; if(length<dis[i])//通过index对应的点到i对应的点的距离笔保存的距离要短 { dis[i] = length;//保存最优距离 pre[i] = point[index];//保存访问i对应的点之前 先访问index对应的点 } } } } //设置相邻点的距离 1000表示相邻点不能联通 public void init() { mat[0] = new int[]{1000,3,1000,7,2,1000}; mat[1] = new int[]{3,1000,2,1000,1000,6}; mat[2] = new int[]{1000,2,1000,3,1000,1000}; mat[3] = new int[]{7,1000,3,1000,4,1000}; mat[4] = new int[]{2,1000,1000,4,1000,5}; mat[5] = new int[]{1000,6,1000,1000,5,1000}; } }
package com.wanmait.demo; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Demo demo = new Demo(); demo.init(); demo.search(0); } }
0条评论
点击登录参与评论