负环求调
  • 板块学术版
  • 楼主2huk
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/2 10:20
  • 上次更新2024/10/2 13:17:17
查看原帖
负环求调
748509
2huk楼主2024/10/2 10:20

CSES - 1197

17.0 / 27.0 Runtime Error

#include <bits/stdc++.h>

using namespace std;

const int N = 1e6, M = 1e6;
#define int long long

int n, m, x;
int h[N], e[M], ne[M], w[M], idx;
int pre[N];

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

int dis[N];
bool st[N];
int cnt[N];

signed main() {
	memset(h, -1, sizeof h);
	cin >> n >> m;
	
	while (m -- ) {
		int a, b, c;
		cin >> a >> b >> c;
		add(a, b, c);
	}
	for (int i = 1; i <= n; ++ i ) {
		add(0, i, 0);
	}
	
	queue<int> q;
	q.push(0);
	st[0] = true;
	
	memset(dis, 0x3f, sizeof dis);
	dis[0] = 0;
	
	while (q.size()) {
		int u = q.front();
		q.pop();
		st[u] = false;
		
		for (int i = h[u]; ~i; i = ne[i]) {
			int v = e[i], w = ::w[i];
			if (dis[v] > dis[u] + w) {
				dis[v] = dis[u] + w;
				cnt[v] = cnt[u] + 1;
				pre[v] = u;
				if (cnt[v] >= n) {
					cout << "YES\n";
					vector<int> res;
					res.push_back(v);
					while (pre[res.back()] != v) res.push_back(pre[res.back()]);
					res.push_back(v);
					reverse(res.begin(), res.end());
					for (int v : res) cout << v << ' ';
					return 0;
				}
				if (!st[v]) {
					st[v] = true;
					q.push(v);
				}
			}
		}
	}
	
	cout << "NO\n";
	
	return 0;
}
2024/10/2 10:20
加载中...