[啊哈算法]Floyd-Warshall
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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算法。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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的距离。每一行两个数间由空格隔开