博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最短路径算法---狄杰斯特拉算法
阅读量:3960 次
发布时间:2019-05-24

本文共 2920 字,大约阅读时间需要 9 分钟。

最短路径算法—狄杰斯特拉算法

一.介绍

这是一种按照路径长度递增的次序产生最短路径的算法,采用的是贪心的思想,对带权图(有向和无向均可)寻找最短路径;该算法对于不含负权的网来说,是目前已知的最快的单源最短路径算法,时间复杂度为o(n^2)

二.算法介绍与代码实现

首先我们看以这张图为例:

在这里插入图片描述
该图的领接矩阵表示为:
在这里插入图片描述
1.首先我们需要三个数组(数组下标从1开始)
mark:用来标记单源顶点(我们这里取为顶点1)到该顶点的最短路径是否已经求到了
dist:标志单源顶点到该顶点的最短路径长度
path:表示到该节点的前驱节点
2.三个数组初始化
mark: 1 0 0 0 0
dist: 0 3 ∝ {\propto} ∝ {\propto} 30
path: 0 1 1 1 1
3.算法开始
狄杰斯特拉算法的核心思想是通过已有的最短路径以他为参照来优化到其他顶点的最短路径。
简单的概括过程就是每次从mark=0的顶点中去寻找dist最小的那个点那么这个点的最短路径就找到了,接下来从该顶点出发把剩下的mark=0的顶点的dist进行一遍优化(注意是优化,此时不一定是最短的路径),当然在上述过程中要注意对mark与path的更新,下面我们用上面的例子演示一下。
mark: 1 0 0 0 0
dist: 0 3 ∝ {\propto} ∝ {\propto} 30
path: 0 1 1 1 1
找从mark=0最小的dist,即3,于是更新得到,mark[2]=1,path[2]就是1不用更新,然后用得到的新的最短路径去更新剩下的mark=0,那么有dist[3]=3+25< ∝ {\propto} ,dist[4]=3+8< ∝ {\propto} ,dist[5]仍然为30,因为3+ ∝ {\propto} >30,同时更新path[3]=2,path[4]=2
此时:
mark: 1 1 0 0 0
dist: 0 3 28 11 30
path: 0 1 2 2 1
接下来按照上面的方式最后得到
在这里插入图片描述
4.代码实现

import org.junit.Test;import java.util.Scanner;public class Test1 {
int INFINITY = 65535; int [][]Vertex={
{
}, {
0,0,3,INFINITY,INFINITY,30}, {
0,INFINITY,0,25,8,INFINITY}, {
0,INFINITY,INFINITY,0,INFINITY,10}, {
0,20,INFINITY,4,0,12}, {
0,5,INFINITY,INFINITY,INFINITY,0} };//领接矩阵 int []mark={
0,1,0,0,0,0}; int []path={
0,0,1,1,1,1}; int []dist={
0,0,3,INFINITY,INFINITY,30}; @Test public void Test() {
Dijstra(5); for(int i=1;i<=5;i++){
System.out.print(mark[i]+" "); } System.out.println(); for(int i=1;i<=5;i++){
System.out.print(dist[i]+" "); } System.out.println(); for(int i=1;i<=5;i++){
System.out.print(path[i]+" "); } } //传入顶点数 void Dijstra(int n){
int marknum=n-1;//记录0的个数 int index; while (marknum>=1) {
index = Find(n); mark[index]=1;//表示找到最短路径了 for(int i=1;i<=n;i++){
if(mark[i]==0&&Vertex[index][i]+dist[index]

输出:

1 1 1 1 1 0 3 15 11 23 0 1 4 2 4

当然上面的图的信息都是直接保存在数组里面,我们也可以定义Graph类,在构造方法中完成初始化

//定义图类class Graph{
int INFINITY = 65535; int [][]Vertex;//领接矩阵 int []mark; int []path; int []dist; String[] name;//记录每个节点的别名 Scanner scanner; public Graph(){
//输入节点的个数 scanner = new Scanner(System.in); System.out.println("请输入顶点的个数"); int n = scanner.nextInt(); System.out.println("请输入边的个数"); int numEdge = scanner.nextInt(); mark = new int[n+1]; mark[1]=1; path = new int[n+1]; for(int i=1;i<=n;i++) path[i]=1; dist = new int[n+1]; Vertex = new int[n+1][n+1]; for(int i=0;i
=1) {
index = Find(n); mark[index]=1;//表示找到最短路径了 for(int i=1;i<=n;i++){
if(mark[i]==0&&Vertex[index][i]+dist[index]

转载地址:http://qplzi.baihongyu.com/

你可能感兴趣的文章
git revert reset 使用
查看>>
一些比较好的golang安全项目
查看>>
HTTP状态码
查看>>
go语言
查看>>
mysql mariaDB 以及存储引擎
查看>>
游戏行业了解介绍
查看>>
linux at 命令使用
查看>>
Go在windows下执行命令行指令
查看>>
inotify
查看>>
inode
查看>>
Shell: sh,bash,csh,tcsh等shell的区别
查看>>
golang ubuntu 配置 笔记
查看>>
vim 常用命令
查看>>
golang 开源项目
查看>>
ubntu 开发服务进程
查看>>
linux 常用命令以及技巧
查看>>
记录1年免费亚马逊AWS云服务器申请方法过程及使用技巧
查看>>
golang文章
查看>>
一些特殊的符号
查看>>
shell脚本的exit问题(退出脚本还是退出终端)
查看>>