90pts玄关
查看原帖
90pts玄关
677091
MnZnOIer楼主2023/12/18 20:42

码字如下:

#include <bits/stdc++.h>
using namespace std;
int n, m, h[10001], cnt[10001], c, s[10001], t;
bool ex[10001], f;
struct Egde{int dis, nxt, to;}e[200001];
void add (int u, int v, int d)
{
	e[++ c].nxt = h[u];
	e[c].to = v;
	e[c].dis = d;
	h[u] = c;
}
queue <int> q;
void spfa ()
{
	for (int i = 1; i <= n; ++ i)
	{
		q.push (i);
		ex[i] = 1;
	}
	while (! q.empty ())
	{
		int u = q.front ();
		q.pop ();
		ex[u] = 0;
		for (int i = h[u]; i ; i = e[i].nxt)
		{
			int v = e[i].to;
			if (s[u] + e[i].dis < s[v])
			{
				s[v] = s[u] + e[i].dis;
				if (! ex[v])
				{
					cnt[v] = cnt[u] + 1;
					if (cnt[v] >= n)
					{
						f = 1;
						return;
					}
					ex[v] = 1;
					q.push (v);
				}
			}
		}
	}
}
signed main ()
{
	scanf ("%d", &t);
	++ t;
	while (-- t)
	{
		f = 0;
		memset (ex, 0, sizeof (ex));
		memset (s, 0x3f, sizeof (s));
		memset (e, 0, sizeof (e));
		memset (cnt, 0, sizeof (cnt));
		memset (h, 0, sizeof (h));
		while (! q.empty ())q.pop ();
		scanf ("%d %d", &n, &m);
		s[1] = 0;
		for (int i = 0; i < m; ++ i)
		{
			int u, v, d;
			scanf ("%d %d %d", &u, &v, &d);
			add (u, v, d);
			if (d >= 0)add (v, u, d);
		}
		spfa ();
		if (f)puts ("YES");
		else puts ("NO");
	}
	return 0;
}

并且手残下载了wa的数据

1
4 3 
2 3 -1
3 4 -1
4 2 -1

输出竟然是NO,这是怎么回事?

2023/12/18 20:42
加载中...