题目
题解
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll INF = 0x3f3f3f3f3f3f;
const ll Nmax = 500;
ll dis[Nmax][Nmax];
int main() {
ll n, m, q;
cin >> n >> m >> q;
// ini
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j) {
dis[i][i] = 0;
}
else {
dis[i][j] = INF;
}
}
}
// input
ll u, v, w;
for (int i = 0; i < m; i++) {
cin >> u >> v >> w;
dis[u][v] = min(dis[u][v], w); // 防止出现同一条路径有多种距离,取最短
dis[v][u] = dis[u][v];
}
//floyd
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
}
}
}
// output
ll s, e;
for (int i = 0; i < q; i++) {
cin >> s >> e;
if (dis[s][e] >= INF) {
cout << "-1" << endl;
}
else {
cout << dis[s][e] << endl;
}
}
return 0;
}
易错点
1. 最大值INF设置不够大
2. dis的类型应该是long long ,不然会爆缸
3. dis[u][v] = min(dis[u][v], w); // 防止出现同一条路径有多种距离,取最短;即可能出现一条路多个权值w