1.自然语言描述
floyd 算法是用来解决多源最短路问题的算法。其核心思想是DP,在每两个点之间试所有点做中间点来更新两点之间的距离使达到最短。复杂度较高(O(n^3))
2.代码描述
题目:Acwing.854 Floyd求最短路题目链接
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=210;
int n,m,k,d[MAXN][MAXN];
void floyd()
{
for(int l=1;l<=n;l++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
d[i][j]=min(d[i][j],d[i][l]+d[l][j]);
}
int main(void)
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j)
d[i][j]=0x3f3f3f3f;
else
d[i][j]=0;//自己到自己的最短路永远是0
for(int i=0;i<m;i++){
int a,b,c;
cin>>a>>b>>c;
d[a][b]=min(d[a][b],c);
}
floyd();
while(k--){
int x,y;
cin>>x>>y;
if(d[x][y]>=0x3f3f3f3f/2)//对于0x3f3f3f3f/2的解释:当图中存在负权边,即使两点之间未连通,也会更新导致原本的0x3f3f3f3f减小。
cout<<"impossible"<<endl;
else
cout<<d[x][y]<<endl;
}
return 0;
}