SPFA 求带负权的单源最短路
int spfa_bfs(int s)
{
///s表示起点。
queue <int> q;
memset(d,0x3f,sizeof(d)); ///d数组中存下的就是最短路径(存在的话)
d[s] = 0;
memset(c,0,sizeof(c));///c数组表示的是某一个节点的入队次数
memset(vis,0,sizeof(vis));///一如既往的标记数组 q.push(s); vis[s] = 1; c[s] = 1;
///顶点入队vis要做标记,另外要统计顶点的入队次数
int OK = 1;///OK用来表示是否有最短路径
while(!q.empty())
{
int x;
x = q.front(); q.pop(); vis[x]=0;
///队头元素出队,而且消除标记
for(int k = next[x]; k != -1; k = edge[k].next) ///遍历顶点x的邻接表
{ ///可是我个人认为这样的表示邻接表的方法不大好用
int y = v[k]; ///用vector<int> g[maxn]; 应该更好理解
if(d[x] + w[k] < d[y])
{
d[y] = d[x] + w[k]; ///松弛
if(!vis[y]) ///顶点y不在队内
{
vis[y] = 1; ///标记
c[y] ++; ///统计次数
q.push(y); ///入队
if(c[y]>NN) ///超过入队次数上限,说明有负环
return OK=0;
}
}
}
}
return OK;
}
这里须要注意的是 在读取边的过程中,对边的存储方式 这将关系到你在遍历与u相连的节点时 须要操作的内容
上面的存储方式并不好,有更好的存边方式。在这里就直接介绍SPFA的用法,不再赘述了
在这里给出一个链接 。里面有SPFA的更具体的介绍和证明。以及SPFA的dfs实现。有兴趣的同学能够进去看看~ ________SPFA链接biu~
SPFA 求带负权的单源最短路的更多相关文章
- Spfa 求含负权边的最短路 + 判断是否存在负权回路
在Bellman-Ford算法之后,我们总算迎来了spfa算法,其实就如同堆优化Dijkstra算法之于朴素版Dijkstra算法,spfa算法仅仅是对Bellman-Ford算法的一种优化,但是在形 ...
- 图之单源Dijkstra算法、带负权值最短路径算法
1.图类基本组成 存储在邻接表中的基本项 /** * Represents an edge in the graph * */ class Edge implements Comparable< ...
- SPFA 最短路 带负权边的---- 粗了解
SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算. 算法大致流程是用一个队列来进行维护. 初始时将源加入队列 ...
- 单源最短路:Dijkstra算法 及 关于负权的讨论
描述: 对于图(有向无向都适用),求某一点到其他任一点的最短路径(不能有负权边). 操作: 1. 初始化: 一个节点大小的数组dist[n] 源点的距离初始化为0,与源点直接相连的初始化为其权重,其他 ...
- 模板C++ 03图论算法 1最短路之单源最短路(SPFA)
3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过 ...
- 图论-单源最短路-SPFA算法
有关概念: 最短路问题:若在图中的每一条边都有对应的权值,求从一点到另一点之间权值和最小的路径 SPFA算法的功能是求固定起点到图中其余各点的的最短路(单源最短路径) 约定:图中不存在负权环,用邻接表 ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- spfa 单源最短路究极算法
学习博客链接:SPFA 求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm. SPFA算法是西南交通大学段凡丁于1994年发表的. 从名字我 ...
- Bellman-Ford 求含负权最短路
该算法详解请看 https://www.cnblogs.com/tanky_woo/archive/2011/01/17/1937728.html 单源最短路 当图中存在负权边时 迪杰斯特拉就 ...
随机推荐
- JavaScript: 2015 年回顾与展望
链接:http://www.sitepoint.com/javascript-2015-review/ JavaScript经历了一个不平凡的一年.尽管到5月份已经20年了,关于JS的新闻.项目和兴趣 ...
- 软件工程师应该关注的web加密手段
加密算法 1.非对称加密(公开密钥加密) 公开密钥加密,是加密和解密使用不同密钥的算法,广泛用于信息传输中. 常见的算法有:RSA.ElGamal.Rabin. 2.对称加密 ...
- Leetcode 476.数字的补数
数字的补数 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 注意: 给定的整数保证在32位带符号整数的范围内. 你可以假定二进制数不包含前导零位. 示例 1: 输入: 5 输出: 2 解 ...
- Struts has detected an unhandled exception异常
近期在写struts框架的时候会时不时的出现这个异常,多次实验以后发现,目前解决的方法只能通过重新部署项目再重新启动服务器解决,通常这个异常会出现在DMI即动态方法调用过程中.
- 设计模式(十六)迭代器模式 Iterator
什么时候需要用到迭代器模式? 有许多中方法,可以把对象堆起来放进一个集合(可以是数组.堆栈.列表.哈希表,等等). 每一种类型的集合,都有各自适用的时机.但是某个时间段,客户端可能希望去遍历这个集合. ...
- 【Luogu】P2801教主的魔法(分块)
题目链接 激动qwq.这是我A的第一道分块. 分块之后对块内元素暴力sort.修改的时候对于整块打个标记,查询的时候只需要查C-tag就行了 对于非整块,暴力修改,改完之后sort 对于查询……非整块 ...
- 【Luogu】P3205合唱队(区间DP)
题目链接 通过这题我发现我已经不会DP了 区间DP,f[i][j]是从左面转移来的,d[i][j]是从右面转移来的 然后DP方程是 ]) f[i][j]+=f[i+][j]; ][j]; f[i][j ...
- 刷题总结——跳蚤(poj1091容斥+分解质因数)
题目: Description Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有 ...
- 浅谈getStackTrace()方法(一)
缘起: 今天看到有一个工具类中有一句: String msgToPrint = Thread.currentThread().getStackTrace()[1].getMethodName(); 输 ...
- 【CF52C】Circular RMQ(线段树区间加减,区间最值)
给定一个循环数组a0, a1, a2, …, an-1,现在对他们有两个操作: Inc(le, ri, v):表示区间[le, ri]范围的数值增加v Rmq(le, ri):表示询问区间[le, r ...