| 比赛 |
寒假集训4 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
回忆 |
最终得分 |
100 |
| 用户昵称 |
赵飞羽 |
运行时间 |
0.093 s |
| 代码语言 |
C++ |
内存使用 |
4.69 MiB |
| 提交时间 |
2026-02-28 10:08:06 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1010, M = 10010;
int c, n, m, s, u, v, x, y;
ll a[N], dis[N];
bool mp[N][N], vis[N], ck[N], ps[N];
struct edge{
int to, add_x, add_y;
} dot;
vector <vector<edge>> g(N);
vector <vector<int>> rg(N);
queue <int> q, rq;
signed main() {
freopen("recall.in", "r", stdin);
freopen("recall.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> c >> n >> m >> s;
for (int i = 1; i <= n; i++) cin >> a[i], dis[i] = -1;
for (int i = 1; i <= m; i++) {
cin >> u >> v >> x >> y;
if (!mp[u][v]) {
g[u].push_back((edge){v, x, y});
mp[u][v] = true;
}
}
if (s + a[1] < 0) {
cout << -1;
return 0;
}
dis[1] = s + a[1];
vis[1] = 1;
q.push(1);
ck[1] = true;
for (int u = 1; u <= n; u++) {
for (auto& e: g[u]) {
rg[e.to].push_back(u);
}
}
rq.push(n);
ps[n] = true;
while (!rq.empty()) {
int v = rq.front();
rq.pop();
for (int u: rg[v]) {
if (!ps[u]) {
ps[u] = true;
rq.push(u);
}
}
}
while (!q.empty()) {
int u = q.front();
q.pop();
ck[u] = false;
if (!ps[u]) continue;
for (auto& edge: g[u]) {
int v = edge.to;
int x = edge.add_x;
int y = edge.add_y;
if (x != 0 && y != 0 && !mp[x][y]) {
dot = {y, 0, 0};
g[x].push_back(dot);
mp[x][y] = true;
rg[y].push_back(x);
if (ps[y] && !ps[x]) {
ps[x] = true;
rq.push(x);
}
}
ll sum;
if (!vis[v]) sum = dis[u] + a[v];
else sum = dis[u];
if (sum < 0) continue;
if (sum > dis[v]) {
dis[v] = sum;
vis[v] = true;
if (!ck[v]) {
q.push(v);
ck[v] = true;
}
}
}
}
cout << (dis[n] == -1? -1: dis[n]) << endl;
return 0;
}