洛谷P3385判负环——spfa
题目:https://www.luogu.org/problemnew/show/P3385
两种方法,dfs和bfs;
一开始写的dfs,要把dis数组初值赋成0,这样从一个连着负边的点开始搜;
在一个负环上,一定会有一个点,从它开始绕环走,dis值一直为负,根据这个找环;
但是数据太强了,过不了:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int const MAXN=,MAXM=;
int T,n,m,head[MAXN],ct,dis[MAXN];
bool vis[MAXN],f;
struct N{
int to,next,w;
N(int t=,int n=,int w=):to(t),next(n),w(w) {}
}edge[MAXM];
void add(int x,int y,int z)
{
edge[++ct]=N(y,head[x],z);head[x]=ct;
}
int rd()
{
int x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return x*f;
}
void dfs(int x)
{
if(f)return;
vis[x]=;
for(int i=head[x],u;i;i=edge[i].next)
{
u=edge[i].to;
if(f)return;
if(dis[u]>dis[x]+edge[i].w)
{
// printf("x=%d u=%d vis[u]=%d\n",x,u,vis[u]);
if(vis[u])
{
f=;return;
}
dis[u]=dis[x]+edge[i].w;
dfs(u);
if(f)return;
}
}
vis[x]=;//!
}
int main()
{
T=rd();
while(T--)
{
n=rd();m=rd();
ct=;f=;
memset(head,,sizeof head);
for(int i=,x,y,z;i<=m;i++)
{
x=rd();y=rd();z=rd();
add(x,y,z);
if(z>=)add(y,x,z);
}
memset(vis,,sizeof vis);
memset(dis,,sizeof dis);
for(int i=;i<=n;i++)
{
dfs(i);
if(f)break;
}
if(f)printf("YE5\n");
else printf("N0\n");
}
return ;
}
dfs
于是用bfs,根据最短路边数来判断,若边数>=n则有负环;
bfs的话还有一种判断方式,是根据被松弛次数,若>=n则有负环,但不如上面那个优;
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
//queue<int>q;
int const MAXN=,MAXM=,inf=;
int T,n,m,head[MAXN],ct,dis[MAXN],cnt[MAXN],que[MAXN],h,t;
bool vis[MAXN];
struct N{
int to,next,w;
N(int t=,int n=,int w=):to(t),next(n),w(w) {}
}edge[MAXM];
inline void add(int x,int y,int z){edge[++ct]=N(y,head[x],z);head[x]=ct;}
inline int rd()
{
int x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
return x*f;
}
inline bool spfa()
{
// while(q.size())q.pop();
memset(que,,sizeof que);h=;t=;
memset(dis,0x3f,sizeof dis);
memset(cnt,,sizeof cnt);
memset(vis,,sizeof vis);
// q.push(1);
vis[]=;dis[]=;que[t]=;
// while(q.size())
while(h!=t+)
{
// int x=q.top();vis[x]=0;q.pop();
int x=que[h++];vis[x]=;
if(h==inf)h=;
for(int i=head[x],u;i;i=edge[i].next)
if(dis[u=edge[i].to]>dis[x]+edge[i].w)
{
cnt[u]=cnt[x]+;
if(cnt[u]>=n)return ;
dis[u]=dis[x]+edge[i].w;
// if(!vis[u])vis[u]=1,q.push(u);
if(!vis[u])
{
vis[u]=;
t++;
if(t==inf)t=;
que[t]=u;
}
}
}
return ;
}
int main()
{
T=rd();
while(T--)
{
n=rd();m=rd();
ct=;
memset(head,,sizeof head);
for(int i=,x,y,z;i<=m;i++)
{
x=rd();y=rd();z=rd();
add(x,y,z);
if(z>=)add(y,x,z);
}
if(spfa())printf("YE5\n");
else printf("N0\n");
}
return ;
}
洛谷P3385判负环——spfa的更多相关文章
- 洛谷P3385 [模板]负环 [SPFA]
题目传送门 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个 ...
- 负环--spfa
洛谷板子题 负环?是有负权边的环还是一个边权之和为负的环? 还没有准确的定义(那就先忽略吧qwq 判断负环的方法: 暴力枚举/spfa/mellman—ford/奇怪的贪心/超神的搜索 可惜我只会sp ...
- 洛谷P3385 【模板】负环(DFS求环)
洛谷题目传送门 HNOI爆零前回刷模板题 非常不正经的题目,目前并没有合适的优秀算法,就算是大家公认的dfs(还是不要强行叫dfs-spfa吧,概念应该不一样,这就是暴力dfs松弛答案) 但是对于随机 ...
- 洛谷 P3385 【模板】负环 题解
P3385 [模板]负环 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 寻找一个从顶点1所能到达的负环,负环定义为:一个边权之和为负的环. 输入格式 第一行一个正整数T ...
- 洛谷—— P3385 【模板】负环
题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个顶点,M条边 ...
- 洛谷p3385【模板】负环
最近很久没怎么写最短路的题导致这个题交了好多遍 AC率是怎么下来的自己心里没点数 SPFA虽然臭名昭著但是他可以用来判负环 如果一个点进队的次数大于等于n说明存在负环 这道题一开始memset我给di ...
- 浅谈SPFA判负环
目录 SPFA判负环 [前言] [不可代替性] [具体实现] SPFA的过程 判负环 [核心代码] [例题] SPFA判负环 有不足的地方请指出 本蒟蒻一定会修改吼 [前言] 最短路的求法中最广为人知 ...
- BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)
BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多少权值, ...
- 【原创】SPFA判负环
[定义与概念] 给定一张有向图,若其中存在一个环的所有权值之和为负数,这个环称为负环. [算法实现] 当然,负环的求解可以暴搜,但是时间复杂度就难以入眼了,我们回到求解单源最短路径算法上面,看看它们能 ...
随机推荐
- 百科知识 kux文件如何打开
即使是官方自带的浏览器也无法打开 你可以直接复制文件名 然后在百度里搜即可 你自己下载的东西还是能转码的
- LattePanda 之深入学习 Firmata通讯
前言 原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正. 本文使用Markdown写成,为获得更好的阅读体验和正常的链接.图片显示,请访问我的博客原文: http://www.cnblog ...
- C 标准库 - <signal.h>
C 标准库 - <signal.h> 简介 signal.h 头文件定义了一个变量类型 sig_atomic_t.两个函数调用和一些宏来处理程序执行期间报告的不同信号. 库变量 下面是头文 ...
- OpenJDK 源码阅读之 LinkedList
概要 类继承关系 java.lang.Object java.util.AbstractCollection<E> java.util.AbstractList<E> java ...
- 【课程笔记】比特币和数字货币技术[Bitcoin and Cryptocurrency Technologies] week1
源地址(可能要FQ):https://www.coursera.org/learn/cryptocurrency/home/welcome 1.1 Cryptographic Hash Functio ...
- caffe搭建--caffe- win10 vs2015 编译(支持GPU)--注意在cmake的时候需要根据情况仔细修改配置
--http://blog.csdn.net/longji/article/details/60964998 注意: 在cmake的时候需要根据情况仔细修改配置,比如,如果gpu的能力不足3.0的话, ...
- 关于erlang中的timer:tc/3
timer:tc/3对于统计函数运行时间是个很不错的函数, 截图timer:tc/1,tc/2,tc/3的API: 拿斐波那契数列入手做个讲解: -module(fib). -export([fib/ ...
- 2016/07/07 PHP的线程安全与非线程安全版本的区别
Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍. ...
- 2809: [Apio2012]dispatching
2809: [Apio2012]dispatching Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3102 Solved: 1641 [Sub ...
- Sping中Bean配置的深入探讨
一.p命名空间的使用 Spring 从 2.5 版本开始引入了一个新的 p 命名空间,可以通过 <bean> 元素属性的方式配置 Bean 的属性.使用 p 命名空间后,基于 XML 的配 ...