Submission #1352838

#TimeUsernameProblemLanguageResultExecution timeMemory
1352838s101gCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
368 ms27324 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
const int mx = 1e5 + 5;
const ll inf = 2e18;
ll dp[2][mx], du[mx], dv[mx], d[mx];
ll ans;
bool vis[mx];
vector<pii> adj[mx];
int n, m;
void dij1(int s, ll d[])
{
    fill(vis, vis + n, false);
    priority_queue<pii, vector<pii>, greater<pii>> pq;
    pq.push({0, s});
    d[s] = 0;
    while (!pq.empty())
    {
        auto t = pq.top();
        pq.pop();
        ll dd = t.first, cur = t.second;
        if (vis[cur])
            continue;
        vis[cur] = true;
        d[cur] = dd;
        for (auto u : adj[cur])
        {
            int to = u.first, w = u.second;
            pq.push({dd + w, to});
        }
    }
}
void dij2(int s, int t)
{
    fill(vis, vis + n, false);
    fill(dp[0], dp[0] + n, inf);
    fill(dp[1], dp[1] + n, inf);
    vector<ll> d(n, inf);
    priority_queue<pair<ll, pii>, vector<pair<ll, pii>>, greater<pair<ll, pii>>> pq;
    pq.push({0, {s, 0}});
    while (!pq.empty())
    {
        auto t = pq.top();
        pq.pop();
        ll dd = t.first, cur = t.second.first, par = t.second.second;
        if (!vis[cur])
        {
            vis[cur] = true;
            d[cur] = dd;
            dp[0][cur] = min({dp[0][cur], du[cur], dp[0][par]});
            dp[1][cur] = min({dp[1][cur], dp[0][cur] + dv[cur], dp[1][par]});
            for (auto u : adj[cur])
                pq.push({dd + u.second, {u.first, cur}});
        }
        else if (dd == d[cur])
        {
            dp[0][cur] = min({dp[0][cur], du[cur], dp[0][par]});
            dp[1][cur] = min({dp[1][cur], dp[0][cur] + dv[cur], dp[1][par]});
        }
    }
    ans = min(ans, dp[1][t]);
}
int main()
{
    cin >> n >> m;
    int s, t, u, v;
    cin >> s >> t >> u >> v;
    s--, t--, u--, v--;
    for (int i = 0; i < m; i++)
    {
        int a, b, c;
        cin >> a >> b >> c;
        adj[--a].push_back({--b, c});
        adj[b].push_back({a, c});
    }
    dij1(u, du);
    dij1(v, dv);
    ans = du[v];
    dij2(s, t);
    dij2(t, s);
    cout << ans << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...