之前一直没有关注Floyd算法,因为觉得它的时间复杂度很高不实用,但是见到这题才真正了解它的优点:能够获得多源最短路。大致的循环思路是:
a) 初始化:D[u,v]=A[u,v]
b) For k:=1 to n
For i:=1 to n
For j:=1 to n
If D[i,j]>D[i,k]+D[k,j] Then
D[i,j]:=D[i,k]+D[k,j];
c) 算法结束:D即为所有点对的最短路径矩阵
#include <bits/stdc++.h>
using namespace std;
int edge[402][402];
int dis[402][402];
int n,m;
const int infinity = 10000000;
void Floyd()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dis[i][j] = edge[i][j];
}
}
for(int h=1;h<=n;h++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
dis[i][j] = min(dis[i][j],dis[i][h]+dis[h][j]);
}
}
}
}
int main()
{
for(int i = 0;i<=400;i++)
{
for(int j=0;j<=400;j++)
{
if(i!=j) edge[i][j] = infinity;
else edge[i][j] = 0;
}
}
cin>>n>>m;
int x,y,r;
for(int i = 0;i<m;i++)
{
cin>>x>>y>>r;
edge[x][y] = r;
}
Floyd();
int q;
cin>>q;
while(q--)
{
cin>>x>>y;
if(dis[x][y]<infinity) cout<<dis[x][y]<<endl;
else cout<<"-1"<<endl;
}
return 0;
}