实验七 基于 Dijsktra 算法的最短路径求解
【实验目的】

  1. 掌握图的邻接矩阵表示法,掌握采用邻接矩阵表示法创建图的算法。
  2. 掌握求解最短路径的 Dijsktra 算法。
    【实验内容】
    问题描述
    一张地图包括 n 个城市,假设城市间有 m 条路径(有向图),每条路径的长度
    已知。给定地图的一个起点城市和终点城市,利用 Dijsktra 算法求出起点到终
    点之间的最短路径。
    输入要求
    多组数据,每组数据有 m+3 行。第一行为两个整数 n 和 m,分别代表城市个数
    n 和路径条数 m。第二行有 n 个字符,代表每个城市的名字。第三行到第 m+2 行每
    行有两个字符 a、b 和一个整数 d,代表从城市 a 到城市 b 有一条距离为 d 的路。
    最后一行为两个字符,代表待求最短路径的城市起点和终点。当 n 和 m 都等于 0
    时,输人结束。
    输出要求
    每组数据输出2行。第1行为一个整数,为从起点到终点之间最短路的长度。
    第 2 行为一串字符串,代表该路径。每两个字符之间用空格隔开。
    输入样例
    3 3
    A B C
    A B 1
    B C 1
    C A 3
    A C
    6 8
    A B C D E F
    A F 100
    A E 30
    A C 10
    B C 5
    C D 50
    E D 20
    E F 60
    D F 10
    A F
    0 0
    输出样例
    2
    A B C
    60
    A E D F
    【实验提示】
    此实验内容即为教材算法 7.15 的扩展,原算法求出源点 v0 到图中其余所有
    顶点的最短路径。本实验要求求出一个指定起点到一个指定终点的最短路径。
    为了提高算法的效率,在求解时,可以加以判断,当已求得的终点为指定终点
    时,则可以终止求解,按要求输出相应结果。
#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,int e)
{int value;char temp_i;char temp_j;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;}}for(int j=0;j<G.n;j++){getchar();scanf("%c",&G.vexs[j]);}int temp_number_i;int temp_number_j;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,int w)
{printf("\n");for(int i=0;i<G.n;i++){if(i!=v && dist[i]!=INF&&i==w){printf("%c到%c的最短距离为:%d\n",G.vexs[v],G.vexs[i],dist[i]);}else if(dist[i]==INF&&i==w){printf("%c与%c之间无路径!\n",G.vexs[v],G.vexs[i]); } }
}static void Dispath(MGraph g, int v,int w)
{int i, j, k;int apath[MAXVEX], d;                         //存放一条最短路径(逆向)及其顶点个数//循环输出从顶点v到i的路径for(i = 0; i < g.n; i++){if(S[i] == 1 && i != v&&i==w){printf("%d\n",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;int n,e;do{scanf("%d%d",&n,&e);if(n==0&&n==0)break;CreateMGraph(G,n,e);char a,b;getchar();scanf("%c %c",&a,&b);int indexa,indexb;for(int i=0;i<G.n;i++){if(a==G.vexs[i])indexa=i;if(b==G.vexs[i])indexb=i; }Dijkstra(G,indexa);Dispath(G,indexa,indexb);}while(1);return 0;}

数据结构——基于 Dijsktra 算法的最短路径求解相关推荐

  1. 数据结构实验7《基于Dijsktra算法的最短路径求解》

    (visual studio 2019可运行) 输入及输出要求见<数据结构C语言(第二版)>严蔚敏版 [本文仅用于啥都看不懂还想交作业选手] 加了一点输入异常的反馈 基于基于Dijsktr ...

  2. 基于dijsktra算法的最短路径求解_基于dijkstra算法的AGV路径规划(含C++代码)

    文字&代码来源: @Wasabi喵喵喵 基于dijkstra算法的AGV路径规划 dijkstra算法的路径规划 经典Dijkstra算法是一种贪心算法,根据路径长度递增次序找到最短路径,通常 ...

  3. 判断有向图g中顶点i到顶点j是否有路径_[源码和文档分享]基于Dijkstra算法的最短路径问题求解...

    摘 要 现实生活中许多数据的处理依赖于Dijkstra算法的应用,通过应用Dijkstra算法使复杂问题更加简单化.算法是以起始点为中心向外层层扩展,直到扩展到终点为止,最终求出最短路径.采用Visu ...

  4. C语言贪吃蛇最短路径,AI贪吃蛇前瞻——基于Dijkstra算法的最短路径问题

    在贪吃蛇流程结构优化之后,我又不满足于亲自操刀控制这条蠢蠢的蛇,干脆就让它升级成AI,我来看程序自己玩,哈哈. 一.Dijkstra算法原理 作为一种广为人知的单源最短路径算法,Dijkstra用于求 ...

  5. 数据结构:弗洛伊德算法(最短路径)图文详解

    弗洛伊德算法选取某个节点k作为i到j需要经过的中间节点,通过比较d(i,k)+d(k,j)和现有d(i,j)的大小,将较小值更新为路径长度,对k节点的选取进行遍历,以得到在经过所有节点时i到j的最短路 ...

  6. 基于鲸鱼算法的线性规划问题求解matlab程序

    基于鲸鱼算法的线性规划问题求解matlab程序 1 鲸鱼算法 座头鲸有特殊的捕猎方法,这种觅食行为被称为泡泡网觅食法:标准 WOA 模拟了座头鲸特有的搜索方法和围捕机制,主要包括:围捕猎物.气泡网捕食 ...

  7. 【优化布局】基于免疫算法求解充电站最优布局matlab代码

    1 简介 为了普及电动汽车,以缓解我国日益严重的环境能源问题,本文研究电动汽车充换电站的选址方法,旨在利用提高电动汽车充电设施的覆盖范围,加快电动汽车的普及发展.本文建立人们日常出行模型,模拟电动汽车 ...

  8. 有向无环图的最短路径求解算法

    对于最短路径问题,Dijkstra算法只能求解所有边的权值都是非负的加权有向图,而Bellman-Ford算法虽然可以求解有负权值边的图的最短路径,但效率并不高.对于有向无环图,下面这种基于Dijks ...

  9. 【路径规划】基于matlab模拟退火算法结合LNS求解车辆路径规划问题【含Matlab源码 2333期】

    ⛄一.模拟退火算法简介 1 模拟退火算法的原理 模拟退火算法(SA)是一种适用于大规模组合优化问题的有效近似算法,来源于对固体退火过程的模拟.统计力学表明,在给定初始温度的条件下,通过将温度缓慢降低, ...

最新文章

  1. 力扣(LeetCode)刷题,简单题(第15期)
  2. mysql数据库入门题型_mysql数据库入门
  3. 如何利用高斯混合模型建立更好、更精确的集群?
  4. 针对安全探索的受限强化学习:原始对偶优化算法
  5. 今年是SAP进入中国25周年,我从2007年毕业进入SAP成都研究院,也马上就待满14年了。
  6. 解决火车票网上订票难的方案
  7. 软件整合--硬件整合--平台整合
  8. 【Restful】你还不懂Restful API规范吗?
  9. 《python基础教程(第二版)》学习笔记 基础部分(第1章)
  10. tomcat之组成结构
  11. 元素偏移量offset系列(附实例)
  12. Win10一键更换系统字体
  13. Android手机截图命令screencap
  14. UE4 UE5学习和资源网站整理
  15. 用cpolar发布Ubuntu上的网页(2)
  16. 人体红外传感器HC-SR501特点及使用介绍
  17. icloud备份微信聊天记录怎么恢复
  18. php正则匹配汉字!
  19. _ReturnAddress 使用
  20. 开源个人网盘(奇文网盘)前后端代码运行与部署在Windows服务器并修改部分配置

热门文章

  1. 查看安装软件/Select-object/Where-Object xxx -like
  2. myisam数据表根据frm文件恢复数据表
  3. html 字符串最后加空格,html space空格符
  4. [转]快速使用FileProvider解决Android7.0文件权限问题
  5. C#输入框InputBox问题
  6. C语言试题十九之根据以下公式求p的值,结果由函数值带回。M与n为两个正整数,且要求m>n。 p=m!/n!(m-n)!
  7. sq工程师是做什么的_算法工程师为什么成天做数据,都做哪些数据?
  8. 王道408数据结构——第五章 树与二叉树
  9. 区块链、自动驾驶、人工智能鏖战开始 谁将成为下一个风口?
  10. python pp模块_Python模块--Pexpect