Floyd算法可以求出图中任意两点间的最短路,而且边权可为负。Floyd算法是利用了动态规划的思想,通过枚举路径上的点来更新最短路。
1 void floyd() { 2 for(int k=1;k<=n;++k) 3 for(int i=1;i<=n;++i) 4 for(int j=1;j<=n;++j) 5 if(d[i][j]>d[i][k]+d[k][j]) d[i][j]=d[i][k]+d[k][j]; 6 }
可以看出复杂度是O(n^3)的,当数据规模超过500就有可能超时了。但需要注意,没有直接相连的点之间的最短路需要初始化为inf,而inf的选择要保证足够大又不能溢出,通常选择0x3f3f3f3f作为inf。
Floyd还可以用于求传递闭包。
1 void floyd() { 2 for(int k=1;k<=n;++k) 3 for(int i=1;i<=n;++i) 4 for(int j=1;j<=n;++j) 5 d[i][j]=d[i][j]||(d[i][k]&&d[k][j]); 6 }