2022-04-23 16:25

迪克斯特拉(迪杰斯特拉-Dijkstra)算法-地铁任意两个站点的最有距离

码自答

其它

(647)

(0)

收藏

迪克斯特拉(迪杰斯特拉-Dijkstra)算法--荷兰计算机科学家迪克斯特拉提出。从一个顶点到其他各个顶点的最短路径算法。

每次遍历从起点开始到未访问过的顶点的最短距离


image.png

字母表示顶点

字母中间的线段,表示两个顶点联通,所以如图所示,A点和C点未联通,不能从A点直接到达C点.

数字表示两个联通的点之间的距离,点B和点F之间的6,表示两点的距离是6.所以从点A到点C,可以是点A-->B-->C,距离是5,也可以是A-->D-->C,距离是10.

下面想要求出从点A开始到各个点之间的最短的距离.


设计一维数组dis,用来存放点A到各个点的最短距离。

image.png


设计一维数组flag,用来存放某点是否已经取得最优路径。flase表示没有取得最优路径。

image.png


设计一维数组pre,用来存放访问某点之前,先访问那点

image.png


设计mat二维数组,用来存放各相邻点之间的距离.

image.png


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条评论

点击登录参与评论