(visual studio 2019可运行)
输入及输出要求见《数据结构C语言(第二版)》严蔚敏版
【本文仅用于啥都看不懂还想交作业选手】

加了一点输入异常的反馈

基于基于Dijsktra算法的最短路径求解 - 简书改动

(这是一个我终于明白并不需要一次性统一输出的故事)

#include<iostream>
using namespace std;
#define MAXSIZE 100
#define OK 1
typedef int Status;
//用两个数组分别存储顶点表和邻接矩阵
#define MaxInt 32767                        //表示极大值,即∞
#define MVNum 100                           //最大顶点数
typedef char VerTexType;                //假设顶点的数据类型为字符型
typedef int ArcType;                    //假设边的权值类型为整型
typedef struct {VerTexType vexs[MVNum];                   //顶点表 ArcType arcs[MVNum][MVNum];               //邻接矩阵 int vexnum;//图的总点数int arcnum;//图的总边数
}AMGraph;
int LocateVex(AMGraph G, VerTexType u)
{//存在则返回u在顶点表中的下标;否则返回-1int i;for (i = 0; i < G.vexnum; ++i)if (u == G.vexs[i])return i;return -1;
}
VerTexType OrigialVex(AMGraph G, int u)
{//存在则返回u在顶点表中的下标;否则返回-1return G.vexs[u];
}
Status CreateUDN(AMGraph& G) {//采用邻接矩阵表示法,创建无向网G cin >> G.vexnum;  //输入总顶点数cin >> G.arcnum;  //输入总边数 int i, j, k, w;VerTexType v1, v2;for (i = 0; i < G.vexnum; ++i)cin >> G.vexs[i];                           //依次输入点的信息 for (i = 0; i < G.vexnum; ++i)  //初始化邻接矩阵,边的权值均置为极大值for (j = 0; j < G.vexnum; ++j)G.arcs[i][j] = MaxInt;for (k = 0; k < G.arcnum; ++k) {                     //构造邻接矩阵 cin >> v1 >> v2 >> w;                                 //输入一条边依附的顶点及权值 i = LocateVex(G, v1);  j = LocateVex(G, v2);  //确定v1和v2在G中的位置G.arcs[i][j] = w; //边<v1, v2>的权值置为w G.arcs[j][i] = G.arcs[i][j];              //置<v1, v2>的对称边<v2, v1>的权值为w } return OK;
}
Status CreateDN(AMGraph& G, int dian, int bian) {   //创建有向网G的邻接矩阵G.vexnum = dian;G.arcnum = bian;int i, j, k, w;VerTexType v1, v2;for (i = 0; i < G.vexnum; ++i)cin >> G.vexs[i];                           //依次输入点的信息 for (i = 0; i < G.vexnum; ++i)  //初始化邻接矩阵,边的权值均置为极大值for (j = 0; j < G.vexnum; ++j)G.arcs[i][j] = MaxInt;for (k = 0; k < G.arcnum; ++k) {                     //构造邻接矩阵 cin >> v1 >> v2 >> w;                                 //输入一条边依附的顶点及权值 i = LocateVex(G, v1);  j = LocateVex(G, v2);  //确定v1和v2在G中的位置G.arcs[i][j] = w; //边<v1, v2>的权值置为w  }return OK;
}
int D[MVNum], Path[MVNum],S[MVNum];void ShortestPath_DIJ(AMGraph G, VerTexType V) {//用Dijkstra算法求有向网G的v0顶点到其余顶点的最短路径 int i, n, v, min, w;n = G.vexnum;                         //n为G中顶点的个数 int v0 = LocateVex(G, V);for (v = 0; v < n; ++v){               //n个顶点依次初始化 S[v] = false;                   //S初始为空集 D[v] = G.arcs[v0][v];               //将v0到各个终点的最短路径长度初始化 if (D[v] < MaxInt)Path[v] = v0; //v0和v之间有弧,将v的前驱置为v0elsePath[v] = -1;                //如果v0和v之间无弧,则将v的前驱置为-1 }S[v0] = true;                     //将v0加入S D[v0] = 0;                            //源点到源点的距离为0 D[-1] = -1;              //出现异常顶点/*―开始主循环,每次求得v0到某个顶点v的最短路径,将v加到S集―*/for (i = 1; i < n; ++i){                   //对其余n−1个顶点,依次进行计算 min = MaxInt;for (w = 0; w < n; ++w)if (!S[w] && D[w] < min){v = w; min = D[w];}           //选择一条当前的最短路径,终点为v S[v] = true;                          //将v加入S for (w = 0; w < n; ++w)   //更新从v0出发到集合V−S上所有顶点的最短路径长度 if (!S[w] && (D[v] + G.arcs[v][w] < D[w])) {D[w] = D[v] + G.arcs[v][w];     //更新D[w] Path[w] = v;                     //更改w的前驱为v }}
}
void find(AMGraph G, int v,char A)
{int n = G.vexnum;if (Path[v] == -1||v==-1)return;else{find(G, Path[v],A);cout << OrigialVex(G, Path[v]) << " ";}
}
int main()
{char A, B;int a, b;while (cin >> a >> b && a && b) {AMGraph G;CreateDN(G, a, b);cin >> A;ShortestPath_DIJ(G, A);cin >> B;int n = LocateVex(G, B);cout << D[n] << endl;find(G, n,A);if (D[n] == -1)//异常查找cout << "wrong point!" << endl;elsecout << B << endl;}return 0;
}

数据结构实验7《基于Dijsktra算法的最短路径求解》相关推荐

  1. 数据结构——基于 Dijsktra 算法的最短路径求解

    实验七 基于 Dijsktra 算法的最短路径求解 [实验目的] 掌握图的邻接矩阵表示法,掌握采用邻接矩阵表示法创建图的算法. 掌握求解最短路径的 Dijsktra 算法. [实验内容] 问题描述 一 ...

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

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

  3. 数据结构实验一 —— 矩阵相乘算法

    数据结构实验一 -- 矩阵相乘算法 实验名称 矩阵相乘算法 实验内容 实现两个矩阵的相乘算法. 实验要求 输入要求:矩阵大小阶数及元素值可以在程序中固定.但最好不固定矩阵形式,从键盘输入矩阵阶数以及元 ...

  4. 实验三 基于A*算法的迷宫游戏

    软件实习项目三 -- Java实现基于A*算法的迷宫游戏 一.实验任务 (1)该题要求随机生成一个迷宫,并求解迷宫: (2)要求游戏支持玩家走迷宫,和系统走迷宫路径两种模式.玩家走迷宫,通过键盘方向键 ...

  5. 数据结构实验:内部排序算法的性能分析

    文章目录 前言 一.问题描述 二.问题分析 三.实验结果及分析 (1)实验数据描述 (2)实验结果 (3)性能分析 四.源代码 前言 记录下本学期的数据结构实验 本实验主要集中于比较几种内部排序算法 ...

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

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

  7. 【swjtu】数据结构实验4_基于改进KMP算法的子串查找与替换

    实验内容及要求: 从键盘输入主串s以及子串t1和t2.编写程序,将主串s中所有t1子串替换为t2子串,输出替换后得到的串以及t1被替换的次数.要求子串查找采用改进KMP算法. 实验目的:掌握KMP算法 ...

  8. 北京林业大学数据结构实验二 基于栈的算术表达式求值算法

    第1关:基于栈的中缀算术表达式求值 参见课本P75 例3.3 #include <iostream> #include<iomanip>#define MAXSIZE 100 ...

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

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

最新文章

  1. linux基础(一)安装系统Centos6.5
  2. 沈阳生态所在保护性耕作促进农业可持续发展方面取得新进展
  3. 阿里巴巴Json工具:Fastjson教程
  4. html 清除float,css中如何清除float
  5. SOA面向服务架构简述
  6. HashMap遍历方式
  7. Java LocalDateTime
  8. [SAP ABAP开发技术总结]动态修改选择屏幕
  9. 【转】echarts x轴标签文字过多导致显示不全
  10. 学好加工中心UG编程,先弄懂这些问题
  11. UG10.0 工程图 在注释的时候 引用/插入 组件尺寸
  12. EXCEL常见函数之逻辑函数
  13. 下载的turbo c 3.0 怎样安装
  14. 如何通过mac微信版把文件传到手机上?
  15. 公告:博客新皮肤上线啦
  16. JAVA布局管理器导包_在 Java 中,要使用布局管理器,必须导入下列( )包。_计算机网络基础答案_学小易找答案...
  17. [Tool]系统截图工具
  18. html清除js设置的浮动,css 怎么清除浮动
  19. 删除你的所有计算机文件的英文,删除Download和DataStore文件夹中的所有文件
  20. 从剧情架构角度分析《妄想破绽》

热门文章

  1. 电子品牌内容营销人员应具备的14大软文写作技能
  2. access h3c交换机光口_H3C交换机常用配置命令转载
  3. Construct2 第一次制作的小游戏
  4. 移动支付新发展:开拓支付领域,不止于支付服务
  5. 如何保存php网页到桌面,如何将网页保存到电脑桌面上
  6. Caused by: java.sql.SQLException: Table ‘./commerce_sit/pgrels‘ is marked as crashed and last (autom
  7. OpenEuler 22.03 安装NextCloud
  8. 学生用计算机打不开,电脑计算机管理打不开怎么办
  9. 美国GeneSiC推出目前世界最高等级6.5kV/300mΩ SiC MOSFET产品
  10. 接口测试小白的Testng学习之路--在eclips中安装Testng