Submission #1369906

#TimeUsernameProblemLanguageResultExecution timeMemory
1369906norrawichzzzCommuter Pass (JOI18_commuter_pass)C++20
31 / 100
192 ms19080 KiB
#include <bits/stdc++.h>
using namespace std;

#define tup tuple<long long,int,int>

const long long INF = 1e18;
const int N = 1e5+5;

int n,m,s,t,U,V;
vector<pair<int, int>> adj[N];

long long sdist[N], rdist[N], dist[3][N];

void prepare() {
    priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> pq;
    fill(sdist, sdist+N, INF);
    sdist[s] = 0;
    pq.push({0, s});

    while (!pq.empty()) {
        auto [d, u] = pq.top(); pq.pop();

        if (d > sdist[u]) continue;

        for (auto [v, w] : adj[u]) {
            if (sdist[v] > sdist[u] + w) {
                sdist[v] = sdist[u]+w;
                pq.push({sdist[v],v});
            }
        }
    }

    fill(rdist, rdist+N, INF);
    rdist[t] = 0;
    pq.push({0, t});

    while (!pq.empty()) {
        auto [d, u] = pq.top(); pq.pop();

        if (d > rdist[u]) continue;

        for (auto [v,w] : adj[u]) {
            if (rdist[v] > rdist[u] + w) {
                rdist[v] = rdist[u] + w;
                pq.push({rdist[v], v});
            }
        }
    }

}

bool checkpath(int u, int v, int w) {
    return (sdist[u] + rdist[v] + w == sdist[t] || sdist[v] + rdist[u] + w == sdist[t]);
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    
    cin>> n>> m>> s>> t>> U>> V;

   
    for (int i=0; i<m; i++) {
        int u,v,w;
        cin>> u>> v>> w;
        adj[u].push_back({v,w});
        adj[v].push_back({u,w});
    }

    prepare();

    for (int i=0; i<3; i++) for (int j=0; j<N; j++) dist[i][j] = INF;

    priority_queue<tup, vector<tup>, greater<tup>> pq;// state 0 == not used // 1 == using // 2 == used
    pq.push({0, 0, U});
    dist[0][U] = 0;

    while (!pq.empty()) {
        auto [d, state, u] = pq.top(); pq.pop();

        if (d > dist[state][u]) continue;

        for (auto [v, w] : adj[u]) {
            if (state == 0) {
                if (checkpath(u, v, w)) {
                    if (dist[1][v] > dist[0][u]) {
                        dist[1][v] = dist[0][u];
                        pq.push({dist[1][v], 1, v});
                    }
                }

                if (dist[0][v] > dist[0][u] + w) {
                    dist[0][v] = dist[0][u] + w;
                    pq.push({dist[0][v], 0, v});
                }
            }  
            else if (state == 1) {
                if (checkpath(u, v, w)) {
                    if (dist[1][v] > dist[1][u]) {
                        dist[1][v] = dist[1][u];
                        pq.push({dist[1][v], 1, v});
                    }
                }
                if (dist[2][v] > dist[1][u] + w) {
                    dist[2][v] = dist[1][u] + w;
                    pq.push({dist[2][v], 2, v});
                }
            }
            else {
                if (dist[2][v] > dist[2][u]+w) {
                    dist[2][v] = dist[2][u] + w;
                    pq.push({dist[2][v], 2, v});
                }
            }
        }
    }

    long long ans = INF;
    for (int i=0; i<3; i++) ans = min(ans, dist[i][V]);
    cout<< ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...