2 条题解

  • 1
    @ 2025-3-31 14:10:26

    Flody算法:多源最短路径(动规思想) 其实相比Dijkstra算法-堆优化版本(单源最短路径)外面再套一个for循环改为多源最短路径,写法更简洁,但是for循环套Dijkstra算法-堆优化,时间复杂度更低,O(n^2logn)

    重点:状态转移方程 dp[i][j] = min(dp[i][j], max(dp[i][k], dp[k][j])) max取的是路径中的最高栏,min取的是所有路径中高栏最矮的。

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
      int n,m,t;
      cin>>n>>m>>t;
      int mp[n+1][n+1];
      int dp[n+1][n+1];
      const int INF = 1e6 + 4;
      for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            mp[i][j] = INF;
        }
      }
      
      while(m--)
      {
        int s,e,v;
        cin>>s>>e>>v;
        mp[s][e] = v;
      }
      for(int k = 1;k<=n;k++)
      {
        for(int i = 1;i<=n;i++)
        {
          for(int j = 1;j<=n;j++)
          {
            if(mp[i][k] != INF && mp[k][j] != INF)
            mp[i][j] = min(mp[i][j], max(mp[i][k], mp[k][j]));
          }
        }
      }
      
      while(t--)
      {
        int s,e;
        cin>>s>>e;
        cout<<(mp[s][e] == INF? -1 : mp[s][e])<<'\n';
      }
      return 0;
    }
    

    信息

    ID
    141
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    45
    已通过
    9
    上传者