Floyd算法

Floyd算法的解释(多源的最短路径)(单源指的是两个节点之间,多源表示多个节点之间)

Floyd是一种可以求得整个图的所有的点,任意两点之间的最短距离,通过“小图 -> 大图”的思想逐步扩张到整个图,使用的是dp

Floyd的适用场合

  • 节点数量n <= 400,因为其时间复杂度是O(n^3),所以数据量不是很大
  • 当节点数量不是很大的时候,用Floyd是最好的方法,因为代码十分简单,三重循环之后所有点之间的最短路径都出来了
  • 解决和中转站相关的问题

蓝桥公园

https://www.lanqiao.cn/problems/1121/learning/?page=1&first_category_id=1&sort=students_count&problem_id=1121

  • 代码:
    #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;
    }
    
posted @ 2023-11-03 16:44  铜锣湾陈昊男  阅读(14)  评论(0)    收藏  举报