Course
可以參考我做的課程簡報:
MST & Shortest Path
Floyd-Warshall
多源最短路徑
求出任意兩點之間的最短路徑
Floyd-Warshall 是一種動態規劃 Dynamic Programming 問題
暴力的動態規劃
Floyd-Warshall 特色:三層 for 迴圈
生成步驟
- 遍歷所有點 i 到點 j 之間的距離和若 i 經過點 k 再到 j 是否會更短
- 若
dp[i][j] > dp[i][k] + dp[k][j]
則更新 dp[i][j]
Floyd-Warshall Example
Template
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include<bits/stdc++.h> using namespace std;
const int maxn = 200+5;
double distance(int x1, int y1, int x2, int y2){ return sqrt(((x1 - x2) * (x1 - x2)) + (y1 - y2) * (y1 - y2)); }
int N; double dp[maxn][maxn]; void FloydWarshall(){ for(int k = 0; k < N; ++k){ for(int i = 0; i < N; ++i){ for(int j = 0; j < N; ++j){ double maxi = max(dp[i][k], dp[k][j]); if(maxi < dp[i][j]) dp[i][j] = maxi; } } } }
int main(){ int Case = 1; while(cin >> N && N){ int x[maxn], y[maxn]; for(int i = 0; i < N; ++i){ cin >> x[i] >> y[i]; }
memset(dp, 0.0, sizeof(dp)); for(int i = 0; i < N; ++i){ for(int j = 0; j < N; ++j){ dp[i][j] = distance(x[i], y[i], x[j], y[j]); } }
FloydWarshall(); cout << "Scenario #" << Case++ << "Frog Distance = " << fixed << setprecision(3) << dp[0][1] << endl; } }
|
UVA Problem
UVA10099 - The Tourist Guide