图论:最短路-Bellman-Ford
我们之前介绍了一种,(最常用的)SPFA算法,SPFA算法是对Bellman-Ford算法的队列优化,用队列替代了Bellman-Ford中的循环检查部分
然后这里我们介绍Bellman-Ford算法是为了介绍其对负权环的判定部分,以及这部分在SPFA的体现
首先是建图部分,邻接链表,其实对于Bellman-Ford算法来说,边表足矣
int g[maxn],d[maxn];
struct Edge{int u,t,w,next;}e[maxm];
void addedge(int x,int y,int z)
{
cnt++;e[cnt].u=x;e[cnt].t=y;e[cnt].w=z;
e[cnt].next=g[x];g[x]=cnt;
}
原本青涩的邻接表变成了现在的样子,自从看了黄学长的代码风格,压行写可能更加舒适一些。。
这里我们对于每一条边,记录其起始节点,和边表结构统一
然后,是算法的核心部分:
for(int i=;i<=n;i++) d[i]=INF;
d[s]=;
for(int k=;k<n-;k++)
for(int i=;i<=m;i++)
{
int x=e[i].u,y=e[i].t;
if(d[x]<INF) d[y]=min(d[y],d[x]+e[i].w);
}
其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在n-1次松弛后还能更新,则说明图中有负环,因此无法得出结果,否则就完成
然后是对于负权环的判断部分:
bool flag=;
for(int i=;i<=m;i++)
if(d[e[i].t]>d[e[i].u]+e[i].w){flag = ;break;}
return flag;
对于每一条边进行检查,如果发现还能松弛,就存在负权环
最后给出完整实现,请注意如果每一条边的长度过大,在INF处一定不要越界,还有无向图的二倍边一定要记住
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=;
const int maxm=;
const int INF=0x7fffffff;
int s,n,m,cnt;
int g[maxn],d[maxn];
struct Edge{int u,t,w,next;}e[maxm];
void addedge(int x,int y,int z)
{
cnt++;e[cnt].u=x;e[cnt].t=y;e[cnt].w=z;
e[cnt].next=g[x];g[x]=cnt;
}
bool bellman_ford(int s)
{
for(int i=;i<=n;i++) d[i]=INF;
d[s]=;
for(int k=;k<n-;k++)
for(int i=;i<=m;i++)
{
int x=e[i].u,y=e[i].t;
if(d[x]<INF) d[y]=min(d[y],d[x]+e[i].w);
}
bool flag=;
for(int i=;i<=m;i++)
if(d[e[i].t]>d[e[i].u]+e[i].w){flag = ;break;}
return flag;
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
int x,y,z;
for(int i=;i<=m;i++) {scanf("%d%d%d",&x,&y,&z);addedge(x,y,z);}
bellman_ford(s);
for(int i=;i<=n;i++) {printf("%d ",d[i]);}
return ;
}
在SPFA中开一个数组记录每一个点的入队次数,如果一个点重复入队了n次,说明存在负权环
总体来说,SPFA算法比Bellman-Ford更加优越,稠密图情况二者的效率是差不多的
稀疏图来说,SPFA可能要快于Dijkstra并且,网格图可以把SPFA卡回原型
图论:最短路-Bellman-Ford的更多相关文章
- ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)
两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可 ...
- Bellman - Ford 算法解决最短路径问题
Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...
- poj1860 bellman—ford队列优化 Currency Exchange
Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 22123 Accepted: 799 ...
- uva 558 - Wormholes(Bellman Ford判断负环)
题目链接:558 - Wormholes 题目大意:给出n和m,表示有n个点,然后给出m条边,然后判断给出的有向图中是否存在负环. 解题思路:利用Bellman Ford算法,若进行第n次松弛时,还能 ...
- Bellman—Ford算法思想
---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...
- Dijkstra算法与Bellman - Ford算法示例(源自网上大牛的博客)【图论】
题意:题目大意:有N个点,给出从a点到b点的距离,当然a和b是互相可以抵达的,问从1到n的最短距离 poj2387 Description Bessie is out in the field and ...
- 图论算法——最短路径Dijkstra,Floyd,Bellman Ford
算法名称 适用范围 算法过程 Dijkstra 无负权 从s开始,选择尚未完成的点中,distance最小的点,对其所有边进行松弛:直到所有结点都已完成 Bellman-Ford 可用有负权 依次对所 ...
- HDU 5521 [图论][最短路][建图灵感]
/* 思前想后 还是决定坚持写博客吧... 题意: n个点,m个集合.每个集合里边的点是联通的且任意两点之间有一条dis[i]的边(每个集合一个dis[i]) 求同时从第1个点和第n个点出发的两个人相 ...
- 【GDOI】【图论-最短路】时间与空间之旅
最近打的一场校内训练的某题原题... 题目如下: Description 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spa ...
- 图论(最短路&最小生成树)
图论 图的定义与概念 图的分类 图,根据点数和边数可分为三种:完全图,稠密图与稀疏图. 完全图,即\(m=n^2\)的图\((m\)为边数,\(n\)为点数\()\).如: 1 1 0 1 2 1 1 ...
随机推荐
- Docker学习笔记总结
Docker学习笔记 https://yeasy.gitbooks.io/docker_practice/content/ 一 环境搭建 Ubuntu安装 .添加软件源的GPG密钥 curl -f ...
- css修改placeholder的样式
css修改placeholder的样式 input::-webkit-input-placeholder { /* WebKit browsers */ font-size:14px; color: ...
- 个人在git配置SSH Key遇到的问题以及解决方案
第一次用git上传代码到github,在这过程中遇到很多问题,在输入git命令的时候都小心翼翼,因为一不小心感觉就会出错.. 英语不好..在敲入git命令过程中各种错误提示勉强翻译下才看得懂 最后输入 ...
- Thrift IDL使用方式
I.背景 众所周知,Thrift是一个RPC的框架,其可用于不同语言之间的服务相互调用.比如最近接触到的一个运用环境: *前端使用Node.Js重构了部分我们的老旧代码(前后端未分离的SpringBo ...
- lintcode-161-旋转图像
161-旋转图像 给定一个N×N的二维矩阵表示图像,90度顺时针旋转图像. 样例 给出一个矩形[[1,2],[3,4]],90度顺时针旋转后,返回[[3,1],[4,2]] 挑战 能否在原地完成? 标 ...
- iOS如何做出炫酷的翻页效果
详情链接http://www.jianshu.com/p/b6dc2595cc3e https://github.com/schneiderandre/popping
- 异常--throw
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- JVM(二)GC
GC简介 Java堆内存 在运行时,java的实例被存放在堆内存区域.当一个对象不在被引用,满足条件就会从堆内存移除并且内存空间被回收.堆内存由三个主要区域 1.新生代 Eden空间(任何实例 ...
- Android studio出现Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Request"的解决办法
最近更新了一下Android Studio(下文简写成AS),然后打开工程发现出现Error:Unable to tunnel through proxy. Proxy returns "H ...
- 【Python】Python中*args 和**kwargs的用法
好久没有学习Python了,应为工作的需要,再次拾起python,唤起记忆. 当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值. 还是 ...