Dijkstra算法:任意两点间的最短路问题 路径还原

时间:2022-03-31 20:43:47
 1 #define _CRT_SECURE_NO_WARNINGS  2 /*  3 7 10  4 0 1 5  5 0 2 2  6 1 2 4  7 1 3 2  8 2 3 6  9 2 4 10  10 3 5 1  11 4 5 3  12 4 6 5  13 5 6 9  14 0 6  15 */  16 #include <iostream>  17 #include <vector>  18 #include <utility>  19 #include <queue>  20 #include <functional>  21 #include <algorithm>  22 #include <cstdio>  23 using namespace std;  24  25 const int maxn = 1010 + 20;  26 const int INF = 9999999;  27 int V, E;  28 int Prev[maxn]; //最短路上的前驱顶点  29 int d[maxn];  30 int cost[maxn][maxn]; //i->j 上的权值  31 int used[maxn];  32  33 void input();  34 void init();  35 //求从起点s出发到各个顶点的最短距离  36 void dijkstra(int s);  37  38 void init() {  39 for (int i = 0; i < V; i++) {  40 for (int j = 0; j < V; j++) {  41 if (i == j) {  42 cost[i][j] = 0;  43  }  44 else {  45 cost[i][j] = INF;  46  }  47  }  48  }  49 }  50  51 void input()  52 {  53 int s, t, ct;  54 for (int i = 0; i < E; i++) {  55 cin >> s >> t >> ct;  56 cost[s][t] = cost[t][s] = ct;  57  }  58 }  59  60 //从s点出发到各个顶点的最短距离  61 void dijkstra(int s)  62 {  63 fill(d, d + V, INF);  64 fill(used, used + V, false);  65 fill(Prev, Prev + V, -1);  66 d[s] = 0;  67  68 while (true) {  69 int v = -1;  70 for (int u = 0; u < V; u++) {  71 if (!used[u] && (v == -1 || d[u] < d[v]))  72 v = u; //找出到下一条尝试的顶点中距离最短的点  73  }  74  75 if (v == -1) break;  76 used[v] = true;  77  78 for (int u = 0; u < V; u++) {  79 if (d[u] > d[v] + cost[v][u]) {  80 d[u] = d[v] + cost[v][u]; //从v到各个临边u中最短的路-->存放到d[u],用于下一次计算  81 Prev[u] = v; //u的前驱是v  82  }  83  }  84  }  85 }  86  87 //到顶点t的最短路  88 vector<int> get_path(int t) {  89 vector<int> path;  90 for (; t != -1; t = Prev[t]) path.push_back(t); //不断沿着Prev[t]走直到 t = s  91 //这样得到的是按照t到s的顺序,所以翻转之  92  reverse(path.begin(), path.end());  93 return path;  94 }  95  96  97 int main()  98 {  99 cin >> V >> E; 100  init(); 101  input(); 102 int st, ov; 103 cin >> st >> ov; 104  dijkstra(st); 105 cout << d[ov] << endl; 106 cout << "Debug..........\n"; 107 vector<int> path = get_path(ov); 108 for (int i = 0; i < path.size(); i++) { 109 cout << path[i] << " "; 110  } 111 112 cout << endl; 113 return 0; 114 }