Submission #1182018

#TimeUsernameProblemLanguageResultExecution timeMemory
1182018anteknneCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
204 ms29284 KiB
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;

#define pb push_back
#define pii pair<ll, ll>
#define pll pair<ll, ll>
#define pil pair<ll, ll>
#define pli pair<ll, ll>
#define st first
#define nd second
#define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
#define debug false

const int MAXN = 200 * 1000 + 1;
vector<pil> graf[MAXN];
ll odl[MAXN];
ll odlS[MAXN];
ll odlT[MAXN];
ll odlU[MAXN];
ll odlV[MAXN];
ll dp[MAXN][4];
vector<pli> vec;
priority_queue<pil> pq;

void djikstra (ll s) {
    //memset(odl, ll(INT_MAX) * ll(MAXN), sizeof(odl));
    for (int i = 1; i < MAXN; i ++) {
        odl[i] = 1e18;
        //cout << odl[i];
    }

    /*for (int i = 1; i <= 8; i ++) {
        cout << odl[i] << " ";
    }*/

    odl[s] = 0;
    pq.push({0, s});

    while (!pq.empty()) {
        ll v = pq.top().nd;
        ll vodl = -pq.top().st;
        pq.pop();
        if (vodl > odl[v]) {
            continue;
        }
        for (auto x : graf[v]) {
            if (vodl + x.nd < odl[x.st]) {
                odl[x.st] = vodl + x.nd;
                pq.push({-odl[x.st], x.st});
            }
        }
    }
}

int main () {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    ll n, m, S, T, U, V;
    cin >> n >> m >> S >> T >> U >> V;

    ll a, b;
    ll c;
    for (ll i = 0; i < m; i ++) {
        cin >> a >> b >> c;
        graf[a].pb({b, c});
        graf[b].pb({a, c});
    }

    djikstra(S);
    swap(odl, odlS);
    djikstra(T);
    swap(odl, odlT);
    djikstra(U);
    swap(odl, odlU);
    djikstra(V);
    swap(odl, odlV);

    if (debug) {
        cout << "odlS:\n";
        for (ll i = 1; i <= n; i ++) {
            cout << i << ": " << odlS[i] << "\n";
        }
        cout << "\n";
    }

    for (ll i = 1; i <= n; i ++) {
        vec.pb({odlS[i], i});
    }

    sort(vec.begin(), vec.end());

    //memset(dp, ll(INT_MAX) * ll(MAXN), sizeof(dp));
    for (int i = 1; i <= n; i ++) {
        for (int j = 0; j < 4; j ++) {
            dp[i][j] = 1e18;
        }
    }

    dp[S][0] = 0;
    dp[S][1] = odlU[S];
    dp[S][2] = odlV[S];
    dp[S][3] = odlU[S] + odlV[S];

    for (auto x : vec) {
        ll v = x.nd;
        for (auto x : graf[v]) {
            if (odlS[v] == odlS[x.st] + x.nd) {
                for (ll i = 0; i < 4; i ++) {
                    for (ll j = 0; j < 4; j ++) {
                        ll dod = 0;
                        if (j & 1) {
                            dod += odlU[v];
                        }
                        if (j & 2) {
                            dod += odlV[v];
                        }
                        if (odlU[x.st] == 1e18 || odlV[x.st] == 1e18 || dp[x.st][i] == 1e18) {
                            continue;
                        }
                        dp[v][i | j] = min(dp[v][i | j], dp[x.st][i] + dod);

                    }
                }
            }
        }
    }

    cout << min(dp[T][3], odlU[V]) << "\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...