#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 500; // 最大节点数
const ll inf = 0x3f3f3f3f3f3f3f3f; // 表示无穷大的值
int n, m, q; // 节点数、边数、查询次数
ll dist[N][N]; // 存储任意两点间的最短距离
int main() {
cin >> n >> m >> q;
// 初始化距离矩阵为无穷大
memset(dist, 0x3f, sizeof(dist));
// 处理边输入
for (int i = 1; i <= m; i++)
{
ll x, y, z;
cin >> x >> y >> z;
dist[x][y] = min(dist[x][y], z); // 处理重边,保留最小权值
dist[y][x] = min(dist[y][x], z); // 无向图,双向更新
}
// 节点到自身的距离初始化为0
for (int i = 1; i <= n; i++) {
dist[i][i] = 0;
}
// Floyd-Warshall算法,动态规划更新所有点对的最短路径
for (int k = 1; k <= n; k++) { // 中间点k
for (int i = 1; i <= n; i++) { // 起点i
for (int j = 1; j <= n; j++) { // 终点j
// 如果经过k点路径更短,则更新dist[i][j]
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
// 处理每个查询
for (int i = 1; i <= q; i++)
{
ll x, y;
cin >> x >> y;
if (dist[x][y] == inf)
{
cout << "-1" << endl; // 不可达
}
else
{
cout << dist[x][y] << endl; // 输出最短距离
}
}
return 0;
}
弗洛伊德模板
最新推荐文章于 2025-05-13 12:23:22 发布