2 条题解
-
1
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
- 上传者