Flody算法:多源最短路径(动规思想)
其实相比Dijkstra算法-堆优化版本(单源最短路径)外面再套一个for循环改为多源最短路径,写法更简洁,但是for循环套Dijkstra算法-堆优化,时间复杂度更低,O(n^2logn)
重点:状态转移方程
dp[i][j] = min(dp[i][j], max(dp[i][k], dp[k][j]))
max取的是路径中的最高栏,min取的是所有路径中高栏最矮的。
其实相比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 阅读



