当前位置:   article > 正文

数据结构实验---Dijsktra算法求最短路径

dijsktra

在代码中有其他需求可自行按备注更改,本代码是学校实验任务,参照课本及网上资料以及自己更改编写完成。

实验内容:输入图的顶点数、边数以及边,求某个顶点到各个顶点的最短路径。

该实验中输入的v0点即为要求的某个顶点,在输入顶点字符信息的地方,只是简单的将字符信息转换为数字信息,在代码中还可对其进行优化。

1、picture.cpp文件

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include <stdio.h>
  3. #include <iostream>
  4. #include <sstream>
  5. #include <string>
  6. #include "picture.h"
  7. using namespace std;
  8. Status LocateVex(AMGraph G, VerTexType u)
  9. {
  10. int i;
  11. for (i = 0; i < G.vexnum; ++i)
  12. {
  13. if (G.vexs[i] == u)
  14. return i; // 找到顶点值为u的位置,返回该位置在顶点表中的索引 i
  15. }
  16. return ERROR; // 没找到,返回错误码
  17. }
  18. Status CreateDN(AMGraph& G) //采用邻接矩阵表示法,创建有向网G
  19. {
  20. int i, j, k, w;
  21. VerTexType v1, v2; //v1、v2表示点的位置、w表示该点权值
  22. cout << "输入总顶点数:";
  23. cin >> G.vexnum; //输入总顶点数、总边数
  24. cout << "输入总边数:";
  25. cin >> G.arcnum;
  26. cout << "依次输入顶点名称:";
  27. for (i = 0; i < G.vexnum; ++i) //依次输入点的信息
  28. cin >> G.vexs[i];
  29. for (i = 0; i < G.vexnum; ++i) //初始化邻接矩阵、边的权值 均置为极大值MaxInt
  30. for (j = 0; j < G.vexnum; ++j)
  31. G.arcs[i][j] = MaxInt;
  32. for (k = 0; k < G.arcnum; ++k) //构建邻接矩阵
  33. {
  34. cout << "输入一条边的起点、终点及权值:";
  35. cin >> v1 >> v2 >> w; //输入一条边依附的顶点及权值
  36. i = LocateVex(G, v1);
  37. j = LocateVex(G, v2); //确定v1、v2在G中的位置,即顶点数组下标
  38. if (i == ERROR || j == ERROR)
  39. {
  40. cout << "顶点不存在!" << endl;
  41. return ERROR;
  42. }
  43. G.arcs[i][j] = w; //边<v1,v2>的权值置为w 对称边<v2,v1>的权值为w
  44. }
  45. return OK;
  46. }
  47. //用Dijkstra算法求有向网的v0顶点到其余顶点的最短路径
  48. void ShortestPath_DIJ(AMGraph G, int v0, int *D, int *Path)
  49. {
  50. int n, v, i, min, w, max, m;
  51. int S[20];
  52. n = G.vexnum; //n为G中顶点的个数
  53. for (v = 0; v < n; ++v) //n个顶点依次初始化
  54. {
  55. S[v] = false; //S初始为空集
  56. D[v] = G.arcs[v0][v]; //将v0到各个终点的最短路径长度初始化为弧上的权值
  57. if (D[v] < MaxInt) //如果v0和v之间有弧,则将v的前驱置为v0
  58. Path[v] = v0;
  59. else //如果v0和v之间无弧,则将v的前驱置为-1
  60. Path[v] = -1;
  61. }
  62. S[v0] = true; //将v0加入S
  63. D[v0] = 0; //源点到源点的距离为0
  64. /*-----初始化结束,开始主循环,每次求得v0到某个顶点v的最短路径,将v加到S集-----*/
  65. for (i = 1; i < n; ++i) //对其余n-1个顶点,依次进行计算
  66. {
  67. min = MaxInt;
  68. for (w = 0; w < n; ++w)
  69. if (!S[w] && D[w] < min)
  70. {
  71. v = w;
  72. min = D[w]; //选择一条当前的最短路径,终点为v
  73. }
  74. S[v] = true; //将v加入S
  75. for (w = 0; w < n; ++w) //更新从v0出发到集合V-S上所有顶点的最短路径长度
  76. if (!S[w] && (D[v] + G.arcs[v][w] < D[w]))
  77. {
  78. D[w] = D[v] + G.arcs[v][w]; //更新D[w]
  79. Path[w] = v; //更新w的前驱为v
  80. }
  81. }
  82. }

2、picture.h文件

  1. #pragma once
  2. #ifndef PICTURE_H
  3. #define PICTURE_H
  4. typedef int Status;
  5. #define OK 1
  6. #define ERROR -1
  7. #define swap(a, b) {a = a + b; b = a - b; a = a - b;}
  8. //-------图的邻接矩阵存储表示--------//
  9. #define MaxInt 32767 //表示极大值,即∞
  10. #define MVNum 100 //最大顶点数
  11. typedef char VerTexType; //假设顶点的数据类型为字符型
  12. typedef int ArcType; //假设边的权值类型为整型
  13. typedef struct
  14. {
  15. VerTexType vexs[MVNum]; //顶点表
  16. ArcType arcs[MVNum][MVNum]; //邻接矩阵
  17. int vexnum, arcnum; //图的当前点数和边数
  18. }AMGraph;
  19. Status CreateDN(AMGraph& G); //采用邻接矩阵表示法,创建有向网G
  20. Status LocateVex(AMGraph G, VerTexType u);
  21. void ShortestPath_DIJ(AMGraph G, int v0, int* D, int* Path);
  22. #endif

3、main.cpp文件

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include <iostream>
  3. #include <iomanip>
  4. #include "picture.h"
  5. using namespace std;
  6. void show(AMGraph G, int* D, int* Path)
  7. {
  8. for (int i = 0; i < G.vexnum; ++i)
  9. {
  10. if (D[i] == MaxInt)
  11. {
  12. cout << "从v0到 " << G.vexs[i] << " 点的路径不存在" << endl;
  13. }
  14. else
  15. {
  16. cout << "从v0到 " << G.vexs[i] << " 点的最短路径为:" << G.vexs[i];
  17. int pre = Path[i];
  18. while (pre != -1)
  19. {
  20. cout << " <- " << G.vexs[pre];
  21. pre = Path[pre];
  22. }
  23. cout << ",长度为:" << D[i] << endl;
  24. }
  25. }
  26. }
  27. int main()
  28. {
  29. int D[10];
  30. int Path[20];
  31. AMGraph G;
  32. CreateDN(G);
  33. cout << "v0到各点的最短路径(输入v0):";
  34. int v0;
  35. char v01;
  36. cin >> v01;
  37. for (v0 = 0; v0 < G.vexnum; ++v0)
  38. {
  39. if (G.vexs[v0] == v01)
  40. break;
  41. }
  42. ShortestPath_DIJ(G, v0, D, Path);
  43. show(G, D, Path);
  44. return 0;
  45. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/711002
推荐阅读
相关标签
  

闽ICP备14008679号