图论-有向带权图的最短路径(Dijkstra)算法

寻找两个顶点之间的最短路径



规则,总是派遣一个代理人到下一个城市,代理人的工作是记录源点到其它城市费用最小信息。
计算费用,构造一个数组,保持从源点到其他顶点的最短距离。在算法执行的过程中这个距离是变化的。直到最后,它存储了从源点开始的真正最短距离。


package com.mapbar.structure;
/**  

 * Class Graph_Dijkstra.java 

 * Description Dijkstra 最短路径算法,用数组替代优先级队列来存储最短距离

 * Company mapbar 

 * author Chenll E-mail: [email protected]

 * Version 1.0 

 * Date 2012-8-30 下午03:46:15

 */

//保存从起始点到当前点的距离以及父节点
class DistPar{
	
	public int distance;
	
	public int parVert;
	
	public DistPar(int pv, int dis){
		this.distance = dis;
		
		this.parVert = pv;
	}
}	

//定义顶点
class Vertex{
	
	public char label;
	
	public boolean isInTree;
	
	public Vertex(char label){
		this.label = label;
		isInTree = false;
	}
}

class Graph{
	
	private final int MAX_VERTX = 20; //节点数
	
	private final int INFINITY = 1000000; //最远距离

	private Vertex vertexList[];

	private int adjMat[][]; //邻接矩阵

	private int nVerts; //记录顶点的个数

	private int nTree; //记录树中顶点的个数

	private int currentVert; //当前顶点
	
	private DistPar sPath[];//最短路径数组,存储源点到其它顶点距离情况。
	
	private int startToCurrent;

	//构造方法
	public Graph() {
		vertexList = new Vertex[MAX_VERTX];
		adjMat = new int[MAX_VERTX][MAX_VERTX];
		nVerts = 0;
		// 初始化矩阵
		for (int i = 0; i < MAX_VERTX; i++) {
			for (int j = 0; j < MAX_VERTX; j++) {
				adjMat[i][j] = INFINITY;
			}
		}
		sPath = new DistPar[MAX_VERTX];
	}

	// 添加顶点
	public void addVertex(char label) {
		vertexList[nVerts++] = new Vertex(label);
	}

	// 添加边
	public void addEdge(int sv, int dv, int dis) {
		adjMat[sv][dv] = dis;
	}
	
	//路径规划
	public void path(){
		int startTree = 0;
		vertexList[0].isInTree = true;
		nTree = 1;
		
		for(int i = 0; i
输出结果:A=INF(A)  B=50(A)  C=100(D)  D=80(A)  E=140(C) 

你可能感兴趣的:(Data,Structure_JAVA,算法)