再谈Bellman-Ford
这几天学校女生节,挺累的,感觉还是挺好玩的,前几天看了一下最短路,Bellman-fort算法果然比较厉害,今天又参考了刘汝佳的两本书,有了一点新的认识。
废话不说,先上代码:
#include <bits/stdc++.h> using namespace std;const int INF = 0x3f3f3f3f; const int maxn = 1000;struct Edge {int from,to;int dist; };struct BellmanFord {int n,m;vector<Edge> edges;vector<int> G[maxn];bool inq[maxn];int d[maxn];int p[maxn];int cnt[maxn];void init(int n){this->n = n;for(int i=0; i<n; i++) G[i].clear();edges.clear();}void AddEdge(int from,int to,int dist){edges.push_back((Edge){from,to,dist});m = edges.size();G[from].push_back(m-1);}bool negativeCycle(int s){queue<int> Q;memset(inq,0,sizeof(inq));memset(cnt,0,sizeof(cnt));for(int i=0; i<n; i++){d[i] = INF;}d[s] = 0;inq[s] = true;Q.push(s);while(!Q.empty()){int u = Q.front();Q.pop();inq[u] = false;for(int i=0; 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;p[e.to] = G[u][i];if(!inq[e.to]){Q.push(e.to);inq[e.to] = true;if(++cnt[e.to]>n)return false;}}}}return true;}};struct BellmanFord {int n,m;vector<Edge> edges;vector<int> G[maxn];bool inq[maxn];int d[maxn];int p[maxn];int cnt[maxn];void init(int n){this->n = n;for(int i=0; i<n; i++) G[i].clear();edges.clear();}void AddEdge(int from,int to,int dist){edges.push_back((Edge){from,to,dist});m = edges.size();G[from].push_back(m-1);}bool negativeCycle(){queue<int> Q;memset(inq,0,sizeof(inq));memset(cnt,0,sizeof(cnt));for(int i=0; i<n; i++){d[i] = 0;inq[0] = true;Q.push(i);}while(!Q.empty()){int u = Q.front();Q.pop();inq[u] = false;for(int i=0; i<G[u].size(); i++){Edge& e = edges[G[u][i]];if(d[e.to]>d[u]+e.dist){d[e.to] = d[u] + e.dist;p[e.to] = G[u][i];if(!inq[e.to]) {Q.push(e.to);inq[e.to] = true;if(++cnt[e.to]>n)return true;}}}}return false;}};
View Code
第一个Bellman-Ford算法是紫书上的;
解析:
1、起点入队列
2、初始化点到起点的距离是INF;
3、和Dijkstra相比,每个结点可以多次加入(如果有负环,那么这个结点是可以多次松弛的,一旦次数无穷就说明了这的确是个负环);
4、因为是从起点出发的,然后在搜索邻接表,没有找到负环,只能说明,从起点到不了负环,但是可能是有负环的。没有负环,最短路数组 d 是正确可用的。
第二个Bellman-Ford算法是白书上的;
解析:
1、Bellman-Ford 算法一个重要应用就是判负环,上面的一个起点入队列,就要改成所有点入队列。
2、初始化 d 数组为 0:
可以从第二图中,有一个负环,但是从 0 ,无法松弛;但是,在队列中,从 1 开始搜索的时候,还是可以松弛,并且找到这个负环;然后由于每个结点之前都入过队列,就能保证找到那个负环。
转载于:https://www.cnblogs.com/TreeDream/p/6123476.html
再谈Bellman-Ford相关推荐
- SPFA or bellman ford松弛法--单源最短路
问题概述:有编号1-n的n个站点,有m条公交车路线,公交车只从一个起点站直接到达终点站,是单向的且每条路线有它自己的车费,有P个人早上从1出发,他们要到达每一个公交站点,然后到了晚上再返回点1,求所有 ...
- Bellman——Ford算法
Bellman--Ford 算法介绍 思路讲解 案例分析与代码实现 案例分析 代码实现 优先队列优化(SPFA) 优化原理 代码实现 算法介绍 我们知道Dijkstra算法只能用来解决正权图的单源最短 ...
- Bellman Ford算法详解
一.用途 1. Bellman Ford算法是解决拥有负权边最短路问题的方法之一.还有一种方法是SPFA算法. 2. 二者相比,SPFA算法在效率方面是优于Bellman Ford算法的.但在某些情况 ...
- Bellman ford算法(贝尔曼·福特算法)
Bellman - ford算法是求含负权图的单源最短路径的一种算法,效率较低,代码难度较小.其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在n-1次松弛后还能更新,则说明图中有负环,因此无 ...
- 再谈JSON -json定义及数据类型
再谈json 近期在项目中使用到了highcharts ,highstock做了一些统计分析.使用jQuery ajax那就不得不使用json, 可是在使用过程中也出现了非常多的疑惑,比方说,什么情况 ...
- C++_动态绑定,再谈const,new,delete
C++_动态绑定,再谈const,new,delete
- 再谈HTTP2性能提升之背后原理—HTTP2历史解剖
即使千辛万苦,还是把网站升级到http2了,遇坑如<phpcms v9站http升级到https加http2遇到到坑>. 因为理论相比于 HTTP 1.x ,在同时兼容 HTTP/1.1 ...
- 再谈工作的主动性和有效提问
主动性是一个非常奇怪的词,每个人对这个词的理解都不一样.可能一个管理者对员工说,你要提高主动性,但是员工会非常苦恼,甚至崩溃:我都天天加班了,你居然还在谈提高主动性? 结合很多应届生在实际工作中遇到的 ...
- 再谈符号间干扰(一)
在对话通信原理系列相关博文中,有这么一篇博文:通信系统之信道,这篇博文里面已经讲过符号间干扰(ISI),发生符号间干扰的原因在于信号带宽大于相干带宽,同一个意思的表达为:发送符号的周期小于最大时延扩展 ...
- 我的WCF之旅 (11): 再谈WCF的双向通讯-基于Http的双向通讯 V.S. 基于TCP的双向通讯...
在一个基于面向服务的分布式环境中,借助一个标准的.平台无关的Communication Infrastructure,各个Service通过SOAP Message实现相互之间的交互.这个交互的过程实 ...
最新文章
- H5进阶篇--实现微信摇一摇功能
- 三十三、Java集合中的LinkedList
- linux shell的输出效果修改方法(界面颜色)
- jps命令:查看Java进程等详细信息
- php 清除指定session,PHP如何操作指定的session?
- 正则表达式的几个简单验证
- 人脸方向学习(十一):Face Landmark Detection-PFLD解读
- 一款非常好看的婚纱请柬设计英文字体
- 人物回眸效果怎么用Vegas设置
- 从程序员的角度分析微信小程序(编程语言:用到什么学什么)
- 锅炉实现物联网云平台方案
- task04 办公自动化之Python 操作 PDF
- SSO(Single Sign On):原理与使用
- 如何搭建一个react项目?
- 整车控制器(VCU)的功能
- 格式工厂 wav 比特率_【资源分享】格式工厂FORMAT FACTORY-5.1.0
- 无胁科技-TVD每日漏洞情报-2022-7-20
- Java初学者——小白篇(一)
- RiPro主题-子主题huzao-child美化包v4.0带更新(附下载插件)
- About email