已经初始化了 还是20分 为什么
查看原帖
已经初始化了 还是20分 为什么
1021623
AVLw楼主2023/11/17 21:25

20分 其他点都是wa 看不出来哪里不对 求调 回关注 谢谢

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cmath>
#include<climits>
#include<cstring>

using namespace std;
const int N = 4e6 + 10;

struct edge {
	int v, w, ne;
}e[N];
int h[N]; int idx = 1;
int d[N], q[N];  //d[i]源点到节点距离的表 q[i]哪些节点被松弛了放入队列
bool st[N];  //节点是否在队列中
int cnt[N];  //节点被松弛次数
int l = 0, r = 0;

void add(int u, int v, int w) {
	e[idx] = { v,w,h[u] };
	h[u] = idx++;
}

bool  SPFA(int n) {
	d[1] = 0;
	cnt[1]++;
	q[r++] = 1;
	st[1] = true;
	while (l < r) {
		int u = q[l++];
		//考察从u出发的所有边
		for (int i = h[u]; i > 0; i = e[i].ne) {
			int v = e[i].v;
			int w = e[i].w;
			if (d[u] + w < d[v]) {
				d[v] = d[u] + w;
				if (!st[v]) {
					if (cnt[v]++ == n)  //松弛次数为n 说明有负环
						return true;
					q[r++] = v;
					st[v] = true;
				}
			}
		}
	}
	return false;
}

int main() {
	int t;
	scanf("%d", &t);
	while (t--) {
		l = r = 0;
		memset(e, 0, sizeof(e));
		memset(h, 0, sizeof(h));
		memset(cnt, 0, sizeof(cnt));
		memset(d, INT_MAX, sizeof(d));
		memset(st, 0, sizeof(st));
		memset(q, 0, sizeof(q));
		idx = 1;
		int n, m;
		scanf("%d%d", &n, &m);
		for (int i = 0; i < m; i++) {
			int u, v, w;
			scanf("%d%d%d", &u, &v, &w);
			add(u, v, w);
			if (w >= 0) {
				add(v, u, w);
			}
		}
		if (SPFA(n))
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
	}
}
2023/11/17 21:25
加载中...