问题描述:一个带权有向图G与源点v,求从源点v到G中其他顶点的最短路径,并限定各边权值大于0

它的思想在于,对顶点集划分为两组,第一组为已经求出的最短路径的集合(S),期初只有一个顶点,此后每求出一个最短路径v,....u,将顶点u加入集合S中,知道全部顶点U加入到S中,第二组即为未确最短路径的顶点集合。当然,更详细的解释可以参考书本

图:

略(0.0~)

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <iostream>
  4. using namespace std;
  5. #define INFINITY 32767//假设权值不超过INFINITY
  6. #define MAX_VERTEX_NUM 20
  7. #define TRUE true
  8. #define FALSE false
  9. typedef char VertexType;
  10. typedef enum{DG,DN,UDG,UDN}GraphKind;//有向图,有向网,无向图,无向网
  11.  
  12. typedef struct
  13. { // 图的定义
  14. VertexType vexs[MAX_VERTEX_NUM]; //顶点信息
  15. int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
  16. int vexnum; // 图的当前顶点数
  17. int arcnum; //图的边数
  18. GraphKind kind; // 图的种类标志
  19. }MGraph;
  20.  
  21. int LocateVex(MGraph G,VertexType v)
  22. {
  23. int i;
  24. for(i=0;i<G.vexnum;i++)
  25. {
  26. if(v==G.vexs[i]) return i;
  27. }
  28. return -1;
  29. }
  30.  
  31. void CreateDG(MGraph &G)
  32. {
  33. int i,j,k,w; char flag;
  34. VertexType v1,v2;
  35. G.kind = DG;
  36. printf("请输入有向图的顶点数、边数\n");
  37. scanf("%d %d",&G.vexnum,&G.arcnum);
  38. printf("请依次输入顶点信息\n");
  39. for(i=0;i<G.vexnum;i++)
  40. {
  41. cout<<"第"<<i+1<<"个顶点为:";
  42. cin>>G.vexs[i];
  43. for(j=0;j<i;j++)
  44. {
  45. if(G.vexs[j]==G.vexs[i])break;
  46. }
  47. if(j<i)
  48. {
  49. i--;
  50. printf("已存在这样的顶点,请重新输入!\n");
  51. continue;
  52. }
  53. }
  54.  
  55. for(i=0;i<G.vexnum;i++)
  56. {
  57. for(j=0; j<G.vexnum; j++) G.arcs[i][j]=INFINITY;
  58. }
  59.  
  60. for(k=0;k<G.arcnum;k++)
  61. {
  62. cout<<"请输入一条弧尾:";
  63. cin>>v1;
  64. cout<<"请输入一条弧头:";
  65. cin>>v2;
  66. cout<<"请输入相应边的权值:";
  67. cin>>w;
  68. i=LocateVex(G,v1); j=LocateVex(G,v2);
  69. if(G.arcs[i][j]==INFINITY)
  70. {
  71. G.arcs[i][j]=w;
  72. }
  73. else
  74. {
  75. printf("已存在该边,是否要重新确定其权值?按下“Y”确定,按其他键继续输入其它边\n");
  76. scanf("%c",&flag);
  77. if(flag=='y'||flag=='Y')
  78. {
  79. G.arcs[i][j]=w;
  80. }
  81. k--;
  82. }
  83. }//end of for
  84. }
  85.  
  86. void Dijkstra(MGraph G,int v0,bool P[][MAX_VERTEX_NUM], int D[])
  87. {
  88. int final[MAX_VERTEX_NUM];
  89. int v,i,j,w; int min;
  90. for(v=0;v<G.vexnum;++v)
  91. {
  92. final[v]=FALSE; D[v]=G.arcs[v0][v];
  93. for(w=0;w<G.vexnum;++w) P[v][w]=FALSE;
  94. if(D[v]<INFINITY) {P[v][v0]=TRUE;P[v][v]=TRUE;}
  95. }
  96. D[v0]=0; final[v0]=TRUE;
  97. for(i=1;i<G.vexnum;++i)//其余G.vexnum-1个顶点
  98. {
  99. min=INFINITY;
  100. for(w=0; w<G.vexnum; ++w)
  101. {
  102. if(!final[w] && D[w]<min)
  103. {
  104. v=w; min=D[w];
  105. }
  106. }
  107. final[v]=TRUE;
  108. for(w=0;w<G.vexnum;++w)
  109. {
  110. if(!final[w] && min+G.arcs[v][w]<D[w])
  111. {
  112. D[w]=min+G.arcs[v][w];
  113. for(j=0;j<G.vexnum ;++j) P[w][j]=P[v][j];
  114. P[w][w]=TRUE;
  115. }
  116. }
  117. }
  118. }
  119.  
  120. int main()
  121. {
  122. MGraph G; char v;int v0,i,j;
  123. int D[MAX_VERTEX_NUM];
  124. bool P[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
  125. CreateDG(G); printf("请输入源点编号:");
  126. cin>>v; v0=LocateVex(G,v); Dijkstra(G,v0,P,D);
  127. for(i=0;i<G.vexnum;i++)
  128. {
  129. printf("编号为%c的顶点到编号为%c的顶点的最短路径长度为:%d,路经为:",v,G.vexs[i],D[i]);
  130. for(j=0;j<G.vexnum&&P[i][j];j++) printf("%c ",G.vexs[j]);
  131. printf("\n");
  132. }
  133. }

  运行结果:

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

  1. 最短路径-Dijkstra算法与Floyd算法

    一.最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1    ADE:2   ADCE:3   ABCE:3 ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径 ...

  2. 最短路径——Dijkstra算法以及二叉堆优化(含证明)

    一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...

  3. 有向网络(带权的有向图)的最短路径Dijkstra算法

    什么是最短路径? 单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值) 什么是最短路径问题? 给定一带权图,图中每条边的权值是非负的,代表着两顶点 ...

  4. Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  5. 网络最短路径Dijkstra算法

    最近在学习算法,看到有人写过的这样一个算法,我决定摘抄过来作为我的学习笔记: <span style="font-size:18px;">/* * File: shor ...

  6. 单源最短路径Dijkstra算法,多源最短路径Floyd算法

    1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...

  7. 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )

    数据结构实验之图论七:驴友计划 Time Limit: 1000 ms           Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

  8. 求两点之间最短路径-Dijkstra算法

     Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...

  9. 最短路径—Dijkstra算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...

随机推荐

  1. zfs文件系统简单使用

    关于ubuntu下zfs的使用参考:https://github.com/zfsonlinux/zfs/wiki/Ubuntu%2016.04%20Root%20on%20ZFS 安装zfs: 启动z ...

  2. Http Header信息

    REMOTE_ADDR – 访问客户端的 IP 地址 HTTP_VIA – 如果有该条信息, 就证明您使用了代理服务器,代理服务器的地址就是后面的数值. HTTP_X_FORWARDED_FOR – ...

  3. 节流throttle和防抖debounce

    underscore.js提供了很多很有用的函数,今天想说说其中的两个.这两个函数都用于限制函数的执行. debounce 在解释这个函数前,我们先从一个例子看下这个函数的使用场景.假设我们网站有个搜 ...

  4. css3 resize属性

    http://www.w3school.com.cn/cssref/pr_resize.asp 实例 规定可以由用户调整 div 元素的大小: div { resize:both; overflow: ...

  5. SpringMVC表当重复提交

    最近公司上线,有同志进行攻击,表当防重复提交也没有弄,交给我 ,本人以前也没弄过,知道大概的思路,但是那样实在是太麻烦了,虽然后面试过使用过滤器加拦截器实现,不过还是有点小麻烦. 后来在网上搜索后发现 ...

  6. Linux kernel的中断子系统之(九):tasklet

    返回目录:<ARM-Linux中断系统>. 总结: 二介绍了tasklet存在的意义. 三介绍了通过tasklet_struct来抽想一个tasklet,每个CPU维护一个tasklet链 ...

  7. CentOS 安装Python3.x常见问题

    CentOS 6.x自带的Python版本是2.6,CentOS 7.x上自带的是2.7,我们要自己安装Python3.X,配置环境,不过一般安装过程不会一帆风顺,往往有些报错,在CentOS以及其他 ...

  8. Scrapy 1.4 文档 05 命令行工具

    在系统命令行中,使用 scrapy 命令可以创建工程或启动爬虫,它控制着 Scrapy 的行为,我们称之为 Scrapy 命令行工具(command-line tool)或 Scrapy 工具(Scr ...

  9. SpringBootApplication注解 专题

    到这里,看到所有的配置是借助SpringFactoriesLoader加载了META-INF/spring.factories文件里面所有符合条件的配置项的全路径名.找到spring-boot-aut ...

  10. vim永久显示行号

    先复制一份vim配置模板到个人目录下,如果目录不对的,自己找到这个文件 cp /usr/share/vim/vim74/vimrc_example.vim ~/.vimrc 注:redhat的路径为  ...