图的最短路算法 Bellman-Ford
BF求图的最短路径的时间复杂度是O(MN),这样的时间复杂度并不比迪杰斯特拉算法好,但是BF算法支持图中存在负权的情况,但图中不能存在负圈,因为如果存在负圈,最短路是不存在的,因此BF算法的另一个重要应用是判负圈(如果松弛了N-1次后,还能松弛,就说明存在负圈)
简单写法(没有判断是否存在负圈。判断负圈只要在最后判断能否继续进行松弛即可)
#include<iostream>
using namespace std;
;
<<;
int d[maxn],w[maxn],f[maxn],t[maxn];
int main()
{
int N,M;
cin>>N>>M;
;i<M;i++){
cin>>f[i]>>t[i]>>w[i];
}
;i<=N;i++) d[i]=inf;
d[]=;
;i<=N-;i++){//最短路径最多经过N-1个节点 需要N-1轮松弛
;j<M;j++){//枚举所有的边
int x=f[j],y=t[j];
if(d[x]<inf) d[y]=min(d[y],d[x]+w[j]);
}
}
cout<<d[N];
;
}
可以用队列进行优化,代替上面的循环检查(代码来自 刘汝佳《算法竞赛入门经典》)
#include<iostream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
<<;
;
struct Edge{
int from,to,dist;
};
vector<Edge> edges;
vector<int> G[maxn];
int N,M;
int inq[maxn]/*在队列里的标记*/,cnt[maxn]/*某个节点进入队列的次数,也就是松弛的次数*/;
int d[maxn];
bool bellman_ford(int s){
queue<int> Q;
memset(inq,,sizeof(inq));
memset(cnt,,sizeof(cnt));
;i<=N;i++) d[i]=inf;
d[s]=;inq[s]=;Q.push(s);
while(!Q.empty()){
int u=Q.front();Q.pop();
inq[u]=;//出队
;i<G[u].size();i++){
Edge& e=edges[G[u][i]];
if(d[u]<inf&&d[e.to]>d[u]+e.dist){
d[e.to]=d[u]+e.dist;
if(!inq[e.to]){
Q.push(e.to);inq[e.to]=;//入队
if(++cnt[e.to]>N) return false;
}
}
}
}
return true;
}
int main()
{
int f,t,dd;
cin>>N>>M;
;i<M;i++){
cin>>f>>t>>dd;
edges.push_back((Edge){f,t,dd});
int m=edges.size();
G[f].push_back(m-);
}
))//起点是1
cout<<d[N];//终点是N
else cout<<"Impossible!";//存在负圈
;
}
图的最短路算法 Bellman-Ford的更多相关文章
- 图的最短路算法 Dijkstra及其优化
单源最短路径算法 时间复杂度O(N2) 优化后时间复杂度为O(MlogN)(M为图中的边数 所以对于稀疏图来说优化后更快) 不支持有负权的图 #include<iostream> usin ...
- 图的最短路算法 Floyd
多源最短路径算法 时间复杂度O(N3) 简单修改可求有向图的传递闭包 #include<iostream> using namespace std; const int maxn=1024 ...
- Bellman - Ford 算法解决最短路径问题
Bellman - Ford 算法: 一:基本算法 对于单源最短路径问题,上一篇文章中介绍了 Dijkstra 算法,但是由于 Dijkstra 算法局限于解决非负权的最短路径问题,对于带负权的图就力 ...
- poj1860 bellman—ford队列优化 Currency Exchange
Currency Exchange Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 22123 Accepted: 799 ...
- Bellman—Ford算法思想
---恢复内容开始--- Bellman—Ford算法能在更普遍的情况下(存在负权边)解决单源点最短路径问题.对于给定的带权(有向或无向)图G=(V,E),其源点为s,加权函数w是边集E的映射.对图G ...
- 算法专题 | 10行代码实现的最短路算法——Bellman-ford与SPFA
今天是算法数据结构专题的第33篇文章,我们一起来聊聊最短路问题. 最短路问题也属于图论算法之一,解决的是在一张有向图当中点与点之间的最短距离问题.最短路算法有很多,比较常用的有bellman-ford ...
- Til the Cows Come Home 最短路Dijkstra+bellman(普通+优化)
Til the Cows Come Home 最短路Dijkstra+bellman(普通+优化) 贝西在田里,想在农夫约翰叫醒她早上挤奶之前回到谷仓尽可能多地睡一觉.贝西需要她的美梦,所以她想尽快回 ...
- ACM/ICPC 之 最短路径-Bellman Ford范例(POJ1556-POJ2240)
两道Bellman Ford解最短路的范例,Bellman Ford只是一种最短路的方法,两道都可以用dijkstra, SPFA做. Bellman Ford解法是将每条边遍历一次,遍历一次所有边可 ...
- Dijkstra 最短路算法(只能计算出一条最短路径,所有路径用dfs)
上周我们介绍了神奇的只有五行的 Floyd 最短路算法,它可以方便的求得任意两点的最短路径,这称为"多源最短路".本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做&q ...
随机推荐
- gcc/g++ 静态动态库 混链接.
我的环境: centos6 x64. gcc4.4.7 在使用gcc/g++ 编译程序时我们希望指向一些库是使用静态的链接方式. 另外的一些是动态的方式. 我以boost 为例. 如果我们要使用静态库 ...
- SVN学习之参数定义及设置
http://jackyrong.iteye.com/blog/238835 conf目录中打开svnserve.conf ,去掉注释,搞成如下这样 [general] anon-access = r ...
- 黄聪:如何添加360浏览器(chrome)添加JavaScript例外,禁止网站加载JS
注意:通配符两侧的[]不能省略
- ArrayList源码
1.首先看对ArrayList的定义: public class ArrayList<E> extends AbstractList<E> implements Lis ...
- SpringJDBC
<!-- JdbcTemplate:最基础的springJDBC模板,这个模板支持最简单的jdbc数据库访问功能以及简单的索引参数查询 NamedParameterJdbcTemplate:使用 ...
- PLSQL_性能优化系列07_Oracle Parse Bind Variables解析绑定变量
2014-09-25 Created By BaoXinjian
- Standing on Shouder of Giants
Zachary_Fan 如何一步一步用DDD设计一个电商网站(二)-- 项目架构 http://www.cnblogs.com/Zachary-Fan/p/6012454.html HTTP 权威指南 ...
- 如何给ubuntu虚拟机添加硬盘和快捷键(转载)
From:http://os.51cto.com/art/201003/188721.htm 刚开始建立Ubuntu虚拟机时间,把容量设置为8Gb 了,然后没过几天就没有地方了,郁闷!查了一下,有几种 ...
- 播放wav聲音格式
1. #import <AudioToolbox/AudioToolbox.h> 2.聲明 成員变量 SystemSoundID soundID; 3.播放 - (void)playSou ...
- iOS应用开发:什么是ARC
ARC是什么 ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting).简单地说,就是代码中自动加入了retain/release,原先需要手动添加的 ...