社区讨论
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 条回复,欢迎继续交流。
正在加载回复...