当前位置:   article > 正文

最短路问题(C++)_c++ 最短路

c++ 最短路

 单源最短路径

 BFS方法(无权图)

  1. void BFS_MIN_Distance(Graph G, int u){
  2. for(i=0;i<G.vexnum;++i){
  3. d[i]=∞;
  4. path[i]=-1;
  5. }
  6. d[u]=0;
  7. visited[u]=TRUE;
  8. EnQuene(Q,u);
  9. while(!isEmpty(Q)){
  10. DeQueue(Q,u);
  11. for(w=FirstNeighbor(G,u);w>=0;w=NextNeighbor(G,u,w)){
  12. if(!visited[w]){
  13. d[w]=d[u]+1;
  14. path[w]=u;
  15. visited[w]=TRUE;
  16. EnQueue(Q,w);
  17. }
  18. }
  19. }
  20. }

Dijkstra算法(带权图、无权图)

总共三个数组,分别存储各顶点是否已找到最短路径、最短路径长度、路径上的前驱。

分别对应下方代码的visited[n]、dist[n]、pred[]。

初始: 若从Vo开始,令final[0]=true; dist[0]=0; path[0]=-1。其余顶点final[k]=false; dist[k]=arcs[0][k]; path[k]= (arcs[0][k]==∞) ? -1 :0

n-1轮处理:循环遍历所有顶点,找到还没确定最短路径,且dist 最小的顶点Vi,令final[i]=true。并检查所有邻接自Vi的顶点,对于邻接自Vi的顶点Vj,若final==false 且 dist[i]+arcs[i][j] < dist[j],则令 dist[j]=dist[i]+arcs[i][j]; path[j]=i。 (注: arcs[i][j]表示Vi到Vj的弧的权值)
 

  1. #include <iostream>
  2. #include <limits.h>
  3. using namespace std;
  4. // 定义一个表示无穷大的常量
  5. #define INF INT_MAX
  6. // n 为图的顶点数,src 为源点
  7. void dijkstra(int graph[][10], int n, int src) {
  8. bool visited[n]; // 标记各顶点是否已找到最短路径
  9. int dist[n]; // 记录最短路径的长度
  10. int pred[n]; // 记录路径上的前驱
  11. // 初始化 visited, dist, pred 数组
  12. for (int i = 0; i < n; i++) {
  13. visited[i] = false;
  14. dist[i] = INF;
  15. pred[i] = -1;
  16. }
  17. // 将起点到自己的距离设置为 0
  18. dist[src] = 0;
  19. // 找到从起点到其它所有顶点的最短路径
  20. for (int i = 0; i < n - 1; i++) {
  21. // 找到距离起点最近的顶点
  22. int minDist = INF, minIndex;
  23. for (int j = 0; j < n; j++) {
  24. if (!visited[j] && dist[j] < minDist) {
  25. minDist = dist[j];
  26. minIndex = j;
  27. }
  28. }
  29. // 标记该顶点为已找到最短路径
  30. visited[minIndex] = true;
  31. // 更新与该顶点相邻的顶点的最短路径
  32. for (int j = 0; j < n; j++) {
  33. int newDist = graph[minIndex][j] + dist[minIndex];
  34. if (!visited[j] && graph[minIndex][j] && newDist < dist[j]) {
  35. dist[j] = newDist;
  36. pred[j] = minIndex;
  37. }
  38. }
  39. }
  40. // 输出结果
  41. cout << "顶点\t最短距离\t路径" << endl;
  42. for (int i = 0; i < n; i++) {
  43. cout << i << "\t" << dist[i] << "\t\t" << i;
  44. int j = i;
  45. while (j != src) {
  46. cout << "<-" << pred[j];
  47. j = pred[j];
  48. }
  49. cout << endl;
  50. }
  51. }
  52. int main() {
  53. int n = 6; // 图的顶点数
  54. int graph[10][10] = { // 图的邻接矩阵
  55. {0, 1, 4, 0, 0, 0},
  56. {1, 0, 2, 5, 0, 0},
  57. {4, 2, 0, 1, 3, 0},
  58. {0, 5, 1, 0, 2, 6},
  59. {0, 0, 3, 2, 0, 4},
  60. {0, 0, 0, 6, 4, 0}
  61. };
  62. int src = 0; // 源点
  63. dijkstra(graph, n, src);
  64. return 0;
  65. }
  66. /*
  67. 顶点 最短距离 路径
  68. 0 0 0
  69. 1 1 1<-0
  70. 2 3 2<-1<-0
  71. 3 4 3<-2<-1<-0
  72. 4 6 4<-2<-1<-0
  73. 5 10 5<-3<-2<-1<-0
  74. */

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

闽ICP备14008679号