图的最短路算法 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 ...
随机推荐
- ant中copy操作学习心得(转)
Ant真是太方便了,以前都没注意到它.功能很强大,能创建数据库,配置服务器,部署发布应用……只需要写好build.xml文件,剩下的就交给ant来“安装”你的WEB应用了. Appfuse的第一个an ...
- 简单的缓存代理HTTP服务器
http, 演示客户与服务器套接字. http只支持GET操作及硬编码的MIME类型的一小部分(MIME类型是多媒体内容的类型描述符).代理HTTP服务器是单线程的,该线程中每一个请求依次被处 ...
- DBA_FND Load程式迁移工具介绍和应用(案例)
2014-06-10 Created By BaoXinjian
- C#(二维数组/集合)
一.二维数组int [,] array = new int[5,3];//有五个一维数组,每一个一维数组有3个元素 /打印出来一个“王”这个字string[,] wang = new string[, ...
- 从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中
//从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中 //作者:sandy //时间:2015-10-10 #inclu ...
- div高度自适应
第一种: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- mongodb csv 文件导入数据库,删除特定字段
1. 导入数据库 mongoimport -h host_ip -p port -d db_name -c collection_name --fields name1,name2,name3,nam ...
- C++学习18 派生类的析构函数
和构造函数类似,析构函数也是不能被继承的. 创建派生类对象时,构造函数的调用顺序和继承顺序相同,先执行基类构造函数,然后再执行派生类的构造函数.但是对于析构函数,调用顺序恰好相反,即先执行派生类的析构 ...
- [AIR] 利用SnapShot.exe实现QQ截屏功能
主类(可作文档类): package { import flash.display.Bitmap; import flash.display.Sprite; import flash.events.E ...
- java的io读取
package gys; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; imp ...