Submission #1273194

#TimeUsernameProblemLanguageResultExecution timeMemory
1273194vk3601hCommuter Pass (JOI18_commuter_pass)C++20
15 / 100
228 ms20436 KiB
#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18;

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

    int n, m, s, t, u, v;
    cin >> n >> m >> s >> t >> u >> v;
    s--, t--, u--, v--;

    vector<vector<pair<int, long long>>> adj(n);
    for (int i = 0; i < m; i++){
        int a, b;
        long long c;
        cin >> a >> b >> c;
        a--, b--;
        adj[a].push_back({b, c});
        adj[b].push_back({a, c});
    }

    auto dijkstra1 = [&](int start) -> vector<long long> {
        vector<bool> processed(n, false);
        vector<long long> dist(n, INF);
        priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> frontier;

        dist[start] = 0;
        frontier.push({0, start});

        while (!frontier.empty()){
            int curr = frontier.top().second;
            frontier.pop();

            if (processed[curr]) continue;
            processed[curr] = true;

            for (const pair<int, long long> &edge : adj[curr]){
                int node = edge.first;
                long long cost = edge.second;

                if (dist[node] > dist[curr] + cost){
                    dist[node] = dist[curr] + cost;
                    frontier.push({dist[node], node});
                }
            }
        }

        return dist;
    };
    vector<long long> dpU = dijkstra1(u);
    vector<long long> dpV = dijkstra1(v);

    auto dijkstra2 = [&](int start, int end) -> long long {
        vector<long long> dist(n, INF);
        vector<vector<long long>> dp(2, vector<long long>(n, INF));
        priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> frontier;

        dist[start] = 0;
        frontier.push({0, start});

        while (!frontier.empty()){
            int curr = frontier.top().second;
            long long curr_dist = frontier.top().first;
            frontier.pop();

            if (curr_dist > dist[curr]) continue;

            for (const pair<int, long long> &edge : adj[curr]){
                int node = edge.first;
                long long cost = edge.second;

                if (dist[node] > dist[curr] + cost){
                    dp[0][node] = min(dpU[node], dp[0][curr]);
                    dp[1][node] = min(dpV[node], dp[1][curr]);
                    dist[node] = dist[curr] + cost;
                    frontier.push({dist[node], node});
                }
                else if (dist[node] == dist[curr] + cost && min(dpU[node], dp[0][curr]) + min(dpV[node], dp[1][curr]) < dp[0][node] + dp[1][node]){
                    dp[0][node] = min(dpU[node], dp[0][curr]);
                    dp[1][node] = min(dpV[node], dp[1][curr]);
                    frontier.push({dist[node], node});
                }
            }
        }

        return dp[0][end] + dp[1][end];
    };

    cout << min({dpU[v], dijkstra2(s, t), dijkstra2(t, s)}) << "\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...