20pts求条
查看原帖
20pts求条
982518
sjwhsss楼主2024/7/28 23:04
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+5;
int n , m , cnt = 0 , head[maxn] , dis[maxn] , tot[maxn];
bool vis[maxn];
struct edge
{
	int u , v , w , next;
}e[maxn];
void Insert(int u , int v , int w)
{
	e[++cnt].u=u , e[cnt].v=v , e[cnt].w=w , e[cnt].next=head[u] , head[u]=cnt;
}
void SPFA(int s)
{
	memset(dis , 0x3f , sizeof(dis));
	memset(vis , 0 , sizeof(vis));
	memset(tot , 0 , sizeof(tot));
	queue<int>q;
	q.push(s);
	vis[s]=1; 
	dis[s]=0;
	tot[s]=0;
	while(q.size())
	{
		int u = q.front();
		//cout << u << endl;
		q.pop();
		vis[u]=0;
		for (int i = head[u]; i; i = e[i].next)
		{
			int v = e[i].v , w = e[i].w;
			
			if (dis[v] > dis[u] + w)
			{
				//cout << 1;
				dis[v]=dis[u] + w;
				if (!vis[v])
				{
					if (++tot[v] >= n)
					{
						cout << "YES\n";
						return;
					}
					q.push(v);
					vis[v]=1;
				}
			}
		}
	}
	cout << "NO\n";
	return;
}
int main ()
{
	int t;
	scanf("%d",  &t);
	while(t--)
	{
		scanf("%d%d" , &n , &m);
		//cout << n << " " << m << endl;
		for (int i = 1; i <= m; i++)
		{
			int u , v , w;
			scanf("%d%d%d" , &u , &v , &w);
			if (w >= 0) Insert(u , v , w) , Insert(v , u , w);
			else Insert(u , v , w);
		}
		SPFA(1);
	}
	return 0;
}

应该没问题的啊

2024/7/28 23:04
加载中...