Floyd算法
Floyd算法的解释(多源的最短路径)(单源指的是两个节点之间,多源表示多个节点之间)
Floyd是一种可以求得整个图的所有的点,任意两点之间的最短距离,通过“小图 -> 大图”的思想逐步扩张到整个图,使用的是dp
Floyd的适用场合
- 节点数量
n <= 400
,因为其时间复杂度是O(n^3)
,所以数据量不是很大 - 当节点数量不是很大的时候,用Floyd是最好的方法,因为代码十分简单,三重循环之后所有点之间的最短路径都出来了
- 解决和中转站相关的问题
蓝桥公园
- 代码:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll INF = 0x3f3f3f3f3f3f3f3fll; const int N = 405; ll dp[N][N]; int n, m, q; int main() { // 请在此输入您的代码 cin >> n >> m >> q; //初始化,meset是按照每一个字节来赋值的,一个字节最大值,但是考虑计算,所以3f是最好的选择 memset(dp, 0x3f, sizeof(dp)); for(int i = 1; i <= m; i++) { int a, b; ll c; cin >> a >> b >> c; dp[a][b] = dp[b][a] = min(c, dp[a][b]);//每一天边去重,我要记录的是最短的那条边 } for(int k = 1; k <= n; k++) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]); } } } while(q--) { int s, t; cin >> s >> t; if(dp[s][t] == INF) { cout << -1 << endl; }else if(s == t){ cout << 0 << endl; }else { cout << dp[s][t] << endl; } } return 0; }