- 紧急救援
1
- @ 2026-7-21 11:48:13
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int, int>
void solve() {
int n, m, s, t;
cin >> n >> m >> s >> t; s++, t++;
vector<int> a(n + 1);
for (int i = 1; i <= n; i++) cin >> a[i];
const ll inf = 1e9;
vector e(n + 1, vector<pii>());
for (int i = 1, u, v, w; i <= m; i++) {
cin >> u >> v >> w;
u++, v++;
e[u].push_back({v, w});
e[v].push_back({u, w});
}
{
vector<ll> visi(n + 1), d(n + 1, inf * inf), cnt(n + 1, 0);
priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> q;
d[s] = 0;
q.push({0, s}); cnt[s] = 1;
while (q.size()) {
auto [dis, u] = q.top(); q.pop();
if (visi[u]) continue;
visi[u] = 1;
for (auto [v, w] : e[u]) {
ll W = w;
if (d[v] > dis + W) {
d[v] = dis + W;
q.push({d[v], v});
cnt[v] = cnt[u];
} else if (d[v] == dis + W) {
cnt[v] += cnt[u];
}
}
}
cout << cnt[t] << ' ';
}
vector<ll> visi(n + 1), d(n + 1, inf * inf), pre(n + 1);
priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> q;
d[s] = -a[s];
q.push({-a[s], s});
while (q.size()) {
auto [dis, u] = q.top(); q.pop();
if (visi[u]) continue;
visi[u] = 1;
for (auto [v, w] : e[u]) {
ll W = w * 1ll * inf - a[v];
if (d[v] > dis + W) {
d[v] = dis + W;
pre[v] = u;
q.push({d[v], v});
}
}
}
ll D = d[t];
int len = D / inf, cnt = D % inf;
if (cnt != 0) {
cnt = inf - cnt;
len++;
}
cout << cnt << '\n';
vector<int> ans;
int x = t;
while (x) {
ans.push_back(x);
x = pre[x];
}
reverse(ans.begin(), ans.end());
for (auto x : ans) cout << x - 1 << ' '; cout << '\n';
}
signed main() {
int t = 1;
// cin >> t;
while (t--) solve();
return 0;
}
/*
g++ -std=c++20 1.cpp -o 1 && 1 < in.txt > out.txt
*/
0 条评论
目前还没有评论...
信息
- ID
- 495
- 时间
- ms
- 内存
- MiB
- 难度
- 5
- 标签
- 递交数
- 62
- 已通过
- 22
- 上传者