<题解>洛谷P3385 【模板】负环
判断一张图中是否存在关于顶点1的负环:

可以用SPFA跑一遍,存在负环的情况就是点进队大于n次
因为在存在负环的情况下,SPFA会越跑越小,跑进死循环
在最差的情况下,存在的负环长度是“n+1个顶点”这么长
rt:

显然这是n个点长度,但不是环;

这就是一个环,n+1个点的长度;
所以代码很明了了,只需将一般SPFA改动一点饥渴
CODE:
#include<bits/stdc++.h>万能头,懒得打很多头文件
using namespace std;
//数据是骗人的,要开大..
const int maxn=;
//基本的变量或者数组都是:
queue<int > q;
bool visited[maxn];
int head[maxn],cnt,js[maxn],dis[maxn];
struct ppap {
int next,to,dis;
} edge[maxn];
int t,n,m;
//快读部分
int read() {
bool f=;
char ch;
int x=;
ch=getchar();
while(ch>''||ch<'') {
if(ch=='-')
f=!f;
ch=getchar();
}
while(ch<=''&&ch>='') {
x=x*+ch-'';
ch=getchar();
}
return !f?x:-x;
}
//链式前向星添边
void add(int from,int to,int dis) {
edge[++cnt].next=head[from];
head[from]=cnt;
edge[cnt].to=to;
edge[cnt].dis=dis;
}
//和常见spfa一样,在其中判断条件即可
bool SPFA() {
q.push();
visited[]=;
dis[]=;
js[]=;
while(!q.empty()) {
int u=q.front();
q.pop();
visited[u]=;
for(int i=head[u]; i; i=edge[i].next) {
int v=edge[i].to;
if(dis[v]>dis[u]+edge[i].dis) {
dis[v]=dis[u]+edge[i].dis;
if(visited[v]==) {
js[v]=js[u]+;
if(js[v]>n) return true;
visited[v]=;
q.push(v);
}
}
}
}
return false;
} int main() {
t=read();
while(t--) {
n=read(),m=read();
memset(head,,sizeof head);
memset(js,,sizeof js);
memset(edge,,sizeof edge);
memset(dis,0x3f,sizeof dis);
memset(visited,,sizeof visited);
//初始化
for(int i=,a,b,w; i<=m; i++) {
a=read(),b=read(),w=read();
add(a,b,w);
if(w>=)
add(b,a,w);
}
if(SPFA()) cout<<"YE5"<<"\n";
else cout<<"N0"<<"\n";
}
return ;//平淡的结束
}
<题解>洛谷P3385 【模板】负环的更多相关文章
- 洛谷P3385 [模板]负环 [SPFA]
题目传送门 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个 ...
- 洛谷P3385判负环——spfa
题目:https://www.luogu.org/problemnew/show/P3385 两种方法,dfs和bfs: 一开始写的dfs,要把dis数组初值赋成0,这样从一个连着负边的点开始搜: 在 ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷P3385 【模板】负环(DFS求环)
洛谷题目传送门 HNOI爆零前回刷模板题 非常不正经的题目,目前并没有合适的优秀算法,就算是大家公认的dfs(还是不要强行叫dfs-spfa吧,概念应该不一样,这就是暴力dfs松弛答案) 但是对于随机 ...
- 洛谷 P3385 【模板】负环
P3385 [模板]负环 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M ...
- 洛谷 P3385 【模板】负环 题解
P3385 [模板]负环 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 寻找一个从顶点1所能到达的负环,负环定义为:一个边权之和为负的环. 输入格式 第一行一个正整数T ...
- 洛谷—— P3385 【模板】负环
题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个顶点,M条边 ...
- 题解【洛谷P3385】【模板】负环
题目描述 暴力枚举/\(SPFA\)/\(Bellman-ford\)/奇怪的贪心/超神搜索 寻找一个从顶点1所能到达的负环,负环定义为:一个边权之和为负的环. 输入输出格式 输入格式 第一行一个正整 ...
- 【模板】负环(SPFA/Bellman-Ford)/洛谷P3385
题目链接 https://www.luogu.com.cn/problem/P3385 题目大意 给定一个 \(n\) 个点有向点权图,求是否存在从 \(1\) 点出发能到达的负环. 题目解析 \(S ...
- 【洛谷P3385】模板-负环
这道题普通的bfs spfa或者ballen ford会T 所以我们使用dfs spfa 原因在于,bfs sfpa中每个节点的入队次数不定,退出操作不及时,而dfs则不会 既然,我们需要找负环,那么 ...
随机推荐
- DiscuzX2.5密码错误次数过多,请 15 分钟后重新登录的修改办法
source\function function_login.php $return = (!$login || (TIMESTAMP - $login['lastupdate'] > )) ? ...
- Sonar静态代码扫描环境搭建(Windows10)
一.环境配置: 1.jdk安装及配置 2.MySQL数据库安装----直接调用服务器院端的MySQL数据库,在此基础上创建新的数据库sonar. 数据库的配置如下: 3.sonar官网下载sonar ...
- 小程序 显示Toobar
要实现的效果 在 下面app.json 中加下列代码 "tabBar": { "color": "#7A7E83", "se ...
- 连接sql server、插入数据、从数据库获取时间(C#)
using System; using System.Data.SqlClient; namespace Test { //连接数据库 public class Connection { privat ...
- 初探ant design pro
1.增加路由子页面&配置菜单 因为ant design pro采取的是umi路由配置,所以只要在对应的文件夹下新建相关的文件夹以及文件,它会自动解析.按照如下的步骤做即可 PS.如果想要给菜单 ...
- css选择器(基础)
CSS选择器: 一个样式的语法是由选择器+属性+属性值三部分组成: 到底什么是选择器呢? 答:个人直白的理解为:选择一种要对它进行操作的标签的方法就叫做选择器.也就是说选择器就是一种选择元素的 ...
- Handler消息机制的一些原理(直接用code讲解)——Android开发
package com.example.handlertest; import android.os.Bundle; import android.os.Handler; import android ...
- 转:android 屏幕适配小结
做android开发,开源嘛,满市场都是凌乱的机型,总少不了适配这样或那样的型号.在这里分享一下自己在开发中用到的方法. 首先要介绍一下drawable-mdpi.drawable-hdpi-1280 ...
- 线程池 Threadlocal 使用注意
线程池中的线程是重复使用的,即一次使用完后,会被重新放回线程池,可被重新分配使用. 因此,ThreadLocal线程变量,如果保存的信息只是针对一次请求的,放回线程池之前需要清空这些Threadloc ...
- POJ 1998 Cube Stacking
Description Farmer John and Betsy are playing a game with N (1 <= N <= 30,000)identical cubes ...