Dijkstra算法---单源最短路径

package com.xjj.Ah;

/*-------Dijkstra算法---单源最短路径-----
 * --求最短路径-----如果两点间的直接距离  > 引入第三点间的间接距离
 * 
 * 1.一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”
 * 2.已知最短路程的顶点集合P,未知最短路径的顶点集合Q
 * 3.通过“边”来--松弛--基顶点到其余各个顶点的路程
 * 
 * 4.dis数组中所有的值都已经从“估计值”变为了“确定值”, book[]标记该点是否已经找到最小值(如集合P)
 * 
 * 5.0代表第一个节点,不能解决带负权边
 * 6.贪心思想,局部最优解
 * 
 * 7.此为邻接矩阵实现
 * */
public class Dijkstra1 {
 	static int Inf = Integer.MAX_VALUE;
	
	public static int[] method(int[][] a){
		int n = a.length, min, u = 0;
		//记录已知最短顶点P
		int[] book = new int[n];
		
		//记录起始基点到各顶点的距离,估计值->确定值
		int[] dis = new int[n];
		
		//对已知P初始化,如果book[i]==1则表示这个顶点在集合P中,
		//如果book[i]==0则表示这个顶点在集合Q中 ;
		for(int i = 0; i < n; i++)
			book[i] = 0;
		book[0] = 1;			//起始基点
		
		//起始基点到各顶点的距离 = 原数组第一行数
		for(int i = 0; i < n; i++)
			dis[i] = a[0][i];
		
		System.out.print("加入P集合的顶点顺序为:  0 ");
		
		
		//Dijkstra算法核心
		//更新基点
		for(int t = 1; t < n; t++){
			//每次将最小值大化
			min = Inf;
			//在所有顶点中找到到基点的最短距离;  dis[i] < Inf: 说明能到达
			for (int i = 1; i < n; i++)
				if (book[i] == 0 && dis[i] < min) {
					min = dis[i];
					u = i;
				}
			System.out.print(u + " ");
			//将其加入到P集合中,标记该基点已经找到最小值
			book[u] = 1;
			
			//将其换为基点,到其他顶点的距离
			for (int v = 0; v < n; v++)
				if (a[u][v] < Inf) {
					//如果两点间的直接距离 > 引入第三点间的间接距离
					if (dis[v] > dis[u] + a[u][v]) {
						dis[v] = dis[u] + a[u][v];
					}
				}
		}
		return dis;
	}
	
	public static void main(String[] args) {
		int[][] a = {{0,1,12,Inf,Inf,Inf},{Inf,0,9,3,Inf,Inf},{Inf,Inf,0,Inf,5,Inf},
				{Inf,Inf,4,0,13,15},{Inf,Inf,Inf,Inf,0,4},{Inf,Inf,Inf,Inf,Inf,0}};
		int[] b = method(a);
		
		System.out.println();
		System.out.print("0顶点到其他顶点的最小距离:  ");
		for (int i : b) {
			System.out.print(i + " ");
		}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值