社区讨论

挂了第二组第二个点求调

P3385【模板】负环参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhjhycpn
此快照首次捕获于
2025/11/04 02:52
4 个月前
此快照最后确认于
2025/11/04 02:52
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;

const int N=1e4+5;
const int inf=0x3f3f3f3f;

struct edge{
	int to,nxt,w;
} e[N*2];

int head[N],cnt=0;

void add(int a,int b,int l){
	e[cnt].to=b;
	e[cnt].w=l;
	e[cnt].nxt=head[a];
	head[a]=cnt++;
}

int n,m,s;
int vis[N],dis[N];
int ct[N]; 

void init(){
	cnt=0;
	memset(head,-1,sizeof(head));
	memset(dis,inf,sizeof(dis));
	memset(vis,0,sizeof(vis));
	memset(ct, 0, sizeof(ct));
}

bool spfa(int s){
	queue<int> qu;
//	qu.push(s);
	dis[s]=0;
//	vis[s]=1;
    for(int i=1;i<=n;i++){
        qu.push(i);
        vis[i]=1;
    }
	while(!qu.empty()){
		int u=qu.front();
		qu.pop();
		vis[u]=0;
		for(int i=head[u];i!=-1;i=e[i].nxt){
			int v=e[i].to;
			int w=e[i].w;
			if(dis[v]>dis[u]+w){
				dis[v]=dis[u]+w;
				ct[v]=ct[u]+1;
				if(ct[v]>=n) return true;
				if(!vis[v]){
					vis[v]=1;
					qu.push(v);
				}
			}
		}
	}
	return false;
}

void solve(){
	init();
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int x,y,z;
		cin>>x>>y>>z;
		add(x,y,z);
		if(z>=0) add(y,x,z);
	}
	s=1;
	if(spfa(s)) cout<<"YES"<<'\n';
	else cout<<"NO"<<'\n';
}

int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
}

回复

3 条回复,欢迎继续交流。

正在加载回复...