首页 > 其他分享 >SPAF(虽然已经死了)判断负环—(大学复健第二篇)

SPAF(虽然已经死了)判断负环—(大学复健第二篇)

时间:2023-03-09 15:24:12浏览次数:48  
标签:复健 false int memset SPAF 负环 sizeof dis

SPAF判断负环存在其实就是bellman-fold的优化,加了一个队列来判断是否需要松弛操作。而判断负环上其实由于如果存在那么一定会有边被多次访问,而一定有负环的时候,访问数一定会超过n。于是我们可以得到一个简单的判断负环的算法。(猜猜看是哪个蠢蛋居然写不出来,错了十多遍o(╥﹏╥)o)

洛谷的判断负环

由于官方一直在更新数据,以前的代码居然被卡了一个数据点

#include <bits/stdc++.h>
using namespace std;

int T;
struct edge{
	int to,nex;
	int val;
}e[9009];int tot;
long long dis[4009];
bool vis[4009];
int cnt[4009];
int first[4009];
queue<long long>q;
inline int kd(){
	int x=0,f=1;char ch=getchar();
	while(isdigit(ch)==false){if(ch=='-')f=-1;ch=getchar();}
	while(isdigit(ch)==true){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}

void add_edge(int a,int b,int c){
	e[++tot].to=b;
	e[tot].val=c;
	e[tot].nex=first[a];
	first[a]=tot;
}

int main(){
	cin>>T;
	while(T--){
		tot=0;
		int n=kd(),m=kd();
		memset(first,0,sizeof(first));
		memset(e,0,sizeof(e));
		for(int i=1;i<=m;i++){
			int a=kd(),b=kd(),c=kd();
			if(c>=0)add_edge(b,a,c);
			add_edge(a,b,c);
		}
		memset(dis,0x3f3f3f3f,sizeof(dis));
		memset(cnt,0,sizeof(cnt));
		memset(vis,0,sizeof(vis));
		
		q.push(1);
		vis[1]=true;
		cnt[1]++;
		dis[1]=0;
		int pan=false;
		while(q.empty()==false){	
			int now=q.front();
			q.pop();
			vis[now]=false;
			for(int i=first[now];i;i=e[i].nex){
				int to=e[i].to;
				if(dis[now]+e[i].val<dis[to]){
					dis[to]=dis[now]+e[i].val;
					cnt[to]=cnt[now]+1;
					if(vis[e[i].to]==false){
						q.push(to);
						vis[to]=true;
					}
					if(cnt[to]>n){
						puts("YES");
						pan=true;
						break;
					}
				}
			}
			if(pan==true)break;
		}
		if(pan==false)puts("NO");
		while(q.empty()==false)q.pop();
	}
} 

标签:复健,false,int,memset,SPAF,负环,sizeof,dis
From: https://www.cnblogs.com/1129-tangqiyuan/p/17198513.html

相关文章

  • 网络流复健
    好长时间不做网络瘤了,啥也不会,于是复健了下。导致现在我看到网络瘤就恶心。大部分都是题,还有一小部分也是题。在这里放个歌词罢。\(\textbf{Borninthemonthofda......
  • 判负环
     看某个点的入队次数times>=n#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+2,inf=0x7f7f3f;structE{ inty,z; E(inty0,intz0){......
  • 关于汉诺塔问题一些体会(大学复健的第一篇随笔)
    递归条件相同结构的子问题————考察子问题与当前问题的关系存在可以单独计算基础结构所以我们考察第一个条件,汉诺塔的移动方式第一步将所有上层移动到一......
  • C++复健:运算符重载,实现string容器,实现string和vector的迭代器
    使得对象的运算像内置类型一样a.operator+(b);重载运算符的一些注意点:不能重载运算符操作基础数据类型:(1)重载运算符必须和用户定义的class类型一起使用(2)重载的运算符......
  • Unix\Linux多线程复健(二)线程同步
    线程同步并非让线程并行,而是有先后的顺序执行,当有一个线程对内存操作时,其他线程不可以对这个内存地址操作线程之间的分工合作线程的优势之一:能够通过全局变量共享信息......
  • Unix\Linux多线程复健
    线程是程序中完成一个独立任务的完整执行序列(是一个可调度的实体)一个进程可以包含多个线程查看指定进程的线程号:ps-Lfpid进程是CPU分配资源的最小单位,线程是操作系......
  • git使用(复健 1 )
    #```shell#ubuntu:sudoapt-getinstallgit```###winodwshttps://git-scm.com/downloads设置用户名和邮箱:```bash$gitconfig--globaluser.name"YourName"$g......
  • CF757G Can Bash Save the Day? (复健 Day 1)
    先差分为\(Q(r)-Q(l-1)\),\(Q(i)=\sum_{j=1}^{i}\operatorname{dis}(p_j,x)\)。树上在线路径优先考虑点分树,先想询问怎么做,我们记\(f_i\)为点分树上\(i\)点子树内所......
  • 【Java复健指南14】异常处理
    【异常处理】Java语言中,将程序执行中发生的不正常情况称为“异常”(开发过程中的语法错误和逻辑错误不是异常)分类执行过程中所发生的异常事件可分为两大类:1)Error(错......
  • SAM复健
    关于其原理和构造啥的先不说,理解性默写就行。对着题单开始乱水。P2408不同子串个数需要知道关于SAM的性质是,相同的子串会被去重。所以只需要知道SAM上不同路径的数......