最短路-Floyd演算法
阿新 • • 發佈:2018-12-08
#include <bits/stdc++.h> #define inf 0x3f3f3f3f using namespace std; int mp[105][105]; int n, m;//n邊m點 int st, ed; int nxt[105][105]; void init() { cin >> n >> m; for (int i = 0; i <= n; i++)//初始化 { for (int j = 0; j <= n; j++) { if (i != j) mp[i][j] = mp[j][i] = inf; } } for (int i = 0; i < m; i++) { int x, y, w; cin >> x >> y >> w; if (w < mp[x][y])//有些題目坑人給重複路徑 mp[x][y] = mp[y][x] = w; } } void printpath() { while (st != ed) { cout << st << "->"; st = nxt[st][ed]; } cout << ed << endl; } void Floyd() { for (int i = 1; i <= n; i++)//初始化路徑 for (int j = 1; j <= n; j++) nxt[i][j] = j; for (int k = 1; k <= n; k++) for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) if (mp[i][k] + mp[k][j] < mp[i][j]) { mp[i][j] = mp[i][k] + mp[k][j]; nxt[i][j] = nxt[i][k]; } } int main() { init(); Floyd(); cin >> st >> ed; cout << mp[st][ed] << endl; printpath(); return 0; }