floyd算法及注意事项

对于floyd算法的写法有几个注意点:

  1. 对边松弛的中间点的循环要放在三个for循环的最外层
  2. 使用邻接矩阵存图时,每个点自己到自己的距离要初始化为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;
      }
   }
}

posted @ 2024-12-08 21:34  seonwee  阅读(27)  评论(0)    收藏  举报