最短路复习(Floyd与Dijkstra)

5人阅读 评论(0) 收藏 举报
分类:

理论上来说,现在只会SPFA基本上就够NOIp用了,但是还是忍不住重新复习了一下。。。


Dijkstra算法

该算法仅用于无负权边的图,在稠密图(边数m接近于n^2的图,网格图就是一种非常稠密的图,相对的,稀疏图就是m远小于n^2的图)中的表现比较优秀,可以用邻接表也可以用邻接矩阵。

算法主体


算法也不算难,核心就是松弛操作,朴素的Dijkstra算法的时间复杂度为O(n^2)
①伪代码

清除所有点的标记(flag[i]=0)
dis[s]=0,其他dis[i]=INF      //s为起点的序号
循环n次{                      //n为结点数
  在所有未标记的结点中选出dis最小的结点x
  标记x(flag[x]=1)
  对从x出发的所有边V(x,y),更新dis[y]=min{dis[y],dis[x]+V(x,y).w}
}
②打印路径
省空间费时间方案

与dp中的方案打印一样:从重点出发,一直顺着d[i]+V(i,j).w==d[j]的路径回退到起点

省时间费空间方案

改一下松弛的写法,在松弛的同时在另一个数组记录下前驱结点

if(dis[x]+V(x,y).w<dis[y])
{
    pre[y]=x;
    dis[y]=dis[x]+V(x,y).w;
}

③堆优化

不难看出每次挑选点的过程占了时间复杂度的一个阶位之多,每次挑选出dis最小值,那么我们就可以考虑维护一个小根堆来加速这个算法中选结点的过程
这个小根堆每次松弛完一个点的所有边之后要更新一下,去掉标记过的点,更新结点的dis值,由此不难得出时间复杂度为O((n+m)logn)

Floyd

动态规划算法…深入理解挺困难的,但是代码真的短…
时间复杂度是O(n^3),应用于多源最短路,存图用邻接矩阵

①初始化

#define For(i,l,r) for(int i=l;i<=r;++i)
memset(dis,INF,sizeof dis);//INF不能太大也不能太小,太大会溢出,太小就。。
For(i,1,n)
 dus[i][i]=0;

然后有向边就是dis[from][to]=val
无向边就是两条有向边

②算法主体

For(k,1,n)
 For(i,1,n)
  For(j,1,n)
   dis[i][j]=min{dis[i][j],dis[i][k]+dis[k][j]};

③判联通

首先改一下预处理的方式

memset(dis,0,sizeof dis);
For(i,1,n)
 dis[i][i]=1;

然后边就是dis[from][to]=1
算法部分的处理语句改为

dis[i][j]=dis[i][j]||(dis[i][k]&&dis[k][j]);

好像叫“传递闭包”。。。迷。。。

DFS-SPFA

主要是用于判负环
有个比较简单的练手题
P2850 【[USACO06DEC]虫洞Wormholes】
我的下一篇博客应该就是这个的题解了。。。所以这里就不说了

BFS-SPFA

是Bellman-Ford的队列优化,松弛了一个点之后,继续松弛这个点能到达的所有结点,一直到队列空了
存在负环的时候不存在最短路,这个应该是显然的
模板题
P1339 [USACO09OCT]热浪Heat Wave
P3371 【模板】单源最短路径

很常用的算法,复杂度是O(ke),k一般是2,e是边数,最坏情况是O(nm)

查看评论

图论-最短路-Dijkstra算法&Floyd算 c++

最短路径解决了求解一个图中两顶点之间最短的路径问题。其中Dijkstra算法应用贪心法求解单源点到其余各点的最短路径问题;而Floyd算法则解决了图中任意两点间的最短路径问题。...
  • u011493860
  • u011493860
  • 2013-08-17 19:58:42
  • 1026

算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法

图论中一个经典问题就是求最短路,最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划,这也是算法中的两大经典代表。用一个简单图在纸上一步一步演算,也是...
  • thisinnocence
  • thisinnocence
  • 2014-06-20 16:54:41
  • 3261

最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford)

最短路知识点总结(Dijkstra,Floyd,SPFA,Bellman-Ford) Dijkstra算法: 解决的问题:     带权重的有向图上单源最短路径问题。且权重都为非...
  • qq_33406883
  • qq_33406883
  • 2016-07-20 17:55:04
  • 1602

整合:求最短路算法 floyd prim dijkstra Kruskal spfa算法简析

(转载) 一、floyd算法(快速计算i到j的最短距离,复杂度高[n^3]) 1.定义概览 Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短...
  • GrEedWish_X
  • GrEedWish_X
  • 2015-07-30 18:49:57
  • 1300

ACM_最短路模板(SPFA,Dijkstra,Floyd)

Floyd:void floyd() { int i,j,k; for (k=1; k
  • changjiale110
  • changjiale110
  • 2017-08-19 08:12:01
  • 264

总结分析一下三种求解最短路问题的算法,dijkstra算法,spfa算法,floyd算法。

说是总结,其实自己也没有学多长时间只是把自己这段时间的一些经验总结下来,用来供后来的初学者涨点经验吧。对于学习算法,个人的理解就是首先要去理解算法的本质,然后想想算法的实现过程,如何用代码去描述这个算...
  • gui951753
  • gui951753
  • 2015-08-22 22:31:42
  • 2071

ACM-最短路(SPFA,Dijkstra,Floyd)之最短路——hdu2544

ACM 最短路(SPFA,Dijkstra,Floyd) 最短路 hdu2544
  • lx417147512
  • lx417147512
  • 2014-05-27 11:59:54
  • 3739

hdu-2544-最短路-(bellman-ford、dijkstra、floyd、SPFA算法)

最短路问题在程序竞赛中是经常出现的内容,解决单源最短路经问题的有bellman-ford和dijkstra两种算法,其中,dijikstra算法是对bellman的改进。同时介绍了floyd算法、SP...
  • newproblems
  • newproblems
  • 2017-07-31 21:20:36
  • 304

图论:最短路问题 Floyd Dijkstra SPFA算法

昨天的模拟赛中有一道用到最短路算法的题,自己竟然写T了,所以今天来温习一下三个最短路算法,把模板写一写。  首先说明,这三个算法都是无向图有向图皆适用的。 Floyd算法: 三个里面最好写的算法,...
  • qq_25978793
  • qq_25978793
  • 2015-08-27 15:32:25
  • 866

模板--Floyd Dijkstra Bellman-Ford spfa 四种最短路经典算法

Floyd Dijkstra Bellman-Ford spfa 四种最短路经典算法汇总 最短路 Problem Description在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shi...
  • qq_38386316
  • qq_38386316
  • 2017-07-30 17:14:27
  • 1152
    个人资料
    持之以恒
    等级:
    访问量: 2212
    积分: 421
    排名: 12万+
    最新评论
    友情链接