Floyd虽然时间复杂度为O(N^3)但是可以处理负权边的图,并且编码复杂度较低,故也是较好的算法。
(为了照顾只会c的朋友们,我就用c语言实现这个代码)
#include<stdio.h>
int main()
{
int n,m,x,y,d;
scanf("%d%d",&n,&m);//输入结点数,和关系数。
int s[n+1][n+1]={0};//初始化
for(int i=0;i<m;i++){
scanf("%d%d%d",&x,&y,&d);
s[x][y]=d;//输入距离
}
//Floyd算法:
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
if(s[i][k]!=0&&s[k][j]!=0&&s[i][j]>s[i][k]+s[k][j])
s[i][j]=s[i][k]+s[k][j];
}
}
}
}