IT评测·应用市场-qidao123.com

标题: 迪杰特斯拉算法(Dijkstra‘s) [打印本页]

作者: 圆咕噜咕噜    时间: 2025-1-14 06:33
标题: 迪杰特斯拉算法(Dijkstra‘s)
迪杰斯特拉算法(Dijkstra's algorithm)是由荷兰盘算机科学家艾兹格·迪科斯彻(Edsger W. Dijkstra)在1956年提出的,用于在加权图中找到单个源点到所有其他极点的最短路径的算法。这个算法广泛应用于网络路由、地图导航等范畴。
算法原理

迪杰斯特拉算法的核心思想是贪婪算法,它维护一个未访问极点集合,每次从未访问极点集合中选择一个间隔源点最近的极点,然后更新该极点相邻的极点的间隔。
算法步骤

算法特点


代码实现:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int n, m;//n为顶点数,m为边数
  4. int matrix[100][100];//邻接矩阵
  5. //初始化邻接矩阵
  6. void init() {
  7.     for (int i = 0; i < n; i++) {
  8.         for (int j = 0; j < n; j++) {
  9.             if (i == j) {
  10.                 matrix[i][j] = 0;
  11.             } else {
  12.                 matrix[i][j] = INT_MAX;
  13.             }
  14.         }
  15.     }
  16. }
  17. //初始化beginPoint到其他点的距离
  18. vector<int> initBeginDistance(int beginPoint) {
  19.     vector<int> beginDistance;
  20.     for (int i = 0; i < n; i++) {
  21.         beginDistance.push_back(matrix[beginPoint][i]);
  22.     }
  23.     return beginDistance;
  24. }
  25. //更新beginPoint到其他点的距离
  26. void updateMatrix(int beginPoint, vector<int> distances) {
  27.     for (int i = 0; i < n; i++) {
  28.         matrix[beginPoint][i] = distances[i];
  29.     }
  30. }
  31. //打印邻接矩阵
  32. void printMatrix() {
  33.     for (int i = 0; i < n; i++) {
  34.         for (int j = 0; j < n; j++) {
  35.             cout << matrix[i][j] << " ";
  36.         }
  37.         cout << endl;
  38.     }
  39. }
  40. int main() {
  41.     cin >> n >> m;
  42.     init();//初始化邻接矩阵
  43.     for (int i = 0; i < m; i++) {
  44.         int x, y, dist;//x为起点,y为终点,distance为距离
  45.         cin >> x >> y >> dist;
  46.         matrix[x][y] = dist;
  47.     }
  48.     vector<int> already, unalready;//already为已经确定最短路径的点,unalready为未确定最短路径的点
  49.     for(int beginPoint = 0; beginPoint < n; beginPoint++) {
  50.         for(int i = 0; i < n; i++) {
  51.             if(i != beginPoint) {
  52.                 unalready.push_back(i);
  53.             } else {
  54.                 already.push_back(i);
  55.             }
  56.         }
  57.         //初始化beginPoint到其他点的距离
  58.         vector<int> distances = initBeginDistance(beginPoint);
  59.         while(unalready.size() > 0) {
  60.             int minDistance = INT_MAX, minIndex = -1;
  61.             //通过already中的点来更新beginPoint到unalready中的点的距离
  62.             for(int j = 0; j < unalready.size(); j++) {
  63.                 if(distances[unalready[j]] <= minDistance) {
  64.                     minDistance = distances[unalready[j]];
  65.                     minIndex = unalready[j];
  66.                 }
  67.             }
  68.             //将距离最小的点加入到already中,并从unalready中删除,并且跟新beginPoint到其他点的距离
  69.             already.push_back(minIndex);
  70.             unalready.erase(remove(unalready.begin(), unalready.end(), minIndex), unalready.end());
  71.             // 遍历未访问的节点
  72.             for(int j = 0; j < unalready.size(); j++) {
  73.                 // 如果当前节点可以到未访问节点,并且未访问节点的距离大于当前节点到未访问节点的距离加上当前节点的距离
  74.                 if(matrix[minIndex][unalready[j]] != INT_MAX && distances[unalready[j]] > distances[minIndex] + matrix[minIndex][unalready[j]]) {
  75.                     // 更新未访问节点的距离
  76.                     distances[unalready[j]] = distances[minIndex] + matrix[minIndex][unalready[j]];
  77.                 }
  78.             }
  79.         }
  80.         updateMatrix(beginPoint, distances);
  81.     }
  82.     printMatrix();
  83.     return 0;
  84. }
  85. //输入:
  86. // 5 11
  87. // 0 1 8
  88. // 0 2 32
  89. // 1 0 12
  90. // 1 2 16
  91. // 1 3 15
  92. // 2 1 29
  93. // 2 4 13
  94. // 3 1 21
  95. // 3 4 7
  96. // 4 2 27
  97. // 4 3 19
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4