自己搓的O(m)求负环算法求Hack
  • 板块学术版
  • 楼主ICU152_lowa_IS8
  • 当前回复8
  • 已保存回复8
  • 发布时间2023/10/27 19:38
  • 上次更新2023/10/27 20:01:17
查看原帖
自己搓的O(m)求负环算法求Hack
933802
ICU152_lowa_IS8楼主2023/10/27 19:38

在模板中拿到了50分,错误全部为应输出NO输出了YES

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int tmp[100005];
struct node{
	int v,w,next;
}edge[200005];
bool fl;
int head[100005],num,vis[200005];
void add(int u,int v,int w){
	edge[++num].next=head[u];
	head[u]=num;
	edge[num].v=v;
	edge[num].w=w;
}
void dfs(int ntmp,int id){
	if(fl)return;
	if(ntmp-tmp[id]<0){
		fl=1;
		return;
	}
	tmp[id]=ntmp;
	for(int i=head[id];i;i=edge[i].next){
		if(vis[i])continue;
		vis[i]=true;
		dfs(ntmp+edge[i].w,edge[i].v);
	}
//	tmp[id]=f;
}
signed main(){
//	freopen("test.out","w",stdout);
	int t;
	cin>>t;
	while(t--){
		fl=0;
		memset(tmp,0xaf,sizeof(tmp));
		memset(head,0,sizeof(head));
		memset(vis,false,sizeof(vis));
		num=0;
		cin>>n>>m;
		for(int i=1;i<=m;i++){
			int u,v,w;
			cin>>u>>v>>w;
			add(u,v,w);
			if(w>=0)add(v,u,w);
		}
		dfs(0,1);
		cout<<(fl?"YES\n":"NO\n");
	}
	return 0;
}
/*
1
8 14
1 2 5
1 7 -3
2 3 8
2 4 0
2 5 14
2 2 15
2 6 13
3 7 5
4 5 1
4 6 13
4 7 11
4 8 15
4 7 15
4 6 -2
*/
2023/10/27 19:38
加载中...