java 有向图 最短路径算法_java使用Dijkstra算法实现单源最短路径
单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径。在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质。
一、最短路径的最优子结构性质
该性质描述为:如果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算法实现单源最短路径相关推荐
- 算法复习周------“贪心问题之‘单源最短路径’”
前几天写完了DP问题,终于把比较困难的几个部分写完了,今天开始我们进入贪心模块.贪心相对与DP来说还是很好理解的.NOW,现在开始第一部分. 算法介绍:给定一个带权有向图,其中的每一条边的权值都是非负 ...
- python【数据结构与算法】P3371 【模板】单源最短路径(弱化版)
import math import cmath import copy import sys import string import heapq import bisect from iterto ...
- Dijkstra模板题——单源最短路径(洛谷 P3371)
题目选自洛谷P3371 这个数据类型可以将两个数据进行打包,比如 pair<int,int> 就是将两个int型进行打包. 而且使用优先队列时,优先队列会根据你打包的第一个数据进行排序. ...
- 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法
Dijkstra算法解决了有向图G=(V,E)上带权的单源最短路径问题,但要求所有边的权值非负. Dijkstra算法是贪婪算法的一个很好的例子.设置一顶点集合S,从源点s到集合中的顶点的最终最短路径 ...
- 算法导论之单源最短路径
单源最短路径,在现实中是很多应用的,是图的经典应用,比如在地图中找出两个点之间的最短距离.最小运费等.单源最短路径的问题:已知图G=(V,E),找出给定源顶点s∈V到每个顶点v∈V的最短路径.单源最短 ...
- 【数据结构与算法】【算法思想】Dijkstra算法
图的两种搜索算法,深度优先搜素和广度优先搜索.这两种算法主要是针对无权图的搜索算法.针对有权图,也就是图中的每条边都有一个权重,该如何计算两点之间的最短路径?最短路径算法(Shortest Path ...
- 贪心算法解决单源最短路径问题
参考教材:算法设计与分析(第3版) 王晓东 编著 清华大学出版社 贪心算法总是做出在当前看来最好的选择,也就是说贪心算法并不从整体最优考虑,它所做出的选择只是在某种意义上的局部最优选择. 贪心算法的基 ...
- JAVA编程求单源最短路径_【算法】单源最短路径——dijkstra算法
一,概念 单源最短路径 给定一个带权有向图G=(V,E),其中每条边的权是一个实数.另外,还给定V中的一个顶点,称为源.要计算从源到其他所有各顶点的最短路径长度.这里的长度就是指路上各边权之和.这个问 ...
- Dijkstra 单源最短路径算法 Java实现
Dijkstra 单源最短路径算法 Java实现 算法导入 算法核心 复杂度分析 时间复杂度 空间复杂度 代码实现 参考资料 结尾 算法导入 在图论中,求最短路径有一个经典的算法 Dijkstra算法 ...
最新文章
- 卷积神经网络(CNN)实现CIFAR100类别分类
- 使用Windows Live Writer发布日志
- Learning Cocos2d-x for WP8(9)——Sprite到哪,我做主
- LINUX矩阵键盘简单介绍,stm32矩阵键盘原理图及程序介绍
- Redis学习总结(17)——Redis 持久化和过期机制复习
- 如何通过SCJP考试(含真题分析和考点)
- Qt 运行时不显示图标
- java文件的命名_java命名规范
- python下拉框二级联动_Excel数据规范输入技巧 | 二级联动下拉菜单
- php网页显示左中,php的动态页面在ie内核的浏览器面整体偏左的解决方法静
- Techwiz LCD 1D:SRF的颜色分析
- 华为血压表WATCH D测量血压的数据可靠吗
- Workman使用记录----
- opj线性表Placing apples 题解
- STM32 USB应用——VCP
- 如何将.md文件转换为pdf
- 20180210-第三方应用App2SD使用教程【需ROOT】
- MATLAB实现RSA加密解密
- Ural 1084|Goat in the Gardon|计算几何
- photo-sphere-viewer实现VR全景图以及Vue3+Egg在线聊天
热门文章
- Xilinx FPGA资源
- 【矿渣】【玩客云】玩客云驱动OLED屏幕
- c 语言让电脑自动关机,C语言编写简单的定时关机程序
- 王自如发致歉声明 称对现有业务进行整改
- 基于切比雪夫逼近法的滤波器的matlab设计与实现
- Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg. Error: open /proc/sel
- Ambiguous method overloading for method ****** 异常的解决办法
- C语言 输入一个正整数,判断它是素数还是合数
- 当 Python 遇到数据库,这个模块就变得超级好用
- mkv视频怎么转成mp4?