Submission #1357748

#TimeUsernameProblemLanguageResultExecution timeMemory
1357748jadai007Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
344 ms32784 KiB
#include <bits/stdc++.h>

using namespace std;
using i64 = int64_t;

int main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    int n, m, s, t, U, V; cin >> n >> m >> s >> t >> U >> V;
    vector<vector<pair<int, i64>>> vc(n + 1), nvc(n + 1);
    vector<vector<i64>> dis(n + 1, vector<i64>(4, 1e18)), dp(n + 1, vector<i64>(2));
    for(int i = 1; i <= m; ++i){
        int u, v; i64 w; cin >> u >> v >> w;
        vc[u].emplace_back(v, w);
        vc[v].emplace_back(u, w);
    }
    dis[s][0] = dis[t][1] = dis[U][2] = dis[V][3] = 0;
    auto bfs = [&](int st, int t) -> void {
        priority_queue<pair<i64, int>, vector<pair<i64, int>>, greater<pair<i64, int>>> pq;
        pq.emplace(0, st);
        while(!pq.empty()){
            auto [d, u] = pq.top();
            pq.pop();
            if(dis[u][t] < d) continue;
            for(auto [v, w]:vc[u]){
                if(dis[v][t] > w + d){
                    dis[v][t] = w + d;
                    pq.emplace(dis[v][t], v);
                }
            }
        }
    };
    bfs(s, 0); bfs(t, 1); bfs(U, 2); bfs(V, 3);
    i64 ans = dis[U][3];
    for(int i = 1; i <= n; ++i){
        for(auto [j, w]:vc[i]){
            if(dis[i][0] + w + dis[j][1] == dis[t][0] && dis[i][0] < dis[j][0]) nvc[i].emplace_back(j, w);
        }
    }
    vector<int> node(n);
    iota(node.begin(), node.end(), 1);
    sort(node.begin(), node.end(), [&](int a, int b){
        return dis[a][0] < dis[b][0];
    });
    for(int i = 1; i <= n; ++i) dp[i][0] = dp[i][1] = dis[i][2];
    for(auto u:node){
        for(auto [v, w]:nvc[u]) dp[v][0] = min(dp[v][0], dp[u][0]);
    }
    reverse(node.begin(), node.end());
    for(auto u:node){
        for(auto [v, w]:nvc[u]) dp[u][1] = min(dp[u][1], dp[v][1]);
    }
    for(int i = 1; i <= n; ++i) ans = min({ans, dp[i][0] + dis[i][3], dp[i][1] + dis[i][3]});
    cout << ans << '\n';
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...