算法基础课-搜索与图论-spfa-AcWing 852. spfa判断负环:spfa求负环板子
文章目录
- 题目分析
- 题目链接
题目分析
来源:acwing
分析:
dist[x] 表示从源点到x点的最短距离。
spfa算法求最短路的算法步骤:
- 初始化一个队列,将起点入队。
- 取出队头元素t,遍历它的所有出边(t, j, w),意思是从t到j,边权为w的边,如果满足dist[j] > dist[t] + w, 就用的dist[t] + w 更新dist[j].同时,如果j没有入队,则将j入队。
- 重复上述过程,直到队列为空。
如果用spfa求负环的话, 需要统计到每个点的最短路所经过的边数。
用cnt数组来记录之。
cnt[x] 表示从源点到点x的最短路径所经过的边数。
如果到点x 的边数 cnt[x]≥ncnt[x] \geq ncnt[x]≥n,说明了什么呢?说明到x点至少经过了n条边,则这条最短路至少经过了n+1个点。 根据抽屉原理,总共有n个点,而该路径上至少有n+1个点,则说明该路径上至少有2个点是相同的。换句话说,该路径上是存在环的。
而且呢,由于我们是最短路,它之所以有环,是因为这个环的权值是负值(能够让最短路变小,否则不会更新到的)。
综上,在用spfa求最短路的时候,如果某个点的边数 cnt[x]≥ncnt[x] \geq ncnt[x]≥n,就说明存在负环啦。
另外,这道题目求是否存在负环,不一定从哪个点开始,所以刚开始入队的时候把所有点都入队,这样如果有1点最短路经过的边数≥n,就可以说明存在负环。
ac代码
#include<bits/stdc++.h>
using namespace std;
const int N = 2010, M = 10010;int h[N], e[M], w[M], ne[M], idx;
int n, m;
bool st[N];
int cnt[N];
int dist[N];
queue<int> q;void add(int a, int b, int c){e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
}bool spfa(){memset(dist, 0x3f, sizeof dist);for(int i = 1; i <= n; i ++){q.push(i);st[i] = true;}while(q.size()){int t = q.front();q.pop();st[t] = false;for(int i = h[t]; ~i; i = ne[i]){int j = e[i];if(dist[j] > dist[t] + w[i]){dist[j] = dist[t] + w[i];cnt[j] = cnt[t] + 1;// 负环if(cnt[j] >= n) return true;if(!st[j]){q.push(j);st[j] = true;}}}}return false;
}int main(){memset(h, -1, sizeof h);cin >> n >> m;while( m --){int a, b, c;cin >> a >> b >> c;add(a, b, c);}if(spfa()) puts("Yes");else puts("No");
}
题目链接
https://www.acwing.com/problem/content/854/
算法基础课-搜索与图论-spfa-AcWing 852. spfa判断负环:spfa求负环板子相关推荐
- Acwing - 算法基础课 - 笔记(图论 · 三)
文章目录 搜索与图论(三) 最小生成树 Prim算法 Kruskal算法 总结 二分图 染色法 匈牙利算法 小结 搜索与图论(三) 这一节讲解的是最小生成树和二分图 最小生成树 什么是最小生成树?首先 ...
- Acwing《算法基础课》第3章 搜索与图论
Acwing<算法基础课>第3章 搜索与图论 文章目录 Acwing<算法基础课>第3章 搜索与图论 深度优先遍历DFS 宽度优先搜索BFS 拓扑排序 dijkstra算法 朴 ...
- AcWing基础算法课Level-2 第三讲 搜索与图论
AcWing基础算法课Level-2 第三讲 搜索与图论 DFS AcWing 842. 排列数字3379人打卡 AcWing 843. n-皇后问题3071人打卡 BFS AcWing 844. 走 ...
- Acwing算法基础课学习笔记
Acwing学习笔记 第一章 基础算法 快速排序 归并排序 二分查找 前缀和与差分 差分 位运算 离散化 第二章 数据结构 单链表 双链表 栈 队列 单调栈 单调队列 KMP算法 Trie 并查集 堆 ...
- AcWing算法基础课第一讲(2):高精度加减乘除、前缀和、差分
文章目录 1. 高精度加法 2. 高精度减法 3. 高精度乘低精度 4. 高精度除以低精度 5. 一维前缀和 6. 二维前缀和 7. 一维差分 8. 二维差分 1. 高精度加法 这里讲解两个大整数的加 ...
- 常用代码模板3——搜索与图论(Bellman-Ford算法 、spfa 算法、floyd算法、Kruskal算法、染色法、匈牙利算法 )
目录 一.树与图的存储 二.树与图的遍历 (1) 深度优先遍历 -- 模板题 AcWing 846. 树的重心 (2) 宽度优先遍历 -- 模板题 AcWing 847. 图中点的层次 拓扑排序 -- ...
- 算法提高课-图论-负环-AcWing 904. 虫洞:spfa求负环裸题
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 负环:负环是这样的一个环,该环上的边权之和是负数. 存在负环的话,会对我们求最短路造成障碍,因为绕着这个负环转无数次,最短路越来越小 ...
- 算法基础课 acwing
算法基础课 本博客基于acwing算法基础课,所做笔记 目的在于方便复习 课程链接:https://www.acwing.com/activity/content/introduction/11/ 主 ...
- 算法与数据结构模版(AcWing算法基础课笔记,持续更新中)
AcWing算法基础课笔记 文章目录 AcWing算法基础课笔记 第一章 基础算法 1. 排序 快速排序: 归并排序: 2. 二分 整数二分 浮点数二分 3. 高精度 高精度加法 高精度减法 高精度乘 ...
最新文章
- 体育场[带权并查集]
- Nervos CKB 共识协议 NC-Max:突破 Nakamoto Consensus 吞吐量的极限
- 二叉树的遍历(前,中,后)
- OpenEuler系统是什么
- 你真的知道如何在 GitHub 上高效搜索开源项目吗?
- python爬虫案例——python爬取百度新闻RSS数据
- 只让类访问, 而不让类的实例来访问某个成员变量
- linux 端口映射 命令,linux查看端口映射命令
- 学计算机打字重不重要,怎么才能有效的学好电脑打字
- 【MapGIS精品教程】005:MapGIS中间件的配置与使用
- springboot自行车在线租赁管理系统毕业设计源码101157
- linux 硬盘测试几种工具
- MCMC抽样与LDA参数求解
- 对几款网络抓包工具的评测
- 十行代码让你的单机“影分身”,分布式训练速度快到飞起
- world 字体 选取高亮_Word2003选取文字的N种方法
- android wifi p2p框架,7.2.1 P2P架构
- 许昌西继电梯服务器显示ZY,许昌西继西门子电梯5000故障代码
- opencv中mask参数
- 微信聊天语音怎么转发?轻松易懂,快速学会