单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。

一、最短路径的最优子结构性质

该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的中间顶点,那么P(k,s)必定是从k到s的最短路径。下面证明该性质的正确性。

假设P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,则有P(i,j)=P(i,k)+P(k,s)+P(s,j)。而P(k,s)不是从k到s的最短距离,那么必定存在另一条从k到s的最短路径P'(k,s),那么P'(i,j)=P(i,k)+P'(k,s)+P(s,j)

二、Dijkstra算法

Dijkstra提出按各顶点与源点v间的路径长度的递增次序,生成到各顶点的最短路径的算法。既先求出长度最短的一条最短路径,再参照它求出长度次短的一条最短路径,依次类推,直到从源点v 到其它各顶点的最短路径全部求出为止。

对于下图:

运行结果:

从0出发到0的最短路径为:0-->0

从0出发到1的最短路径为:0-->1

从0出发到2的最短路径为:0-->3-->2

从0出发到3的最短路径为:0-->3

从0出发到4的最短路径为:0-->3-->2-->4

=====================================

从0出   发到0的最短距离为:0

从0出   发到1的最短距离为:10

从0出   发到2的最短距离为:50

从0出   发到3的最短距离为:30

从0出   发到4的最短距离为:60

=====================================

public class Dijkstra {

static int M=10000;//(此路不通)

public static void main(String[] args) {

// TODO Auto-generated method stub

int[][] weight1 = {//邻接矩阵

{0,3,2000,7,M},

{3,0,4,2,M},

{M,4,0,5,4},

{7,2,5,0,6},

{M,M,4,6,0}

};

int[][] weight2 = {

{0,10,M,30,100},

{M,0,50,M,M},

{M,M,0,M,10},

{M,M,20,0,60},

{M,M,M,M,0}

};

int start=0;

int[] shortPath = Dijsktra(weight2,start);

for(int i = 0;i < shortPath.length;i++)

System.out.println("从"+start+"出发到"+i+"的最短距离为:"+shortPath[i]);

}

public static int[] Dijsktra(int[][] weight,int start){

//接受一个有向图的权重矩阵,和一个起点编号start(从0编号,顶点存在数组中)

//返回一个int[] 数组,表示从start到它的最短路径长度

int n = weight.length; //顶点个数

int[] shortPath = new int[n]; //存放从start到其他各点的最短路径

String[] path=new String[n]; //存放从start到其他各点的最短路径的字符串表示

for(int i=0;i

path[i]=new String(start+"-->"+i);

int[] visited = new int[n]; //标记当前该顶点的最短路径是否已经求出,1表示已求出

//初始化,第一个顶点求出

shortPath[start] = 0;

visited[start] = 1;

for(int count = 1;count <= n - 1;count++) //要加入n-1个顶点

{

int k = -1; //选出一个距离初始顶点start最近的未标记顶点

int dmin = Integer.MAX_VALUE;

for(int i = 0;i < n;i++)

{

if(visited[i] == 0 && weight[start][i] < dmin)

{

dmin = weight[start][i];

k = i;

}

}

System.out.println("k="+k);

//将新选出的顶点标记为已求出最短路径,且到start的最短路径就是dmin

shortPath[k] = dmin;

visited[k] = 1;

//以k为中间点,修正从start到未访问各点的距离

for(int i = 0;i < n;i++)

{ // System.out.println("k="+k);

if(visited[i] == 0 && weight[start][k] + weight[k][i] < weight[start][i]){

weight[start][i] = weight[start][k] + weight[k][i];

path[i]=path[k]+"-->"+i;

}

}

}

for(int i=0;i

System.out.println("从"+start+"出发到"+i+"的最短路径为:"+path[i]);

System.out.println("=====================================");

return shortPath;

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

java 有向图 最短路径算法_java使用Dijkstra算法实现单源最短路径相关推荐

  1. 算法复习周------“贪心问题之‘单源最短路径’”

    前几天写完了DP问题,终于把比较困难的几个部分写完了,今天开始我们进入贪心模块.贪心相对与DP来说还是很好理解的.NOW,现在开始第一部分. 算法介绍:给定一个带权有向图,其中的每一条边的权值都是非负 ...

  2. python【数据结构与算法】P3371 【模板】单源最短路径(弱化版)

    import math import cmath import copy import sys import string import heapq import bisect from iterto ...

  3. Dijkstra模板题——单源最短路径(洛谷 P3371)

    题目选自洛谷P3371 这个数据类型可以将两个数据进行打包,比如 pair<int,int> 就是将两个int型进行打包. 而且使用优先队列时,优先队列会根据你打包的第一个数据进行排序. ...

  4. 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法

    Dijkstra算法解决了有向图G=(V,E)上带权的单源最短路径问题,但要求所有边的权值非负. Dijkstra算法是贪婪算法的一个很好的例子.设置一顶点集合S,从源点s到集合中的顶点的最终最短路径 ...

  5. 算法导论之单源最短路径

    单源最短路径,在现实中是很多应用的,是图的经典应用,比如在地图中找出两个点之间的最短距离.最小运费等.单源最短路径的问题:已知图G=(V,E),找出给定源顶点s∈V到每个顶点v∈V的最短路径.单源最短 ...

  6. 【数据结构与算法】【算法思想】Dijkstra算法

    图的两种搜索算法,深度优先搜素和广度优先搜索.这两种算法主要是针对无权图的搜索算法.针对有权图,也就是图中的每条边都有一个权重,该如何计算两点之间的最短路径?最短路径算法(Shortest Path ...

  7. 贪心算法解决单源最短路径问题

    参考教材:算法设计与分析(第3版) 王晓东 编著 清华大学出版社 贪心算法总是做出在当前看来最好的选择,也就是说贪心算法并不从整体最优考虑,它所做出的选择只是在某种意义上的局部最优选择. 贪心算法的基 ...

  8. JAVA编程求单源最短路径_【算法】单源最短路径——dijkstra算法

    一,概念 单源最短路径 给定一个带权有向图G=(V,E),其中每条边的权是一个实数.另外,还给定V中的一个顶点,称为源.要计算从源到其他所有各顶点的最短路径长度.这里的长度就是指路上各边权之和.这个问 ...

  9. Dijkstra 单源最短路径算法 Java实现

    Dijkstra 单源最短路径算法 Java实现 算法导入 算法核心 复杂度分析 时间复杂度 空间复杂度 代码实现 参考资料 结尾 算法导入 在图论中,求最短路径有一个经典的算法 Dijkstra算法 ...

最新文章

  1. 卷积神经网络(CNN)实现CIFAR100类别分类
  2. 使用Windows Live Writer发布日志
  3. Learning Cocos2d-x for WP8(9)——Sprite到哪,我做主
  4. LINUX矩阵键盘简单介绍,stm32矩阵键盘原理图及程序介绍
  5. Redis学习总结(17)——Redis 持久化和过期机制复习
  6. 如何通过SCJP考试(含真题分析和考点)
  7. Qt 运行时不显示图标
  8. java文件的命名_java命名规范
  9. python下拉框二级联动_Excel数据规范输入技巧 | 二级联动下拉菜单
  10. php网页显示左中,php的动态页面在ie内核的浏览器面整体偏左的解决方法静
  11. Techwiz LCD 1D:SRF的颜色分析
  12. 华为血压表WATCH D测量血压的数据可靠吗
  13. Workman使用记录----
  14. opj线性表Placing apples 题解
  15. STM32 USB应用——VCP
  16. 如何将.md文件转换为pdf
  17. 20180210-第三方应用App2SD使用教程【需ROOT】
  18. MATLAB实现RSA加密解密
  19. Ural 1084|Goat in the Gardon|计算几何
  20. photo-sphere-viewer实现VR全景图以及Vue3+Egg在线聊天

热门文章

  1. Xilinx FPGA资源
  2. 【矿渣】【玩客云】玩客云驱动OLED屏幕
  3. c 语言让电脑自动关机,C语言编写简单的定时关机程序
  4. 王自如发致歉声明 称对现有业务进行整改
  5. 基于切比雪夫逼近法的滤波器的matlab设计与实现
  6. Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg. Error: open /proc/sel
  7. Ambiguous method overloading for method ****** 异常的解决办法
  8. C语言 输入一个正整数,判断它是素数还是合数
  9. 当 Python 遇到数据库,这个模块就变得超级好用
  10. mkv视频怎么转成mp4?