前言
最近几天,学习完了一些最短路径算法,由于学习路程艰难曲折,所以写下了这篇博客来总结一下
———————————————————————————————————————————————————————————
正文
floyd
首先,提到最短路径算法,最好写的肯定是Floyd算法,如果图的点数没有超过300的话,一般的题目还是能卡过去的
floyd算法,主要是通过枚举中转点(其实就是每个点),对全图都实现松弛操作,其实本质还是dp的思路,由于其较为简单,此处便不再进行的过多的讲解
附上代码:
void floyd()
{
for (int k=1; k<=n; k++)
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);//dist[i][j]数组表示全图中i,j两点的距离;松弛操作
}
floyd其实还可以寻找最小环,只需将dist数组初始化时改为无穷大,dist[i][i]设为无穷大,当跑完floyd时,
扫一遍,min=min(dist[i][i],min);即可
spfa(Shortest Path Faster Algorithm)
关于spfa———它死了
如果经(shen)常(shou)做(qi)题(hai)的同学会知道,如果是国内的比赛,
80%是会卡掉spfa的~~(毕竟不卡不舒服码)~~,如NOI2018Day1T1归程 ,
甚至还有hdu4889专门造数据卡掉spfa,所以对于spfa还是慎用。
spfa算法其实是Bell-Ford算法的队列优化,如果不是特意造数据卡的话,还是挺快的
对于spfa其算法本质是:
设立一个先进先出的队列q用来保存待优化的结点,优化