谨以此博客,向Floyd大师致敬。
人人都知道,算法贵在精炼,但如果一定要选出一种最为精炼,最为巧妙的算法,那么我一定会去选Floyd算法。
即使它的时间性能在同类算法中算不上佼佼者,但它那大道至简的代码实现,那动态规划思想的极致运用,确实令我叹为观止,
沉迷其中难以自拔。
我甚至没有找出一道例题来实现Floyd算法,因为这短小精悍而通用的代码,根本不需要凭借任何一道题而存在。
for(int k=0;k<n;k++)for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
G[i][j]=min(G[i][j],G[i][k]+G[k][j]);
}
这或许是博主写的最短的博客了,托Floyd大师的福,你没看错,上面那个三重循环,就是算法的全部实现部分。只要将G数组初始化成Inf,当一维变量二维变量相等时,G初始化为零,n设置为图上点的个数,最后的G数组,就是任意两点之间的距离!!精妙,精妙到可怕。
比如我输出G【1】【3】,就可以把1号点到3号点最短路径的长度输出。
我相信肯定有想问为什么的读者,好奇心人皆有之,可博主自认为,对这算法的理解也只是皮毛,并且,这几乎可以说只有一句话的代码,实在太值得自己参悟了,大家不妨单步跟踪跑一下,有些知识,的确是别人无法用语言传授的,我不愿去用我拙劣的理解去亵渎Floyd大师,学习之路漫漫,致敬Floyd大师,与君共勉。