- BC20280018's blog
Floyd 模板
- 2025-9-13 15:23:35 @
Floyd 模板
题目描述
给出一张由 个点 条边组成的无向图。
求出所有点对 之间的最短路径。
输入格式
第一行为两个整数 ,分别代表点的个数和边的条数。
接下来 行,每行三个整数 ,代表 之间存在一条边权为 的边。
输出格式
输出 行每行 个整数。
第 行的第 个整数代表从 到 的最短路径。
输入输出样例 #1
输入 #1
4 4
1 2 1
2 3 1
3 4 1
4 1 1
输出 #1
0 1 2 1
1 0 1 2
2 1 0 1
1 2 1 0
说明/提示
对于 的数据,,,任意一条边的权值 是正整数且 。
数据中可能存在重边。
#include <bits/stdc++.h>
using namespace std;
int f[105][105];
int main()
{
int n, m;
int u, v, w;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (i == j)
f[i][j] = 0;
else
f[i][j] = 2e9;
}
}
while (m--)
{
scanf("%d%d%d", &u, &v, &w);
if(w < f[u][v])
{
f[u][v] = w;
f[v][u] = w;
}
}
for (int k = 1; k <= n; k++)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if ((f[i][k] != 2e9) && (f[k][j] != 2e9))
f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
}
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
printf("%d ", f[i][j]);
printf("\n");
}
return 0;
}