Submission #1329121

#TimeUsernameProblemLanguageResultExecution timeMemory
1329121saaCommuter Pass (JOI18_commuter_pass)C++20
15 / 100
2095 ms23160 KiB
#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<vector<pair<int, long long>>> g;
long long val[100010][2], dist[100010][4];
void dijkstra(int st, int rr){
    priority_queue<pair<long long, int>> pq;
    pq.push({0, st});
    while(!pq.empty()){
        auto u = pq.top(); pq.pop();
        if(dist[u.second][rr] < -u.first){
            continue;
        }
        for(auto v: g[u.second]){
            if(dist[v.first][rr] > -u.first+v.second){
                dist[v.first][rr] = -u.first+v.second;
                pq.push({-dist[v.first][rr], v.first});
            }
        }
    }
}
void d1(int u){
    for(auto v: g[u]){
        if(dist[v.first][0]+v.second == dist[u][0]){
            val[v.first][0] = min(val[v.first][0], min(val[u][0], dist[v.first][2]));
            d1(v.first);
        }
    }
}
void d2(int u){
    for(auto v: g[u]){
        if(dist[v.first][3]+v.second == dist[u][3]){
            val[v.first][1] = min(val[v.first][1], min(val[u][1], dist[v.first][2]));
            d2(v.first);
        }
    }
}
int main(){
    cin >> n >> m;
    int s, t, u1, u2; cin >> s >> t >> u1 >> u2;
    g = vector<vector<pair<int, long long>>> (n+5);
    for(int i = 1; i <= m; i ++){
        long long a, b, c; cin >> a >> b >> c;
        g[a].push_back({b, c});
        g[b].push_back({a, c});
    }
    for(int i = 1; i <= n; i++){
        val[i][0] = val[i][1] = 1e18;
        dist[i][0] = dist[i][1] = dist[i][2] = dist[i][3] = 1e18;
    }
    dist[s][0] = 0; dist[u1][1] = 0; dist[u2][2] = 0; dist[t][3] = 0;
    dijkstra(s, 0);
    dijkstra(t, 3);
    dijkstra(u1, 1);
    dijkstra(u2, 2);
    val[t][0] = dist[t][2];
    d1(t);
    val[s][1] = dist[s][2];
    d2(s);
    long long mn = 1e18;
    for(int i = 1; i <= n; i ++){
        mn = min(mn, dist[i][1]+min(val[i][0], val[i][1]));
        //cout << val[i][0] << " " << val[i][1] << endl;
    }
    cout << min(mn, dist[u2][1]) << endl;
    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...