该算法由Bellman-Ford算法演变过来,首先介绍一下Bellman-Ford算法

最短路最多经过n-1个点,可以用n-1轮松弛操作来得到

for(int i=;i<n;i++)
d[i]=INF;
d[]=;
for(int k=;k<n-;k++)
for(int i=;i<m;i++) //检查每条边
{
int x=u[i];
int y=v[i];
if(d[x]<INF)
d[y]=min(d[y],d[x]+w[i]);
}

当然这个算法我没有实际应用过,而是一直在用它的优化算法,利用队列代替前面的循环检查

SPFA最坏时间复杂度仍然为O(nm),但是有人分析其时间复杂度为O(km),k为每个点入队次数,正确性未知

SPFA和Bellman-Ford都可以检测负环但是只有后者可以输出负环

下面给出邻接表实现的SPFA算法,可以求出单源最短路。

 #include<iostream>
#include<cstring>
using namespace std;
const int maxn=;
const int maxm=;
const int INF=0x7fffffff;
//
int n,m,s;
//
int g[maxn];
struct point
{
int t,w,next;
}e[maxm];
int d[maxn];
//
int tot=;
void addedge(int a,int b,int c)
{
tot++;
e[tot].t=b;
e[tot].w=c;
e[tot].next=g[a];
g[a]=tot;
}
//
int q[maxn];
bool v[maxn];
void spfa(int x0)
{
for(int i=;i<=n;i++)
d[i]=(i==x0?:INF);
int h=,t=;
q[t]=x0;
while(h!=t)
{
h=h%maxn+;
int x=q[h];
v[x]=false;
for(int tmp=g[x];tmp;tmp=e[tmp].next)
{
if(d[e[tmp].t]>d[x]+e[tmp].w)
{
d[e[tmp].t]=d[x]+e[tmp].w;
if(!v[e[tmp].t])
{
v[e[tmp].t]=true;
t=t%maxn+;
q[t]=e[tmp].t;
}
}
}
}
}
int main()
{
cin>>n>>m>>s;
for(int i=;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
addedge(x,y,z);
}
spfa(s);
for(int i=;i<=n;i++)
cout<<d[i]<<" ";
return ;
}

图论:最短路-SPFA的更多相关文章

  1. 图论最短路——spfa

    今天开始图论的最短路的最后复习,今天自己手打spfa虽然看了一眼书,但是也算是自己打出来的,毕竟很久没打了,而且还是一遍a代码下来15min左右就搞完了,成就感++.所以呢来篇博客记录一下. 香甜的黄 ...

  2. 图论--最短路--SPFA

    SPFA算法(shortest path faster algorithm)算法是西南交通大学段凡丁于1994年发表的,它在Bellman-ford算法的基础上进行了改进,使其在能够处理待负权图的单元 ...

  3. 图论--最短路--SPFA模板(能过题,真没错的模板)

    [ACM常用模板合集] #include<iostream> #include<queue> #include<algorithm> #include<set ...

  4. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

  5. L - Subway(最短路spfa)

    L - Subway(最短路spfa) You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. In ...

  6. 图论-单源最短路-SPFA算法

    有关概念: 最短路问题:若在图中的每一条边都有对应的权值,求从一点到另一点之间权值和最小的路径 SPFA算法的功能是求固定起点到图中其余各点的的最短路(单源最短路径) 约定:图中不存在负权环,用邻接表 ...

  7. 图论——最短路:Floyd,Dijkstra,Bellman-Ford,SPFA算法及最小环问题

    一.Floyd算法 用于计算任意两个节点之间的最短路径. 参考了five20的博客 Floyd算法的基本思想如下:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个 ...

  8. 图论算法(三) 最短路SPFA算法

    我可能要退役了…… 退役之前,写一篇和我一样悲惨的算法:SPFA 最短路算法(二)SPFA算法 Part 1:SPFA算法是什么 其实呢,SPFA算法只是在天朝大陆OIers的称呼,它的正统名字叫做: ...

  9. 图论(最短路&最小生成树)

    图论 图的定义与概念 图的分类 图,根据点数和边数可分为三种:完全图,稠密图与稀疏图. 完全图,即\(m=n^2\)的图\((m\)为边数,\(n\)为点数\()\).如: 1 1 0 1 2 1 1 ...

随机推荐

  1. Python学习之路3 - 字符串操作&字典

    本节内容: 常用的字符串处理. 格式化输出字符串. 字符串的替换. 字符串和二进制的相互转化. 字典的操作 字符串操作 常用的字符串处理 name = 'vector' print(name.capi ...

  2. Thrift IDL使用方式

    I.背景 众所周知,Thrift是一个RPC的框架,其可用于不同语言之间的服务相互调用.比如最近接触到的一个运用环境: *前端使用Node.Js重构了部分我们的老旧代码(前后端未分离的SpringBo ...

  3. lintcode-42-最大子数组 II

    42-最大子数组 II 给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大. 每个子数组的数字在数组中的位置应该是连续的. 返回最大的和. 注意事项 子数组最少包含一个数 样例 给出数组 [1 ...

  4. iOS- 如何将非ARC的项目转换成ARC项目(实战)

    1.前言   因为公司有个国外餐饮系统,编程开发了3-4年,之前用的都是非ARC,开发到今年,第一批迭代开发的人员早已不见,目前发现了有许多的内存泄露之类的,系统没有自动释放该释放的内存.一旦app长 ...

  5. python模拟SQL语句操作文件

    1.需求 在文本界面输入SQL语句,查询相应的数据,例如输入下面的语句 print(''' 支持大小写的SQL语句查询,大写或者小写都可以 1. select * from db1.emp 2. se ...

  6. HDU 2068 Choose the best route

    http://acm.hdu.edu.cn/showproblem.php?pid=2680 Problem Description One day , Kiki wants to visit one ...

  7. position定位-absolute与fixed

    1. absolute 生成绝对定位元素,相对于static定位以外的第一个父元素进行定位. 2. fixed 生成绝对定位元素,相对于浏览器窗口进行定位.

  8. 【Linux】- CentOS搭建FTP服务器

    1.安装vsftpd yum install -y vsftpd 2.启动vsftpd服务 service vsftpd start 3.查看运行状态 netstat -nltp | 完毕!!! 参考 ...

  9. EasyUI 学习笔记

    EasyUI常见错误 1 . 无论是用HMTL形式实现组件还是使用代码 + HTML 形式实现组件 , 在为组件设置属性时 , 要注意属性值的类型问题 string:必须加引号 number:不加任何 ...

  10. 第22天:js改变样式效果

    一.输出语句 1.alert:弹出警示框(用的非常少,用户体验不好)完整写法:window.alert(“执行语句”):window对象,窗口,一般情况可省略alert(123); 2.console ...