zoukankan      html  css  js  c++  java
  • Floyd算法求多源最短路

     

      分析: f[i, j, k]表示从i走到j的路径上除i和j点外只经过1到k的点的所有路径的最短距离。那么f[i, j, k] = min(f[i, j, k - 1), f[i, k, k - 1] + f[k, j, k - 1]。
      因此在计算第k层的f[i, j]的时候必须先将第k - 1层的所有状态计算出来,所以需要把k放在最外层。

      读入邻接矩阵,将次通过动态规划装换成从i到j的最短距离矩阵

      在下面代码中,判断从a到b是否是无穷大距离时,需要进行if(t > INF/2)判断,而并非是if(t == INF)判断,原因是INF是一个确定的值,并非真正的无穷大,会随着其他数值而受到影响,t大于某个与INF相同数量级的数即可

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 220, M = 20020, INF = 1e9;
    int g[N][N];
    int m, n, Q;
    
    void floyd() {
        for(int k = 1; k <= n; k++) {
            for(int i = 1; i <= n; i++) {
                for(int j = 1; j <= n; j++) {
                    g[i][j] = min(g[i][j],g[i][k] + g[k][j]);
                }
            }
        }
    }
    int main() {
        scanf("%d%d%d",&n,&m,&Q);
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= n; j++) {
                if(i == j) g[i][j] = 0;
                else g[i][j] = INF;
            }
        }
        while(m -- ) {
            int a, b , c;
            scanf("%d%d%d",&a,&b,&c);
            g[a][b] = min(g[a][b],c);
        }
        floyd();
        while(Q -- ) {
            int a, b;
            scanf("%d%d",&a,&b);
            int t = g[a][b];
            if(t > 0x3f3f3f3f / 2) puts("impossible");
            else printf("%d
    ",t);
        }
        return 0;
    }
  • 相关阅读:
    BZOJ 2574: [Poi1999]Store-Keeper
    BZOJ 1024: [SCOI2009]生日快乐
    BZOJ 2541: [Ctsc2000]冰原探险
    hihoCoder 1303 数论六·模线性方程组
    Codeforces 710 D. Two Arithmetic Progressions
    BZOJ 1670: [Usaco2006 Oct]Building the Moat护城河的挖掘
    ZJOI2014 2048
    51Nod 1766 树上的最远点对
    Codeforces 727 F. Polycarp's problems
    BZOJ 3736: [Pa2013]Karty
  • 原文地址:https://www.cnblogs.com/yonezu/p/13492769.html
Copyright © 2011-2022 走看看