邻接表实现 单源最短路径SPFA算法
来源:互联网 发布:网络结婚主持台词 编辑:程序博客网 时间:2024/05/21 22:48
首先讲邻接表的实现,以前一直遇到题目都是用vector模拟,今天遇到一个题目vector超时,于是学习了用数组模拟实现邻接表,新学的数据结构,搞的不是很透彻,记录一下。
其实就是头插法,首先用一个结构体E记录节点的信息,指向那个节点,以及指向节点的权值等信息,给E结构体设置一个next,让它指向H数组,H数组初始化为-1,初始化为-1是为了方便判断某个点直接相连点是否找完了,自己还不是很透彻了,等搞透彻了详细解释,先把实现放在这里方便以后参考,当然H也可以写成结构体形式,写成数组较简单。
其求最短路径还是相对比较快速的,最主要是比较好写,结合邻接表实现起来非常简单,相对于dijkstra 算法来说首先它能够求解给定的图存在负权边,而dijkstra 算法是不能求解的,所以SPFA就好用多了。
这是dijkstra 算法以及Floyd算法的讲解:http://blog.csdn.net/y990041769/article/details/8524903
SPFA说白了就是一个不断更新的一个过程,官方说法叫松弛,比如说左边的图中,一个无向图,4个顶点的联通性以及各边的权值如图所示,要求从1点开始遍历所有点的最短路径,那么可以借助一个队列,首先顶一个数组sp初始化为无穷大,sp【1】=0,找和1直接相连的点,1--》2权值为1,比sp【2】的值大,松弛sp【2】=1,入队,找一下个与1直接相邻的,第一轮可以得到:
sp【2】=1; sp【3】=1; sp【4】=4;
,第一轮你松弛完毕,第二轮开始,从队列中出队元素,得到:
sp【4】=3,从1--》2--》4过来
sp【4】=2,从1--》3-->4过来
其他的点不满足松弛的条件,所以上面结果就是最优的,那么从1开始的最短路就是sp【1--》4】的值得和 0 + 1 + 1 + 2 = 4.
这就是一个SPFA算法的求解过程,可以证明在一个无圈图中最多经过(n-1)轮操作可以得到最优结果,其中n是顶点的数目,今天一个队员一直搞不明白为什么是n-1次,其实就是一个图如果是一条直线,其他点都在这个直线上的话就要进行(n-1)松弛,其实实际上远远小于这个数目。
下面是代码实现模板。
首先是邻接表版:
然后是邻接矩阵版本:其中used数组记录是否访问,pre数据记录路径、
应用:
1)判环
假如一个路径中存在环路,可以用这个算法判环,具体方法是加一个cnt 数组,记录每个点松弛的次数,如果松弛次数大于n。则说明存在环路。
题目:http://acm.nyist.NET/JudgeOnline/problem.PHP?pid=973
2)
求最短路径,方法上面讲过
poj1511,
顺便说一道相关题目,这道题是给出一个有向图,求从1点出发的最短路径和回到一点的最短路之和,其实就是先从1一次SPFA,然后把图中边反向在从1进行一次SPFA,题目数据卡的很严,首先结果要用long long,然后初始化最大值一定要足够大,后台有很大的数据,卡了两次,这道题目也可是用dijkstra 算法+优先队列优化过了。好了,就这样吧,累了一天了。
题目代码附上:
3)求最长路。初始为0,往大松弛。
- 邻接表实现 单源最短路径SPFA算法
- 邻接表实现 单源最短路径SPFA算法 poj1511
- HDOJ 2544 最短路(最短路径 dijkstra算法,SPFA邻接表实现,floyd算法)
- 图论--SPFA算法---邻接表实现
- SPFA算法模版+邻接表实现
- SPFA算法之邻接表实现
- PKU1511(Invitation Cards)最短路径-邻接表+SPFA算法
- 邻接表实现,单源最短路径
- 最短路SPFA算法 (通过邻接表来实现)
- SPFA单源最短路算法—vector模拟邻接表实现
- 用邻接表实现spfa
- 单源最短路径之SPFA算法实现
- HDOJ 1874 畅通工程续(最短路径,dijkstra算法,spfa邻接表,floyd算法)
- HDOJ 1869 六度分离(最短路径,dijkstra算法,SPFA邻接表,floyd算法)
- 单源最短路径-spfa算法
- Spfa单源最短路径算法
- 单源最短路径:SPFA算法
- The Postal Worker Rings Once(UVA 117)最短路径—SPFA算法+邻接表
- nginx配置负载均衡
- Android—DialogActivity讲解
- 【Java并发编程】Executors
- 文档啊,最重要的还是层次感
- 基于Python的期货公司后台业务思考与实践
- 邻接表实现 单源最短路径SPFA算法
- 循环嵌套
- MongoDB学习笔记之文档的CRUD
- C++实现多线程socket通信,可多连接
- 58-总结-【cartographer源码分析】系列的第六部分【 mapping 】
- easyUI tree+layout SpringMVC 点击west里的菜单,在center里展示页面
- 使用php的GD库拼接图片
- 微服务架构(三):微服务重构应用及IBM解决方案
- 强学习器------随机森林