[啊哈算法]Floyd-Warshall

Input
第一行四个数为n,m,n表示顶点个数,m表示边的条数。

接下来m行,每一行有三个数t1、t2 和t3,表示顶点t1到顶点t2的路程是t3。请注意这些t1->t2是单向的。

Output
输出一个n*n的矩阵,第n行第n列表示定点n到n的距离。每一行两个数间由空格隔开
Sample Input
5 8
1 2 2
2 3 3
3 4 4
4 5 5
5 3 3
3 1 4
2 5 7
1 5 10
Sample Output
0 2 5 9 9
7 0 3 7 7
4 6 0 4 9
12 14 8 0 5
7 9 3 7 0
题目

数据范围很小,我们采用求最短路的floyed算法。

#include <bits/stdc++.h>
#define inf 10000000
using namespace std;
int d[105][105];
int n, m, t1, t2, t3;

int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (i == j) {
                d[i][j] = 0;
            } else {
                d[i][j] = inf;
            }
        }
    }
    for (int i = 1; i <= m; i++) {
        scanf("%d%d%d", &t1, &t2, &t3);
        d[t1][t2] = t3;
    }
    for (int k = 1; k <= n; k++) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (d[i][j] > d[i][k] + d[k][j]) {
                    d[i][j] = d[i][k] + d[k][j];
                }
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            if (j != n)
                printf("%d ", d[i][j]);
            else
                printf("%d\n", d[i][j]);
        }
    }
    return 0;
}
代码

 

Input

第一行四个数为n,m,n表示顶点个数,m表示边的条数。

接下来m行,每一行有三个数t1、t2 和t3,表示顶点t1到顶点t2的路程是t3。请注意这些t1->t2是单向的。

Output

输出一个n*n的矩阵,第n行第n列表示定点n到n的距离。每一行两个数间由空格隔开
posted @ 2021-02-03 18:39  月亮茶  阅读(73)  评论(0编辑  收藏  举报