Submission #1157443

#TimeUsernameProblemLanguageResultExecution timeMemory
1157443andrewpCommuter Pass (JOI18_commuter_pass)C++20
16 / 100
163 ms27108 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define pii pair<int,int>
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define int ll
const int N=1e5+10;
const ll inf=(ll)(1e18);

int n, m, s, t, u, v, dist[N][3];
vector<pii> g[N];
vector<int> adj[N];
int ans=inf;
bool was[N];
pii dp[N];

void Dijkstra(int root, int tp) {
    vector<bool> vis(n+1, false);
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push(make_pair(0, root));
    for (int i=1; i<=n; i++)
        dist[i][tp]=inf;
    dist[root][tp]=0;
    while (pq.size()) {
        int x=pq.top().second;
        pq.pop();
        if (vis[x])
            continue;
        vis[u]=true;
        for (auto z:g[x]) {
            int p, q;
            tie(p, q)=z;
            if (dist[p][tp]>dist[x][tp]+q) {
                dist[p][tp]=dist[x][tp]+q;
                pq.push(make_pair(dist[p][tp], p));
            }
        }
    }
}

void dfs(int x) {
    if (was[x])
        return;
    was[x]=true;
    dp[x]={inf, inf};
    if (x==t)
        dp[x]={dist[x][1], dist[x][2]};
    for (auto u:adj[x]) {
        dfs(u);
        dp[x].first=min(dp[x].first, dp[u].first);
        dp[x].second=min(dp[x].second, dp[u].second);
    }
    if (dp[x].first!=inf) {
        dp[x].first=min(dp[x].first, dist[x][1]);
        dp[x].second=min(dp[x].second, dist[x][2]);
        ans=min(ans, min(dist[x][1]+dp[x].second, dist[x][2]+dp[x].first));
    }
}

int32_t main () {
    ios::sync_with_stdio(false), cin.tie(0);

    cin >> n >> m >> s >> t >> u >> v;
    for (int i=1; i<=m; i++) {
        int a, b, w;
        cin >> a >> b >> w;
        g[a].pb(make_pair(b, w));
        g[b].pb(make_pair(a, w));
    }
    Dijkstra(s, 0);
    Dijkstra(u, 1);
    Dijkstra(v, 2);
    for (int i=1; i<=n; i++) {
        for (auto u:g[i]) {
            if (dist[i][0]+u.second==dist[u.first][0]) {
                adj[i].pb(u.first);
            }
        }
    }
    dfs(s);
    cout << min(ans, dist[v][1]) << '\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...