floyd算法及注意事项
对于floyd算法的写法有几个注意点:
- 对边松弛的中间点的循环要放在三个for循环的最外层
- 使用邻接矩阵存图时,每个点自己到自己的距离要初始化为0,即对角线的位置要初始化为0,其他点没有边直接相连时,要初始化为inf(inf依照题目定),如果初始化
INT_MAX,在判断是否需要松弛的时候可能会产生int溢出的情况。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n,m;
cin >> n >> m;
constexpr int inf = 10000 * 1000 + 1;
vector<vector<int>> g(n+1,vector<int>(n+1,inf));
for(int i=0;i<n+1;i++) {
g[i][i] = 0;
}
for(int i=0;i<m;i++) {
int u,v,w;
cin>>u>>v>>w;
g[u][v]=w;
g[v][u]=w;
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
for(int k = 1; k <= n; k++) {
if(g[j][k] > g[j][i] + g[i][k]) {
g[j][k] = g[j][i] + g[i][k];
}
}
}
}
int q;
cin >> q;
vector<pair<int,int>> edges;
for(int i=0;i<q;i++) {
int u,v;
cin>>u>>v;
edges.emplace_back(u,v);
}
for(auto [u,v] : edges) {
if(g[u][v] != inf) {
cout << g[u][v] << endl;
}else {
cout << -1 << endl;
}
}
}
本文来自博客园,作者:seonwee,转载请注明原文链接:https://www.cnblogs.com/seonwee/p/18593853

浙公网安备 33010602011771号