【模板】负环

题目描述

给定一个 nnn 个点的有向图,请求出图中是否存在从顶点 111 出发能到达的负环。

负环的定义是:一条边权之和为负数的回路。

输入格式

本题单测试点有多组测试数据

输入的第一行是一个整数 TTT,表示测试数据的组数。对于每组数据的格式如下:

第一行有两个整数,分别表示图的点数 nnn 和接下来给出边信息的条数 mmm。

接下来 mmm 行,每行三个整数 u,v,wu, v, wu,v,w。

  • 若 w≥0w \geq 0w≥0,则表示存在一条从 uuu 至 vvv 边权为 www 的边,还存在一条从 vvv 至 uuu 边权为 www 的边。
  • 若 w<0w < 0w<0,则只表示存在一条从 uuu 至 vvv 边权为 www 的边。

输出格式

对于每组数据,输出一行一个字符串,若所求负环存在,则输出 YES,否则输出 NO

样例 #1

样例输入 #1

2
3 4
1 2 2
1 3 4
2 3 1
3 1 -3
3 3
1 2 3
2 3 4
3 1 -8

样例输出 #1

NO
YES

提示

数据规模与约定

对于全部的测试点,保证:

  • 1≤n≤2×1031 \leq n \leq 2 \times 10^31≤n≤2×103,1≤m≤3×1031 \leq m \leq 3 \times 10^31≤m≤3×103。
  • 1≤u,v≤n1 \leq u, v \leq n1≤u,v≤n,−104≤w≤104-10^4 \leq w \leq 10^4−104≤w≤104。
  • 1≤T≤101 \leq T \leq 101≤T≤10。

提示

请注意,mmm 不是图的边数。

题解

题意

传送门:link

给你 TTT 个图,每个图有 nnn 个点和 mmm 条由 uuu 到 vvv 边权为 www 的边。

现给你这 mmm 条边,求图中是否有负环。

做法

算法分析

根据题的大意我们可以看出,这是一道单源最短路的题目。

单源最短路算法有 dij 和 SPFA,那这道题应该用哪道算法呢?

我们看一下数据范围:

  • 1≤n≤2×1031 \leq n \leq 2 \times 10^31≤n≤2×103,1≤m≤3×1031 \leq m \leq 3 \times 10^31≤m≤3×103。

  • 1≤u,v≤n1 \leq u, v \leq n1≤u,v≤n,−104≤w≤104-10^4 \leq w \leq 10^4−104≤w≤104。

  • 1≤T≤101 \leq T \leq 101≤T≤10。

很明显会有负环,这时 dij 就行不通了,我们就需要用 SPFA 了。

算法讲解

SPFA 为能够有效判断负环的一种单源最短路算法,但其算法复杂度比不上 dij,在存在菊花图的情况下,很容易原地爆炸。

但由于能够判断负环的性质,才使得它在同类最短路算法中没有被淘汰(可应用于 Johnson 全源最短路算法中),其主要思想为贪心

SPFA 的独特性质在于他的一个点能够不止一次进队,这个特点有利也有弊,

利在于它可以通过入队次数来判断负环;

弊在于它容易被卡(关于SPFA,他死了)。

但在此题中它能完美胜任 dij(他不能判负环)。

算法实现

答题思路很简单,先链式前向星存图,再用 SPFA 遍历即可,所以问题在于 SPFA 的整体框架。

收我们需要一个队列,先把 111 号点存进去,再遍历到与 111 号点所连接着的点,依次松弛、入队,如果一个点入队次数大于等于 nnn 就直接输出 YES 接着 return;如果队列为空了,但依旧没有输出 YES 就输出 NO

Code

源代码 - C++

//注释极少版
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>using namespace std;
int t,cnt;
int dis[10001],v[10001];
int head[10001],tim[10001];struct Node{int to,next,dis;
}edge[100001];void add(int t1,int t2,int t3) {//存图cnt++;edge[cnt].to=t2;edge[cnt].dis=t3;edge[cnt].next=head[t1];head[t1]=cnt;
}void SPFA_dui(int n) {queue<int> q;memset(dis,0x3f,sizeof(dis));memset(v,0,sizeof(v));memset(tim,0,sizeof(tim));//初始化dis[1]=0;v[1]=1;q.push(1);//加入 1while (!q.empty()) {int x=q.front();q.pop();v[x]=0;for (int i=head[x];i;i=edge[i].next) {//链式前向星遍历int y=edge[i].to;if (dis[y]>dis[x]+edge[i].dis) {//relaxdis[y]=dis[x]+edge[i].dis;tim[y]=tim[x]+1;if (tim[y]>=n) {//有负环cout<<"YES"<<endl;return;}if (!v[y]) {//入队v[y]=1;q.push(y);}}}}cout<<"NO"<<endl;}int main() {scanf("%d",&t);for (int i=1;i<=t;i++) {memset(head,0,sizeof(head));//有多组数据,记得清空int n,m;scanf("%d%d",&n,&m);for (int j=1;j<=m;j++) {int t1,t2,t3;cin>>t1>>t2>>t3;add(t1,t2,t3);if (t3>=0) {add(t2,t1,t3);}}SPFA_dui(n);cnt=0;}
}

广告\Huge{\bold{广告}}广告

绿树公司官方博客\Huge{\bold{绿树公司官方博客}}绿树公司官方博客

lvshu.wss.cc\Huge{\bold{lvshu.wss.cc}}lvshu.wss.cc

Luogu P3385 【模板】负环 - 题解相关推荐

  1. P3385 【模板】负环

    https://www.luogu.com.cn/problem/P3385 这个和普通的判负环有点区别.普通的判负环是判断有没有负环即可. 这个的判负环是从1出发的负环. 故得将距离初始化为无穷,然 ...

  2. 模板 - 判断负环(超时高效优化技巧)、01分数规划

    整理的算法模板合集: ACM模板 判断负环 判正环求最长路,判负环求最短路 int n; // 总点数 int h[N], w[N], e[N], ne[N], idx; // 邻接表存储所有边 in ...

  3. POJ 3259 Wormholes【最短路/SPFA判断负环模板】

    农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500)条路径 ...

  4. 图论--DFS-SPFA求负环

    模板:洛谷P3385 由于DFS-SPFA可以在找到负环后及时退出,所以不会像BFS-SPFA那样TLE. 代码: #include<bits/stdc++.h> using namesp ...

  5. 算法提高课-图论-负环-AcWing 361. 观光奶牛:spfa判正环、负环、01分数规划、二分

    文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 题目要求ΣfiΣgi\frac{\Sigma{f_i}}{\Sigma{g_i}}Σgi​Σfi​​的最大值,这种问题称为01分数规 ...

  6. LightOJ - 1074 Extended Traffic(最短路+判断负环)

    题目链接:点击查看 题目大意:给出n个城市,每个城市都有一个拥挤度,从a到b的时间是(b的拥挤度-a的拥挤度)^3,点1为起点,求最短时间 题目分析:这个题第一感觉是个裸题,n还非常小,偷了个懒上了一 ...

  7. P3288-[SCOI2014]方伯伯运椰子【0/1分数规划,负环】

    正题 题目链接:https://www.luogu.com.cn/problem/P3288 题目大意 给出nnn个点mmm条边的一张图,没条边iii流量为cic_ici​,费用是did_idi​,然 ...

  8. P1768-天路【负环,SPFA,01分数规划,二分答案】

    正题 题目链接:https://www.luogu.org/problemnew/show/P1768 题目大意 求一条回路使得路上∑vi∑pi\frac{\sum v_i}{\sum p_i}∑pi ...

  9. BZOJ3597 [Scoi2014]方伯伯运椰子 【二分 + 判负环】

    题目链接 BZOJ3597 题解 orz一眼过去一点思路都没有 既然是流量网络,就要借鉴网络流的思想了 我们先处理一下那个比值,显然是一个分数规划,我们二分一个\(\lambda = \frac{X ...

最新文章

  1. 《数学之美》第6章 信息的度量和作用
  2. mysql 113_MySQL教程113-MySQL流程控制语句
  3. 网络协议必会知识点:互联网网络分层
  4. Pycharm 2018安装步骤详解
  5. boost::hana::embedding用法的测试程序
  6. 一个对象,数组去重的方法
  7. [vue] 说说你对vue的template编译的理解?
  8. 2s相机 android6,Android Camera2 使用总结
  9. 第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)
  10. 爆料图显示iPhone 14 Pro及Max机身更厚 摄像头凸起也更多
  11. jquery 搜索框自动提示
  12. iOS学习01C语言数据类型
  13. SQL Server 2012内存
  14. 全国2009年1月电子商务与电子政务试题
  15. dos2unix命令解决 Shell 脚本无法执行的问题
  16. 使用React Native源码编译Android项目
  17. u-boot源码个别分析
  18. Golang环境配置及第三方库安装使用(至关重要的防踩坑篇)
  19. android 6.0 vs ios9,安卓6.0彻底看呆!iOS 9安装率曝光 完胜
  20. 前端js生成条形码和EAN商品码(69码)

热门文章

  1. 趣图:菜鸟多线程 vs 老鸟多线程
  2. 视频分析与多模态融合之一,为什么需要多模态融合
  3. 【HTML】网页错误码详细报错
  4. 给代码写注释时有哪些讲究?
  5. 如何以信创软硬件来实现隐私计算的大规模产业化,听听冲量怎么说
  6. C++ 基础概念(二)
  7. 百度地图查询周围建筑
  8. mac办公软件里值得推荐给大家的好软件
  9. 邵阳市计算机学校某灿,最近喜欢上一首歌。。 大家把自己觉得好听的歌和我分享分享吧。...
  10. 2020iPadAir(第四代)对比iPadPro(第二代)