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

Posted 清风明月coder

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短路径(迪杰斯特拉算法)相关的知识,希望对你有一定的参考价值。

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输出结果




开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系

以上是关于最短路径(迪杰斯特拉算法)的主要内容,如果未能解决你的问题,请参考以下文章

1003 Emergency(考察迪杰斯特拉算法+第二标尺)

编写的迪杰斯特拉算法求最短路径,运行不正确?

图的应用——最短路径(迪杰斯特拉算法)

(王道408考研数据结构)第六章图-第四节4:最短路径之迪杰斯特拉算法(思想代码演示答题规范)

数据结构之最短路径 [迪杰斯特拉算法]

图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP