hihoCoder-1089-Floyd

我们读入的时候,要考虑重边的问题,我们只取边的最小值就可以了。

#include <cstdio>
#include <cstring>
const int INF = 0x3f3f3f3f;
int map[105][105];
int n,m;

int min(int x,int y)
{
    return x < y ? x : y;
}

int main()
{
    int c, s, e;
    scanf("%d%d", &n, &m);
    memset(map, INF, sizeof(map));
    for (int i = 0; i <= n; i++)
        map[i][i] = 0;
    for (int i = 0; i < m; i++) {
        scanf("%d%d%d", &s, &e, &c);
        if (c<map[s][e])
            map[s][e] = map[e][s] = c;
    }
    for (int k = 1; k <= n;k++) {
        for (int i = 1; i <= n;i++) {
            for (int j = 1; j <= n;j++) {
                if (k!=i&&k!=j&&i!=j) {
                    map[i][j] = min(map[i][j], map[i][k] + map[k][j]);
                }
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j < n; j++) {
            printf("%d ", map[i][j]);
        }
        printf("%d
", map[i][n]);
    }
    // getchar();
    // getchar();
    return 0;
}
原文地址:https://www.cnblogs.com/xyqxyq/p/10397201.html