求助负环模板,本地AC提交RE
查看原帖
求助负环模板,本地AC提交RE
381566
_lzh_楼主2021/6/26 23:08

Rt

#include<bits/stdc++.h>
#define int long long
#define N 20010
using namespace std;
const int inf = 0x7fffffff;
int n, m, s, id = 0, h[N], d[N], pd[N], cnt[N];
struct edge {
	int next, to, v;
}a[N];
void add(int from, int to, int v) {
	id++;
	a[id].next = h[from];
	a[id].to = to;
	a[id].v = v;
	h[from] = id;
}
void init() {
	memset(h, -1, sizeof(h));
	memset(pd, 0, sizeof(pd));
	memset(cnt, 0, sizeof(cnt));
	id = 0;
}
void solve() {
	queue<int> q;
	init();
	s = 1;
	cin >> n >> m;
	for(int i = 1; i <= m; i++) {
		int u, v, w;
		cin >> u >> v >> w;
		if(w > 0) {
			add(u, v, w);
			add(v, u, w);
		}
		else
			add(u, v, w);
	}
	for(int i = 1; i <= n; i++) {
		d[i] = inf;
		pd[i] = 0;
	}
	q.push(s);
	d[s] = 0;
	pd[s] = 1;
	while(!q.empty()) {
		int x = q.front();
		q.pop(), pd[x] = 0;
		for(int i = h[x]; i; i = a[i].next) {
			int k = a[i].to;
			if(d[k] > d[x] + a[i].v) {
				d[k] = d[x] + a[i].v;
				if(pd[k] == 0) {
					if(++cnt[k] >= n) {
						cout << "YES" << endl;
						return;
					}
					q.push(k);
					pd[k] = 1;
				}
			}
		}
	}
	cout << "NO" << endl;
}
signed main() {
//	freopen("test.txt", "w", stdout);
	int t;
	cin >> t;
	while(t--)
		solve();
    return 0;
}
2021/6/26 23:08
加载中...