社区讨论

84pts求条WA on #6 #14

P4878[USACO05DEC] Layout G参与者 1已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mliqq4sx
此快照首次捕获于
2026/02/12 08:48
4 周前
此快照最后确认于
2026/02/14 12:50
3 周前
查看原帖
警示后人看了一下,加了相邻两个的约束,但是#14还是WA的
CPP
#include <bits/stdc++.h>
using namespace std;

int n, ml, md;

vector<pair<int, int> > e[10001];
int dis[10001], cnt[10001];
bool vis[10001];
queue<int> q;

signed main() {
	cin >> n >> ml >> md;
	while (ml--) {
		int a, b, d;
		cin >> a >> b >> d;
		//p_b - p_a <= d
		e[a].push_back({b, d});
	}
	while (md--) {
		int a, b, d;
		cin >> a >> b >> d;
		e[b].push_back({a, -d});
	}
	for (int i = 2; i <= n; i++) {
		e[i + 1].push_back({i, 0});
	}
	for (int i = 1; i <= n; i++) {
		e[0].push_back({i, 0});
	}
	memset(dis, 0x3f, sizeof (dis));
	bool f = true;
	q.push(0);
	dis[0] = 0;
	vis[0] = true;
	while (f && !q.empty()) {
		int u = q.front();
		q.pop();
		vis[u] = false;
		for (auto [v, w] : e[u]) {
			if (dis[v] > dis[u] + w) {
				dis[v] = dis[u] + w;
				if (++cnt[v] > n) {
					cout << -1;
					f = false;
					break;
				}
				if (!vis[v]) {
					q.push(v);
					vis[v] = true;
				}
			}
		}
	}
	if (f) {
		if (dis[n] == 0x3f3f3f3f) {
			cout << "-2";
		} else {
			while (!q.empty()) {
				q.pop();
			}
			memset(vis, false, sizeof (vis));
			memset(dis, 0x3f, sizeof (dis));
			memset(cnt, 0, sizeof (cnt));
			q.push(1);
			dis[1] = 0;
			vis[1] = true;
			bool f2 = true;
			while (f2 && !q.empty()) {
				int u = q.front();
				q.pop();
				vis[u] = false;
				for (auto [v, w] : e[u]) {
					if (dis[v] > dis[u] + w) {
						dis[v] = dis[u] + w;
						if (++cnt[v] > n) {
							cout << -1;
							f2 = false;
							break;
						}
						if (!vis[v]) {
							q.push(v);
							vis[v] = true;
						}
					}
				}
			}
			if (f2) {
				cout << dis[n];
			}
		}
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...