单源最短路——SPFA算法(Bellman-Ford算法队列优化)
spfa的算法思想(动态逼近法):
设立一个先进先出的队列q用来保存待优化的结点,优化时每次取出队首结点u,并且用u点当前的最短路径估计值对离开u点所指向的结点v进行松弛操作,如果v点的最短路径估计值有所调整,且v点不在当前的队列中,就将v点放入队尾。这样不断从队列中取出结点来进行松弛操作,直至队列空为止。
松弛操作的原理是著名的定理:“三角形两边之和大于第三边”,在信息学中我们叫它三角不等式。所谓对结点i,j进行松弛,就是判定是否dis[j]>dis[i]+w[i,j],如果该式成立则将dis[j]减小到dis[i]+w[i,j],否则不动。
下面举一个实例来说明SFFA算法是怎样进行的:
和广搜bfs的区别:
SPFA
在形式上和广度(宽度)优先搜索非常类似,不同的是bfs中一个点出了队列就不可能重新进入队列,但是SPFA中一个点可能在出队列之后再次被放入队列,也就是一个点改进过其它的点之后,过了一段时间可能本身被改进(重新入队),于是再次用来改进其它的点,这样反复迭代下去。
算法描述:
void spfa(s); //求单源点s到其它各顶点的最短距离
for i= to n do
{
dis[i]=∞; //初始化每点到s的距离,不在队列
vis[i]=false;
}
dis[s]=; //将dis[源点]设为0
vis[s]=true; //源点s入队列
head=;
tail=;
q[tail]=s; //源点s入队, 头尾指针赋初值
while head<tail do
{
head+; //队首出队
v=q[head]; //队首结点v
vis[v]=false; //释放对v的标记,可以重新入队
for 每条边(v,i) //对于与队首v相连的每一条边
if (dis[i]>dis[v]+a[v][i]) //如果不满足三角形性质
dis[i] = dis[v] + a[v][i] //松弛dis[i]
if (vis[i]=false)
{
tail+; //不在队列,则加入队列
q[tail]=i;
vis[i]=true;
}
}
代码实现:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
struct node
{
int to;
int power;
} t;
vector<node>g[];
int vis[];
int dis[];///记录各个点到起点的距离
void SPFA(int s)
{
queue<int>q;///建立队列
int point,i,j;
q.push(s);
vis[s]=;///加入队列并标记
while(!q.empty())///在队列不为空的情况下
{ point=q.front();
q.pop();
vis[point]=;///弹出队列取消标记
for(i=; i<g[point].size(); i++)
{
if(dis[g[point][i].to]>g[point][i].power+dis[point])
{
dis[g[point][i].to]=g[point][i].power+dis[point];///松弛操作,更新路径
if(!vis[g[point][i].to])///若该店不在队列中
{
q.push(g[point][i].to);
vis[g[point][i].to]=;///将该点压人队列并标记
}
}
}
}
}
int main()
{
int i,j,a,b,c;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==||m==)
{
break;
}
memset(vis,,sizeof(vis));
memset(dis,inf,sizeof(dis));
for(i=; i<; i++)
{
g[i].clear();///清空队列
}
for(i=; i<m; i++)
{
scanf("%d%d%d",&a,&b,&c);
t.to=a;
t.power=c;
g[b].push_back(t);
t.to=b;
t.power=c;
g[a].push_back(t);///双向
}
dis[]=;
SPFA();///起点为1
printf("%d\n",dis[n]);
}
return ;
}
单源最短路——SPFA算法(Bellman-Ford算法队列优化)的更多相关文章
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- 图论-单源最短路-SPFA算法
有关概念: 最短路问题:若在图中的每一条边都有对应的权值,求从一点到另一点之间权值和最小的路径 SPFA算法的功能是求固定起点到图中其余各点的的最短路(单源最短路径) 约定:图中不存在负权环,用邻接表 ...
- 单源最短路SPFA算法
$huaji^{233……}$模板:洛谷 P3371 #include<iostream> #include<algorithm> #include<cstdio> ...
- HDU 2066 一个人的旅行(单源最短路SPFA)
Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还 ...
- [模板][HDU]P2544[单源最短路][SPFA]
题目就不放了,主要是写一下SPFA,很少写,今天特别学了一个用STL的队列来做的. 代码: #include<iostream> #include<cstdio> #inclu ...
- 单源最短路SPFA
#include<iostream> #include<queue> #include<cstring> #define INF 0x3f3f3f3f using ...
- 最短路问题--P4779 单源最短路(标准版)Dijkstra堆优化
题目背景 2018 年7月 19 日,某位同学在 NOI Day 1 T1 归程 一题里非常熟练地使用了一个广为人知的算法求最短路. 最终,他因此没能与理想的大学达成契约. 小 F 衷心祝愿大家不再重 ...
- 用scheme语言实现SPFA算法(单源最短路)
最近自己陷入了很长时间的学习和思考之中,突然发现好久没有更新博文了,于是便想更新一篇. 这篇文章是我之前程序设计语言课作业中一段代码,用scheme语言实现单源最段路算法.当时的我,花了一整天时间,学 ...
- 模板C++ 03图论算法 1最短路之单源最短路(SPFA)
3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过 ...
随机推荐
- mysql小特性:change buffer
change buffer是在其他数据库中没有的一个概念,说白了就是一块系统表空间分配的空间,针对的对象是辅助索引的叶子节点(为什么不是主键索引?因为主键索引是聚集索引,在磁盘上的排列是有序的,磁盘的 ...
- 也说java虚拟机
学习java的人如果不了解java虚拟机,那真是白学了. java为什么可以跨平台,就是因为虚拟机的作用,java虚拟机就相当于一个计算机,它有自己的内存结构,当java程序 ...
- echarts 点击方法总结,点任意一点获取点击数据,举例说明:在多图联动中点击绘制标线
关于点击(包括左击,双击,右击等)echarts图形任意一点,获取相关的图形数据,尤其是多图,我想部分人遇到这个问题一直很头大.下面我用举例说明,如何在多图联动基础上,我们点击任意一个图上任意一点,在 ...
- asp.net core上使用Redis demo
整体思路:(1.面向接口编程 2.Redis可视化操作IDE 3.Redis服务) [无私分享:ASP.NET CORE 项目实战(第十一章)]Asp.net Core 缓存 MemoryCache ...
- 【Hadoop故障处理】高可用(HA)环境DataNode问题
[故障背景] NameNode和DataNode进程正常运行,但是网页找不到DataNode,DataNode为空.各个节点机器之间可以ping同主机名. [日志排查] 众多日志中找到如下关键点错误信 ...
- ArrayList的源码分析(基于jdk1.8)
1.初始化 transient Object[] elementData; //实际存储元素的数组 private static final Object[] DEFAULTCAPACITY_EMPT ...
- Python系列之入门篇——pytables及其客户端
pytables及其客户端查看 pytables # ubuntu sudo apt-get install python-tables pip install flask flask-httpaut ...
- 安装 RobotFramework 可视化工具 RIDE
1. 概述 robot framework 的安装 可视化工具 ride 的安装 2. 准备 安装缘由 来自一本书 书名: Robot Framework自动化测试修炼宝典 豆瓣上有好评不少, 坏评也 ...
- elk6.3.2在线安装中文分词工具IK
1.进入ES目录并执行安装(注意版本号改成你需要的版本) cd /usr/share/elasticsearch ./bin/elasticsearch-plugin install https:// ...
- Solr第二讲——SolrJ客户端的使用与案例
一.Solrj的使用 1.什么是Solrj solrj是访问Solr服务的java客户端(就像通过jedis操作redis一样),提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过Sol ...