Luogu P3385 【模板】负环 - 题解
【模板】负环
题目描述
给定一个 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 【模板】负环 - 题解相关推荐
- P3385 【模板】负环
https://www.luogu.com.cn/problem/P3385 这个和普通的判负环有点区别.普通的判负环是判断有没有负环即可. 这个的判负环是从1出发的负环. 故得将距离初始化为无穷,然 ...
- 模板 - 判断负环(超时高效优化技巧)、01分数规划
整理的算法模板合集: ACM模板 判断负环 判正环求最长路,判负环求最短路 int n; // 总点数 int h[N], w[N], e[N], ne[N], idx; // 邻接表存储所有边 in ...
- POJ 3259 Wormholes【最短路/SPFA判断负环模板】
农夫约翰在探索他的许多农场,发现了一些惊人的虫洞.虫洞是很奇特的,因为它是一个单向通道,可让你进入虫洞的前达到目的地!他的N(1≤N≤500)个农场被编号为1..N,之间有M(1≤M≤2500)条路径 ...
- 图论--DFS-SPFA求负环
模板:洛谷P3385 由于DFS-SPFA可以在找到负环后及时退出,所以不会像BFS-SPFA那样TLE. 代码: #include<bits/stdc++.h> using namesp ...
- 算法提高课-图论-负环-AcWing 361. 观光奶牛:spfa判正环、负环、01分数规划、二分
文章目录 题目分析 题目链接 题目分析 来源:acwing 分析: 题目要求ΣfiΣgi\frac{\Sigma{f_i}}{\Sigma{g_i}}ΣgiΣfi的最大值,这种问题称为01分数规 ...
- LightOJ - 1074 Extended Traffic(最短路+判断负环)
题目链接:点击查看 题目大意:给出n个城市,每个城市都有一个拥挤度,从a到b的时间是(b的拥挤度-a的拥挤度)^3,点1为起点,求最短时间 题目分析:这个题第一感觉是个裸题,n还非常小,偷了个懒上了一 ...
- P3288-[SCOI2014]方伯伯运椰子【0/1分数规划,负环】
正题 题目链接:https://www.luogu.com.cn/problem/P3288 题目大意 给出nnn个点mmm条边的一张图,没条边iii流量为cic_ici,费用是did_idi,然 ...
- P1768-天路【负环,SPFA,01分数规划,二分答案】
正题 题目链接:https://www.luogu.org/problemnew/show/P1768 题目大意 求一条回路使得路上∑vi∑pi\frac{\sum v_i}{\sum p_i}∑pi ...
- BZOJ3597 [Scoi2014]方伯伯运椰子 【二分 + 判负环】
题目链接 BZOJ3597 题解 orz一眼过去一点思路都没有 既然是流量网络,就要借鉴网络流的思想了 我们先处理一下那个比值,显然是一个分数规划,我们二分一个\(\lambda = \frac{X ...
最新文章
- 《数学之美》第6章 信息的度量和作用
- mysql 113_MySQL教程113-MySQL流程控制语句
- 网络协议必会知识点:互联网网络分层
- Pycharm 2018安装步骤详解
- boost::hana::embedding用法的测试程序
- 一个对象,数组去重的方法
- [vue] 说说你对vue的template编译的理解?
- 2s相机 android6,Android Camera2 使用总结
- 第4阶段——制作根文件系统之分析init_post()如何启动第1个程序(1)
- 爆料图显示iPhone 14 Pro及Max机身更厚 摄像头凸起也更多
- jquery 搜索框自动提示
- iOS学习01C语言数据类型
- SQL Server 2012内存
- 全国2009年1月电子商务与电子政务试题
- dos2unix命令解决 Shell 脚本无法执行的问题
- 使用React Native源码编译Android项目
- u-boot源码个别分析
- Golang环境配置及第三方库安装使用(至关重要的防踩坑篇)
- android 6.0 vs ios9,安卓6.0彻底看呆!iOS 9安装率曝光 完胜
- 前端js生成条形码和EAN商品码(69码)