返回题解分享
讨论 / 题解分享/ 帖子详情

奶牛跨栏 - 题解

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;
}
0 回复 0 转发 1 喜欢 4 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!