MOOC大學《C語言程式設計進階》第一週程式設計題筆記
阿新 • • 發佈:2022-05-09
圖論模板
一,最短路
1.單源最短路
1)只有正權邊
①樸素Dijkstra
步驟:
step1:
將所有點到起點的距離初始化為正無窮
step2:
將起點到起點的距離設為0
step3:
遍歷n次
step4:
對於每次遍歷,都從未確定最短路的點中選擇出一個離起點距離最近的點,則該點的最短路徑已經確定,再用該點更新所有點到起點的距離
step5:
如果終點到起點的距離為正無窮,則不存在這樣的最短路徑,否則輸出該距離作為起點到終點的距離
#include <bits/stdc++.h> using namespace std; const int N = 510; int n, m; int g[N][N]; int dist[N]; bool st[N]; int dijkstra() { memset(dist, 0x3f, sizeof dist); dist[1] = 0; for (int i = 1; i <= n; i++) { int t = -1; for (int j = 1; j <= n; j++) if (!st[j] && (t == -1 || dist[j] < dist[t])) t = j; for (int j = 1; j <= n; j++) dist[j] = min(dist[j], dist[t] + g[t][j]); st[t] = true; } if (dist[n] == 0x3f3f3f3f) return -1; else return dist[n]; } int main() { cin >> n >> m; memset(g, 0x3f, sizeof g); while (m--) { int a, b, c; cin >> a >> b >> c; //存在重邊和自環 //①重邊時選擇最短的一條 ②自環的時候無需考慮 g[a][b] = min(g[a][b], c); } cout << dijkstra(); return 0; }