文章目录

  • 题目分析
  • 题目链接

题目分析

来源:acwing

分析:
dist[x] 表示从源点到x点的最短距离。

spfa算法求最短路的算法步骤:

  1. 初始化一个队列,将起点入队。
  2. 取出队头元素t,遍历它的所有出边(t, j, w),意思是从t到j,边权为w的边,如果满足dist[j] > dist[t] + w, 就用的dist[t] + w 更新dist[j].同时,如果j没有入队,则将j入队。
  3. 重复上述过程,直到队列为空。

如果用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求负环板子相关推荐

  1. Acwing - 算法基础课 - 笔记(图论 · 三)

    文章目录 搜索与图论(三) 最小生成树 Prim算法 Kruskal算法 总结 二分图 染色法 匈牙利算法 小结 搜索与图论(三) 这一节讲解的是最小生成树和二分图 最小生成树 什么是最小生成树?首先 ...

  2. Acwing《算法基础课》第3章 搜索与图论

    Acwing<算法基础课>第3章 搜索与图论 文章目录 Acwing<算法基础课>第3章 搜索与图论 深度优先遍历DFS 宽度优先搜索BFS 拓扑排序 dijkstra算法 朴 ...

  3. AcWing基础算法课Level-2 第三讲 搜索与图论

    AcWing基础算法课Level-2 第三讲 搜索与图论 DFS AcWing 842. 排列数字3379人打卡 AcWing 843. n-皇后问题3071人打卡 BFS AcWing 844. 走 ...

  4. Acwing算法基础课学习笔记

    Acwing学习笔记 第一章 基础算法 快速排序 归并排序 二分查找 前缀和与差分 差分 位运算 离散化 第二章 数据结构 单链表 双链表 栈 队列 单调栈 单调队列 KMP算法 Trie 并查集 堆 ...

  5. AcWing算法基础课第一讲(2):高精度加减乘除、前缀和、差分

    文章目录 1. 高精度加法 2. 高精度减法 3. 高精度乘低精度 4. 高精度除以低精度 5. 一维前缀和 6. 二维前缀和 7. 一维差分 8. 二维差分 1. 高精度加法 这里讲解两个大整数的加 ...

  6. 常用代码模板3——搜索与图论(Bellman-Ford算法 、spfa 算法、floyd算法、Kruskal算法、染色法、匈牙利算法 )

    目录 一.树与图的存储 二.树与图的遍历 (1) 深度优先遍历 -- 模板题 AcWing 846. 树的重心 (2) 宽度优先遍历 -- 模板题 AcWing 847. 图中点的层次 拓扑排序 -- ...

  7. 算法提高课-图论-负环-AcWing 904. 虫洞:spfa求负环裸题

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 负环:负环是这样的一个环,该环上的边权之和是负数. 存在负环的话,会对我们求最短路造成障碍,因为绕着这个负环转无数次,最短路越来越小 ...

  8. 算法基础课 acwing

    算法基础课 本博客基于acwing算法基础课,所做笔记 目的在于方便复习 课程链接:https://www.acwing.com/activity/content/introduction/11/ 主 ...

  9. 算法与数据结构模版(AcWing算法基础课笔记,持续更新中)

    AcWing算法基础课笔记 文章目录 AcWing算法基础课笔记 第一章 基础算法 1. 排序 快速排序: 归并排序: 2. 二分 整数二分 浮点数二分 3. 高精度 高精度加法 高精度减法 高精度乘 ...

最新文章

  1. 体育场[带权并查集]
  2. Nervos CKB 共识协议 NC-Max:突破 Nakamoto Consensus 吞吐量的极限
  3. 二叉树的遍历(前,中,后)
  4. OpenEuler系统是什么
  5. 你真的知道如何在 GitHub 上高效搜索开源项目吗?
  6. python爬虫案例——python爬取百度新闻RSS数据
  7. 只让类访问, 而不让类的实例来访问某个成员变量
  8. linux 端口映射 命令,linux查看端口映射命令
  9. 学计算机打字重不重要,怎么才能有效的学好电脑打字
  10. 【MapGIS精品教程】005:MapGIS中间件的配置与使用
  11. springboot自行车在线租赁管理系统毕业设计源码101157
  12. linux 硬盘测试几种工具
  13. MCMC抽样与LDA参数求解
  14. 对几款网络抓包工具的评测
  15. 十行代码让你的单机“影分身”,分布式训练速度快到飞起
  16. world 字体 选取高亮_Word2003选取文字的N种方法
  17. android wifi p2p框架,7.2.1 P2P架构
  18. 许昌西继电梯服务器显示ZY,许昌西继西门子电梯5000故障代码
  19. opencv中mask参数
  20. 微信聊天语音怎么转发?轻松易懂,快速学会

热门文章

  1. 用几条shell命令快速去重10G数据
  2. smarty中如何统计数组的个数?
  3. 用神经网络分类过去与未来
  4. 2.Riesz定理及其应用
  5. 定时器回调函数怎么写_ESP8266_04管脚控制与软件定时器
  6. PCB 零件尺寸图:Arduino Mega 2560 尺寸
  7. 2.4 理解指数加权平均-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  8. C语言中 void* 详解及应用
  9. 面向对象八大设计原则
  10. 【PC工具】windows图片文字识别软件,天若OCR文字识别软件