您的位置:首页 > 其它

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

2018-01-30 17:02 274 查看
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
;

//记录起始基点到各顶点的距离,估计值->确定值
int[] dis = new int
;

//对已知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 + " ");
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: