很清楚模板的spfa判断负环,只对下面三点
查看原帖
很清楚模板的spfa判断负环,只对下面三点
1122253
kmg_is_so_cute楼主2024/3/28 18:25
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
#include <algorithm>

using namespace std;

int T;
const int N = 60100;
int h[N], e[N], ne[N], idx , w[N];
int n, m , u , v , r;
int dist[N], f[N] , cnt[N];

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

int spfa()
{
	memset(dist, 0x3f3f3f3f3f3f3f3f, sizeof dist);
	memset(f, 0, sizeof f);
	memset(cnt, 0, sizeof cnt);

	queue<int>q;
	dist[1] = 0;
	f[1] = 1;
	q.push(1);
	
	while (q.size())
	{
		int t = q.front();
		q.pop();
		f[t] = 0;

		for (int i = h[t]; i != -1; i = ne[i])
		{
			int j = e[i];
			if (dist[j] > dist[t] + w[i])
			{
				dist[j] = dist[t] + w[i];
				cnt[j] = cnt[t] + 1;

				if (cnt[j] >= n)return 1;

				if (f[j] != 1)
				{
					q.push(j);
					f[j] = 1;
				}
			}

		}
	}
	return 0;
}

int main()
{
	
	cin >> T;
	while (T--)
	{

		memset(h, -1, sizeof h);
		idx = 0;

		cin >> n >> m;
		while( m --)
		{
			scanf("%d %d %d", &u, &v, &r);
			add(u, v, r);
		}
		if (spfa())cout << "YES" << endl;
		else cout << "NO" << endl;
	}
	return 0;
}
2024/3/28 18:25
加载中...