图的最短路算法 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 ...
随机推荐
- JS截取后缀名,文件全名,非后缀名的方法---收藏(冷饭_)
<script language="javascript" type="text/javascript"> //取整个文件的路径并且把文件名赋给文件 ...
- 像学历史课本一样学习Perl
第一次接触Perl,还是2008年10月份的时候,当时因为项目重构,需要进行大量的文本操作,于是便拾起了以“文本操作为己任”的Perl语言.当然,带我入门的还是那本赫赫有名的The Llama Bo ...
- 3. redis的超时,事务,watch
一. 键的生存时间 expire设置一个已经存在的key的生存时间,到时间后redis自动删除这个 命令 expire 设置生存时间(单位/秒) pexpire设置生存时间(单位/毫秒) ttl/pt ...
- (XAML)"XXXX" does not exist in the namespace "clr-
Error 139 Assembly 'System.Activities.Core.Presentation' was not found. Verify that you are not miss ...
- Report_客制化以PLSQL输出HTML标记实现WEB报表(案例)
2014-05-31 Created By BaoXinjian
- Codeforces Round #368 (Div. 2) D. Persistent Bookcase
Persistent Bookcase Problem Description: Recently in school Alina has learned what are the persisten ...
- 3.函数Function
所谓函数,本质上是一种代码的分组形式.我们可以通过这种形式赋予某组代码一个名字,便于日后重用是调用. function sum(a,b){ var c = a+b; return c; } 1.一个函 ...
- dynamic基元类型
C#编译器允许将一个表达式的类型标记为dynamic.还可以将一个表达式的结果放到一个变量中,并将变量的类型标记为dynamic. 代码使用dynamic表达式/变量来调用一个成员是,编译器会生成特殊 ...
- ylbtech-Unitity-CS-Arrays:数组
ylbtech-Unitity-CS-Arrays:数组 1.A,效果图返回顶部 1.B,源代码返回顶部 1.B.1, using System; class DeclareArraysSampl ...
- Linux vmstat命令--监控CPU 性能分析
top是给Linux设计的.在FreeBSD VM里面的Free概念和其他OS完全不同,使用top查看Free内存对于FreeBSD来说可以说没什么意义.正确的方法是看vmstat. vmstat是V ...