在带权图(网)里,点A到点B所有路径中边的权值之和为最短的那一条路径,称为A,B两点之间的最短路径;并称路径上的第一个顶点为源点(Source),最后一个顶点为终点(Destination)。在无权图中,最短路径则是两点之间经历的边数最少的路径。实际上,只要把无权图上的每条边都看成是权值为1的边,那么无权图和带权图的最短路径是一致的。
   给定一个带权有向图G=(V,E),指定图G中的某一个顶点的V为源点,求出从V到其他各顶点之间的最短路径,这个问题称为单源点最短路径问题。
   迪杰斯特拉(Dijkstra)根据若按长度递增的次序生成从源点v0到其它顶点的最短路径,则当前正在生成的最短路径上除终点外,其余顶点的最短路径均已生成的这一思想,提出了按路径长度递增的次序产生最短路径的算法(在此,路径长度为路径上边和弧的权值之和)。Dijkstra算法的思想是:对带权有向图G=(V,E),设置两个顶点集合S和T=V-S;凡是以v0为源点并已确定了最短路径的终点(顶点)都并入到集合S,集合S的初态只含有源点v0;而未确定其最短路径的顶点均属于集合T,初态时集合T包含除了源点v0之外的其他顶点。按照各顶点与v0间最短路径的长度递增的次序,逐个把集合T中的各顶点的路径长度。并且,集合S中每加入一个新的顶点u,都要修改源点v0到集合T中剩余顶点的最短路径长度;也即,集合T中各顶点v新的最短路径长度值或是原来最短路径长度值,或是顶点u的最短路径长度值再加上顶点u到顶点v的路径长度值之和这两者中的较小值。这种把集合T中的顶点加入到集合S中的过程不断重复,直到集合T的顶点全部加入到集合S中为止。
   Dijkstra算法的实现中,以二维数组gm作为n个顶点带权有向图G=(V,E)的存储结构,并设置一个一维数组s(下标是0~n-1)用来标记集合S中已找到最短路径的顶点,而且规定:如果s[i]为0,则表示未找到源点v0到顶点vi的最短路径,也即此时vi在集合T中;如果s[i]为1,则表示已找到源点v0到顶点vi的最短路径(此时vi在集合S中).除了数组s外,还设置了一个数组dist(下标是0~n-1),用来保存从源点v0到终点vi的当前最短路径的长度.dist的初值为<v0,vi>边上的权值;若v0到vi没有边,则权值为&(无穷)。此后每当有一个新的顶点进入集合S中时,dist[i]值可能被修改变小.一维数组path(下标是0~n-1)用于保存最短路径长度中路径上边所经过的顶点序列;其中,path[i]保存从源点v0到终点vi当前最短路径中前一个顶点编号,它的初值是:如果v0到vi有边则置path[i]为v0的编号;如果v0到vi没有边则置path[i]为-1.
 参考代码:

  1. #include<stdio.h>
  2. #define MAXSIZE 6
  3. #define INF 32767
  4.  
  5. void Ppath(int path[],int i,int v0)//先序递归查找最短路径(源点为v0)上的顶点
  6. {
  7. int k;
  8. k=path[i];
  9. if(k!=v0)//顶点Vk不是源点V0时
  10. {
  11. Ppath(path,k,v0);//递归查找顶点Vk的前一个顶点
  12. printf("%d,",k);//输出顶点Vk
  13. }
  14. }
  15.  
  16. void Dispath(int dist[],int path[],int s[],int v0,int n)//输出最短路径
  17. {
  18. int i;
  19. for(i=;i<n;i++)
  20. if(s[i]==)//顶点Vi在集合S中
  21. {
  22. printf("从%d到%d的最短路径长度为:%d,路径为:",v0,i,dist[i]);
  23. printf("%d,",v0);//输出路径上的源点v0;
  24. Ppath(path,i,v0);//输出路径上的中间顶点vi
  25. printf("%d\n",i);//输出路径上的终点
  26. }
  27. else
  28. printf("从%d到%d不存在路径\n",v0,i);
  29. }
  30.  
  31. void Dijkstra(int gm[][MAXSIZE],int v0,int n)//Dijkstra算法
  32. {
  33. int dist[MAXSIZE],path[MAXSIZE],s[MAXSIZE];
  34. int i,j,k,mindis;
  35. for(i=;i<n;i++)
  36. {
  37. dist[i]=gm[v0][i];//v0到vi的最短路径初值赋给dist[i]
  38. s[i]=;//s[i]=0表示顶点vi属于T集
  39. if(gm[v0][i]<INF)//路径初始化,INF为可取的最大常数
  40. path[i]=v0;
  41. else
  42. path[i]=-;//v0到vi没有边
  43. }
  44. s[v0]=;path[v0]=;//V0并入集合S且V0当前最短路径中无前一个顶点
  45. for(i=;i<n;i++)//对除V0外的n-1个顶点寻找最短路径,即循环n-1次
  46. {
  47. mindis=INF;
  48. for(j=;j<n;j++)//从当前集合T中选择一个路径长度最短的顶点Vk
  49. if(s[j]==&&dist[j]<mindis)
  50. {
  51. k=j;
  52. mindis=dist[j];
  53. }
  54. s[k]=;//顶点Vk加入集合S中
  55. for(j=;j<n;j++)//调整源点v0到集合T中任一顶点Vj的路径长度
  56. if(s[j]==)//顶点vj在集合T中
  57. if(gm[k][j]<INF&&dist[k]+gm[k][j]<dist[j])//当V0到Vj的路径长度小于V0到Vk和Vk到Vj的路径长度时
  58. {
  59. dist[j]=dist[k]+gm[k][j];
  60. path[j]=k;//Vk是当前最短路径中Vj的前一个顶点
  61. }
  62. }
  63. Dispath(dist,path,s,v0,n);//输出最短路径
  64. }
  65.  
  66. void main()
  67. {
  68. int g[MAXSIZE][MAXSIZE]={{INF,,,INF,INF,INF},{,INF,INF,INF,,},{INF,,INF,INF,INF,},
  69. {INF,INF,INF,INF,INF,INF},{INF,INF,INF,,INF,INF},{INF,INF,INF,,,INF}};//定义邻接矩阵g
  70. Dijkstra(g,,);//求顶点0的最短路径
  71. }

输出:

带权有向图及邻接矩阵示意:

单源点最短路径的Dijkstra算法的更多相关文章

  1. 单源最短路径(dijkstra算法)php实现

    做一个医学项目,当中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路例如以下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么( ...

  2. 【算法设计与分析基础】25、单起点最短路径的dijkstra算法

    首先看看这换个数据图 邻接矩阵 dijkstra算法的寻找最短路径的核心就是对于这个节点的数据结构的设计 1.节点中保存有已经加入最短路径的集合中到当前节点的最短路径的节点 2.从起点经过或者不经过 ...

  3. 【算法导论】单源最短路径之Dijkstra算法

    Dijkstra算法解决了有向图上带正权值的单源最短路径问题,其运行时间要比Bellman-Ford算法低,但适用范围比Bellman-Ford算法窄. 迪杰斯特拉提出的按路径长度递增次序来产生源点到 ...

  4. 单源最短路径:Dijkstra算法(堆优化)

    前言:趁着对Dijkstra还有点印象,赶快写一篇笔记. 注意:本文章面向已有Dijkstra算法基础的童鞋. 简介 单源最短路径,在我的理解里就是求从一个源点(起点)到其它点的最短路径的长度. 当然 ...

  5. 单源最短路径问题-Dijkstra算法

    同样是层序遍历,在每次迭代中挑出最小的设置为已知 ===================================== 2017年9月18日10:00:03 dijkstra并不是完全的层序遍历 ...

  6. 0016:单源最短路径(dijkstra算法)

    题目链接:https://www.luogu.com.cn/problem/P4779 题目描述:给定一个 n 个点,m 条有向边的带非负权图,计算从 s 出发,到每个点的距离. 这道题就是一个单源最 ...

  7. 单源最短路径问题(dijkstra算法 及其 优化算法(优先队列实现))

    #define _CRT_SECURE_NO_WARNINGS /* 7 10 0 1 5 0 2 2 1 2 4 1 3 2 2 3 6 2 4 10 3 5 1 4 5 3 4 6 5 5 6 9 ...

  8. Dijkstra单源点最短路径算法

    学习参考: Dijkstra算法(单源最短路径) 最短路径—Dijkstra算法和Floyd算法 使用的图结构: 邻接矩阵: -1 20 -1 25 80-1 -1 40 -1 -1-1 -1 -1 ...

  9. Bellman-Ford & SPFA 算法——求解单源点最短路径问题

    Bellman-Ford算法与另一个非常著名的Dijkstra算法一样,用于求解单源点最短路径问题.Bellman-ford算法除了可求解边权均非负的问题外,还可以解决存在负权边的问题(意义是什么,好 ...

随机推荐

  1. Python学习笔记(Django篇)——3、创建第一个数据库模型

    Django里面集成了SQLite的数据库,对于初期研究来说,可以用这个学习.   第一步,创建数据库就涉及到建表等一系列的工作,在此之前,要先在cmd执行一个命令: python manage.py ...

  2. sql service (case when then else end ..... group by)

    1. 原表: courseid coursename score ------------------------------------- 1 java 70 2 oracle 90 3 xml 4 ...

  3. PowerDesigner逆向生成

    人越长大话越少,我们不再说今天受了委屈,不再说谁谁谁不理我了我好难过,不再分享生活中的琐事. 我知道人和人之间没法互相理解,大家都很忙,针也没扎在别人身上. 所以把那些还没说出口的话消化在每一步走过的 ...

  4. 关于微信内置浏览器安卓端session丢失问题

    项目上线测试,发现微信安卓端存在用户登录无法验证session情况, 导致每次接口请求都无法识别,而苹果客户端不会出现此问题,非微信环境打开不会出现此问题,找到一些解决方案做下记录: 方案1: 由于微 ...

  5. JSP动态合并单元格

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <table ...

  6. mysql 事务,锁,与四大隔离级别

    概念 事务 原子性:事务必须是一个自动工作的单元,要么全部执行,要么全部不执行. 一致性:事务结束的时候,所有的内部数据都是正确的. 隔离性:并发多个事务时,各个事务不干涉内部数据,处理的都是另外一个 ...

  7. [洛谷P1527] [国家集训队]矩阵乘法

    洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...

  8. python字符串内置函数

    1.字符串 定义:它是一个有序的字符的集合,用于存储和表示基本的文本信息,‘’或“”或‘’‘ ’‘’中间包含的内容称之为字符串特性:1.只能存放一个值2.不可变3.按照从左到右的顺序定义字符集合,下标 ...

  9. Data Mining的十种分析方法——摘自《市场研究网络版》谢邦昌教授

    Data Mining的十种分析方法: 记忆基础推理法(Memory-Based Reasoning:MBR)        记忆基础推理法最主要的概念是用已知的案例(case)来预测未来案例的一些属 ...

  10. 头像截取 图片上传 js插件

    先看一下整体效果 页面html <div class="row"> <div class="tabs-container"> <u ...