#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
上传者