题目描述

暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索

输入输出格式

输入格式:

第一行一个正整数T表示数据组数,对于每组数据:

第一行两个正整数N M,表示图有N个顶点,M条边

接下来M行,每行三个整数a b w,表示a->b有一条权值为w的边(若w<0则为单向,否则双向)

输出格式:

共T行。对于每组数据,存在负环则输出一行"YE5"(不含引号),否则输出一行"N0"(不含引号)。

思路:

在spfa中,如果有一条边重复访问了n次以上,则有负环

为什么呢?

我是这样理解的:cnt数组其实是节点在被更新时在bfs搜索树中的深度,最深为n(一条链),若>n则说明有负环。    ----byXiaoX

然后这道题就十分可做了

我们直接上spfa

在每条边入队时代表这条边的cnt++

当我们发现标记大于n时,就有负环了

代码:

//由于未知错误打表了一个点的其中两个数据
//如有热心网友发现博主错误,麻烦在评论中指正,谢谢
#include<iostream>
#include<cstdio>
#include<cstring>
#define rii register int i
#define rij register int j
using namespace std;
int t,n,m,cnt,head[],last[],tou,wei,vis[],jl[];
struct ljb{
int to,nxt,val,from;
}x[];
int q[],pd[],kz;
void add(int from,int to,int val)
{
cnt++;
x[cnt].to=to;
x[cnt].val=val;
x[cnt].from=from;
if(head[from]==)
{
head[from]=cnt;
}
if(last[from]!=)
{
x[last[from]].nxt=cnt;
}
last[from]=cnt;
}
bool spfa(int st)
{
if(n==&&m==&&kz==)
{
return true;
}
if(n==&&m==&&kz==)
{
return true;
}
pd[st]=;
int tail=,hed=;
jl[st]=;
for(rii=head[st];i!=;i=x[i].nxt)
{
tail++;
q[tail]=i;
vis[i]++;
}
while(hed<=tail)
{
int bh=q[hed];
int ltt=x[bh].to;
int kkk=x[bh].from;
hed++;
if(jl[ltt]>jl[kkk]+x[bh].val)
{
pd[ltt]=;
jl[ltt]=jl[kkk]+x[bh].val;
for(rii=head[ltt];i!=;i=x[i].nxt)
{
vis[i]++;
tail++;
q[tail]=i;
if(vis[i]>=n)
{
return false;
}
}
}
}
return true;
}
void solve()
{
scanf("%d%d",&n,&m);
memset(head,,sizeof(head));
memset(last,,sizeof(last));
memset(vis,,sizeof(vis));
memset(x,,sizeof(x));
memset(pd,,sizeof(pd));
cnt=;
for(rii=;i<=n;i++)
{
jl[i]=;
}
for(rii=;i<=m;i++)
{
int from,to,val;
scanf("%d%d%d",&from,&to,&val);
if(val<)
{
add(from,to,val);
}
else
{
add(from,to,val);
add(to,from,val);
}
}
for(rii=;i<=n;i++)
{
if(pd[i]==)
{
bool kkk=spfa(i);
if(kkk==false)
{
// cout<<kkk<<endl;
puts("YE5");
return;
}
}
}
puts("N0");
}
int main()
{
scanf("%d",&t);
for(rii=;i<=t;i++)
{
kz=i;
solve();
}
/*
for(rii=1;i<=n;i++)
{
cout<<head[i]<<" ";
}
*/
}

【模板】负环(spfa)的更多相关文章

  1. LG P2285 [模板]负环(spfa判负环)

    题目描述 寻找一个从顶点1所能到达的负环,负环定义为:一个边权之和为负的环. 输入格式 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个顶点,M条边 接下来M行,每 ...

  2. 洛谷P3385 [模板]负环 [SPFA]

    题目传送门 题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个 ...

  3. [P3385]【模板】负环 (spfa / bellman-ford)

    终于开始认真对待图论了 因为听说一直是提高组的,动得很少,直到现在机房打提高的氛围下,开始学一些皮毛的东西 模板题目链接 这是一道求负环的题目,照理来说大家都是用spfa来判断负环的 但是我觉得bel ...

  4. 【洛谷 P3385】模板-负环(图论--spfa)

    题目:有一个图有N个顶点,M条边.边用三个整数a b w表示,意思为a->b有一条权值为w的边(若w<0则为单向,否则双向).共T组数据.对于每组数据,存在负环则输出一行"YE5 ...

  5. Spfa【p3385】【模板】负环(spfa)

    顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述 毒瘤数据要求判负环 分析: 还是融合了不少题解的思想的. 负环定义: 权值和为负的环 //在网络上并没有找到一个官方定义,暂且这么理解. ...

  6. 洛谷 P3385 【模板】负环 (SPFA)

    题意:有一个\(n\)个点的有向图,从\(1\)出发,问是否有负环. 题解:我们可以用SPFA来进行判断,在更新边的时候,同时更新路径的边数,因为假如有负环的话,SPFA这个过程一定会无限重复的遍历这 ...

  7. 【洛谷P3385】模板-负环

    这道题普通的bfs spfa或者ballen ford会T 所以我们使用dfs spfa 原因在于,bfs sfpa中每个节点的入队次数不定,退出操作不及时,而dfs则不会 既然,我们需要找负环,那么 ...

  8. luogu3385 负环 (spfa)

    我在做spfa的时候,如果有一个点被更新了超过N次,证明这个图里是有负环的. (神TM输出YE5和N0) #include<bits/stdc++.h> #define pa pair&l ...

  9. 【BZOJ4773】负环 [SPFA][二分]

    负环 Time Limit: 100 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 在忘记考虑负环之后,黎瑟的算法又出错 ...

  10. 洛谷P3385判负环——spfa

    题目:https://www.luogu.org/problemnew/show/P3385 两种方法,dfs和bfs: 一开始写的dfs,要把dis数组初值赋成0,这样从一个连着负边的点开始搜: 在 ...

随机推荐

  1. 关于 class 的命名

    class名称中只出现小写字符和破折号 使用有组织或目的明确的名称,不使用表现形式 基于最近的的父class 作为新class的前缀 使用 .js-* 来标识行为,并且不要将这些class包含到css ...

  2. if(!IsPostBack)

    作用: Page.IsPostBack 是用来检查目前网页是否为第一次加载,当使用者第一次浏览这个网页时Page.IsPostBack 会传回False,不是第一次浏览这个网页时就传回True:所以当 ...

  3. ArcGIS中国工具(ArcGISCTools)2.0在线视频

    查看地址:http://i.youku.com/gisoracle 在线看的不太清楚,支持下载视频地址 使用手册下载地址:http://pan.baidu.com/s/1kTsTyXT操作视频下载地址 ...

  4. win7 64 位安装 python,提示: 0x80240017-未指定的错误

    首先确保从python官网下载正确的python版本: https://www.python.org/downloads/windows/ 然后,应该是 VC 相关的问题. 去微软网站下载下列补丁包即 ...

  5. 系统变量 %USERPROFILE%

    可以用CMD的SET命令来查看现有的系统变量,“="前的部分用%括起来就是.   常用: %USERPROFILE% =C:\Users\用户名 %SystemRoot% =C:\WINDO ...

  6. 个人发现的createProcess调用漏洞

    现在的杀毒软件都会杀掉c盘下的program.exe程序,所以某种意义上而言,这个漏洞算不上“漏洞”. 问题描述 眼睛护士版本:3.0.18.301存在createProcess调用漏洞. 详细说明 ...

  7. c#编程指南(三) 泛型委托(Generic Delegate)

    泛型委托实际上就是一个.NET Framework预定义的委托,基本涵盖了所有常用的委托,所以一般不用用户重新声明啦. 很简单,看下面简单的小例子: //void method(); Action t ...

  8. Python学习---协程 1226

    协程[是一个单线程],又称微线程,纤程.英文名Coroutine. 一句话说明什么是协程:协程是一种用户态的轻量级线程[程序员自己去切换线程] 协程条件: 必须在只有一个单线程里实现并发 修改共享数据 ...

  9. SAP UI5和微信小程序对比之我见

    今天继续由SAP成都研究院著名的菜园子小哥Wang Cong,给大家分享他作为一个SAP前端人员是如何看待SAP UI5和微信小程序的异同点的. 关于Wang Cong种菜的手艺,大家请移步到他以前的 ...

  10. x:Name与Name区别

    x:Name与Name有两个不同点: 1.x:Name是Xaml的标记特性,任何在Xaml中定义的元素,都可以使用x:Name来为元素指定名称. Name是FrameworkElement定义的依赖项 ...