问题描述
将图以邻接矩阵或邻接表存储,实现Dijkstra算法。

算法设计
迪杰斯特拉算法:

1.假设用带权的邻接矩阵arc,来表示带权有向图,arc[i][j],表示弧<vi,vj>上的权值。若<vi,vj>不存在,则置arc[i][j]为无穷。
S为已找到从v出发的最短路径的终点的集合,它的初始状态为空集。那么,从v出发到图上其余各顶点可能达到的最短路径长度的初值为:
D[j]=arcs[LocateVex(G,v)][i] vi∈V

2.选择vj,使得 D[j]=Min{D[i]|vi∈V-S}
vj就是当前求得的一条从v出发的最短路径的终点。令S=S∪{j}

3.修改从v出发到集合V-S上任一顶点vk可达的最短路径长度。如果
D[j]+arcs[j][k]<D[k] 则修改D[k]为D[k]=D[j]+arcs[j][k]

4.重复操作2,3共n-1次。
由此求得从v到图上其余各顶点的最短路径是依路径长度递增的序列。

#include<stdio.h>
#include<string.h>
#define INF 32767
#define MAXVEX 30
int dist[MAXVEX];        //建立dist数组int path[MAXVEX];         //建立path数组int S[MAXVEX];        //建立S数组typedef char VertexType;typedef struct graph
{int n,e;VertexType vexs[MAXVEX];int edges[MAXVEX][MAXVEX];
}MGraph;void CreateMGraph(MGraph &G)
{int n,e;int value;char temp_i;char temp_j;printf("请输入图的顶点数和边数(以空格分隔):");scanf("%d%d",&n,&e);G.n=n;G.e=e;for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(i==j)G.edges[i][j]=0;elseG.edges[i][j]=32767;}}printf("输入顶点信息:");for(int j=0;j<G.n;j++){getchar();scanf("%c",&G.vexs[j]);}int temp_number_i;int temp_number_j;printf("请输入每条边的权值:\n");for(int j=0;j<e;j++){getchar();scanf("%c %c %d",&temp_i,&temp_j,&value);for(int i=0;i<n;i++){if(G.vexs[i]==temp_i)temp_number_i=i;if(G.vexs[i]==temp_j)temp_number_j=i;}G.edges[temp_number_i][temp_number_j]=value;}}void DispMGraph(MGraph &G)
{printf("输出顶点信息:\n");for(int i=0;i<G.n;i++){printf("%c",G.vexs[i]);} printf("\n输出邻接矩阵:\n");printf("\t");for(int i=0;i<G.n;i++)printf("%8c",G.vexs[i]); for(int i=0;i<G.n;i++){printf("\n%8c",G.vexs[i]);for(int j=0;j<G.n;j++){if(G.edges[i][j]==32767) //两点之间无连接时权值为默认的32767,// 在无向图中一般用"0"表示,在有向图中一般用"∞",// 这里为了方便统一输出 "∞"printf("%8s", "∞");elseprintf("%8d",G.edges[i][j]);}printf("\n");}
}void Dijkstra(MGraph g, int v)
{  //求从v到其他顶点的最短路径int mindis,i,j,u=0;for (i=0;i<g.n;i++){    dist[i]=g.edges[v][i]; //距离初始化S[i]=0;          //S[]置空if (g.edges[v][i]<INF) //路径初始化path[i]=v;         //v→i有边时,置i前一顶点为velse            //v→i没边时,置i前一顶点为-1path[i]=-1;}S[v]=1;         //源点编号v放入S中for (i=0;i<g.n-1;i++)  //循环向S中添加n-1个顶点{  mindis=INF;      //mindis置最小长度初值for (j=0;j<g.n;j++)    //选取不在S中且有最小距离顶点uif (S[j]==0 && dist[j]<mindis) {  u=j;mindis=dist[j];}S[u]=1;          //顶点u加入S中for (j=0;j<g.n;j++)  //修改不在s中的顶点的距离if (S[j]==0)if (g.edges[u][j]<INF&& dist[u]+g.edges[u][j]<dist[j]){  dist[j]=dist[u]+g.edges[u][j];path[j]=u;}}
}void Print(MGraph G,int v)
{printf("\n");for(int i=0;i<G.n;i++){if(i!=v && dist[i]!=INF){printf("%c到%c的最短距离为:%d\n",G.vexs[v],G.vexs[i],dist[i]);}else if(dist[i]==INF){printf("%c与%c之间无路径!\n",G.vexs[v],G.vexs[i]); } }printf("\n");
}/*------------------输出从顶点v出发的所有最短路径-------------------*/
static void Dispath(MGraph g, int v)
{int i, j, k;int apath[MAXVEX], d;                         //存放一条最短路径(逆向)及其顶点个数//循环输出从顶点v到i的路径for(i = 0; i < g.n; i++){if(S[i] == 1 && i != v){printf("从顶点%c到顶点%c的路径长度为:%d\t路径为:", g.vexs[v], g.vexs[i], dist[i]);d = 0; apath[d] = i;                //添加路径上的终点k = path[i];if(k == -1)                         //没有路径的情况printf("无路径\n");else                                //存在路径时输出该路径{while(k != v){d++;apath[d] = k;k = path[k];}d++; apath[d] = v;              //添加路径上的起点printf("%c ",  g.vexs[apath[d]]);         //先输出起点for(j = d - 1; j >= 0; j--)     //再输出其余顶点printf("  %c ", g.vexs[apath[j]]);printf("\n");}}}
}int main()
{MGraph G;CreateMGraph(G);DispMGraph(G);Dijkstra(G,0);Print(G,0);Dispath(G,0);
}

数据结构——图-迪杰斯特拉算法相关推荐

  1. 数据结构——图——迪杰斯特拉(Dijkstra )算法

    数据结构--图--迪杰斯特拉(Dijkstra )算法 这是一个按路径长度递增的次序产生最短路径的算法.它的思路大体是这样的. 比如说要求图7-7-3中顶点v0到顶点v1的最短距离,没有比这更简单的了 ...

  2. 算法与数据结构(六) 迪杰斯特拉算法的最短路径(Swift版)

    上篇博客我们详细的介绍了两种经典的最小生成树的算法,本篇博客我们就来详细的讲一下最短路径的经典算法----迪杰斯特拉算法.首先我们先聊一下什么是最短路径,这个还是比较好理解的.比如我要从北京到济南,而 ...

  3. c++ 遍历所有点且距离最短_图解:最短路径之迪杰斯特拉算法

    小禹禹们,你们好,景禹最近已经开学,忙着准备毕业答辩的事情,这才抽身个大家更新文章,还请莫怪.生活实属不易,有时候让人有点儿焦头烂额,甚至想让景禹放弃继续更新文章,可是千百号人默默地关注者景禹,当然也 ...

  4. 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)

    最小生成树 什么是最小生成树 是一棵树 - 无回路 - |V|个顶点一定有|V|-1条边 是生成树 - 包含全部顶点 - |V|-1条边全在图里 贪心算法 什么是"贪":每一步都要 ...

  5. 最短路径——迪杰斯特拉算法——图的数据结构

    最短路径是在工程上经常用到的概念,在这里给出了从单源点到任意顶点的迪杰斯特拉算法. 先来看看基本概念: 用代码C语言实现如下: #include<string.h>#include< ...

  6. (王道408考研数据结构)第六章图-第四节4:最短路径之迪杰斯特拉算法(思想、代码、演示、答题规范)

    文章目录 一:BFS算法局限性 二:迪杰斯特拉(dijkstra)算法基本思想 三:迪杰斯特拉(dijkstra)算法代码实现 四:迪杰斯特拉(dijkstra)算法代码视频演示 五:迪杰斯特拉(di ...

  7. 校园导游系统_C语言实现_Dijkstra(迪杰斯特拉算法)_数据结构

    西京学院导游系统 摘要   要完成对整个导游图系统的功能实现,需要对每一项功能都有清楚的设想和认识,了解并明确每一项功能的实现和需要解决的问题,选择正确并且高效的算法把问题逐个解决,最终实现程序的正确 ...

  8. 数据结构课设之校园导航系统(迪杰斯特拉算法)

    一.需求分析 介绍学校的主要地点和这些地点的特点,以及从一个地点到达另外一个地点的最短路径. 二.系统设计 1.理论依据 根据设计要求分析校园导航系统的设计要求,掌握设计中所设计到的无向网的建立,遍历 ...

  9. 图 相关算法~从头学算法【广搜、 深搜、 拓扑排序、 并查集、 弗洛伊德算法、迪杰斯特拉算法】

    图的相关主流算法主要有: 广度优先搜索 深度优先搜索 拓扑排序 并查集 多源最短路径(弗洛伊德算法) 单源最短路径(迪杰斯特拉算法) 其中呢,最基本的是前两种,也就是平时常用的广搜和深搜,本文中将概要 ...

最新文章

  1. aMSN 0.97问题解决一则
  2. 中国LED产业园区现状模式及投资策略分析报告2022-2028年版
  3. 小程序底部弹窗css_微信小程序之animation底部弹窗动画(两种方法)
  4. asp+ajax菜单,AJAX_基于asp+ajax和数据库驱动的二级联动菜单,index.asp 页面代码 复制代码 代 - phpStudy...
  5. mysql在官网下载完解压后安装
  6. OpenGL学习笔记2 —— 画立方体
  7. DIV_ROUND_CLOSEST函数
  8. 实验一 组合逻辑电路的设计与测试
  9. NetworkManager nmcli connection modify 笔记221025
  10. DiffMerge 工具记录
  11. Cannot use the diamond generic notation when running in JDK inferior to 1.7 mode
  12. 八卦掌桩功-定式八桩及相关资料
  13. Mac安装卸载更新Homebrew
  14. win10总是很快自动休眠怎么解决?
  15. 数据可视化设计师必备的图表规范指南
  16. 获取本地与服务器地址
  17. 观览世界格局——蒙古风币wsec新动作
  18. 老子《道德经》第六十章
  19. TEC-2机微程序设计
  20. Excel中Vlookup函数近似匹配和精确匹配

热门文章

  1. Visual Studio 2017全面上市
  2. 一个简易的反射类库NMSReflector
  3. RAML用户应遵循的C#与Web API代码生成模式
  4. Javscript 实现字符数串比对排序(包含数字及中文数字)
  5. [转]Spring SpringMVC SpringBoot SpringCloud概念、关系及区别
  6. 【专升本计算机】甘肃省普通高等学校专升本考试计算机全真模拟试卷(一)
  7. 【ArcGIS遇上Python】长时间序列(30年)每两组栅格数据对应做减法运算求物候参数
  8. ENVI帮助研究人员发现金矿
  9. C和指针之字符串之strncpy、strncat、strncmp
  10. Android之解决Base64 encode中文乱码问题