Submission #1144425

#TimeUsernameProblemLanguageResultExecution timeMemory
1144425Robert_juniorCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
190 ms24908 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define ins insert
#define all(x) x.begin(), x.end()
#define F first
#define S second
const int N  = 2e5 + 7;
int d[N], d1[N], d2[N], n, m, used[N], s, t, u, v, ans = 1e18;
int dp[N][2];
vector<pair<int, int>>g[N];
void dijkstra(int st, int fi){
    for(int i = 1; i <= n; i++){
        d[i] = 1e18;
        used[i] = 0;
        dp[i][0] = dp[i][1] = 1e18;
    }
    priority_queue<array<int, 3>>q;
    d[st] = 0;
    q.push({0, st, st});
    while(q.size()){
        int we = -q.top()[0], v = q.top()[1], pr = q.top()[2];
        q.pop();
        if(used[v] && we == d[v]){
            dp[v][0] = min(dp[v][0], dp[pr][0]);
            dp[v][1] = min(dp[v][1], dp[pr][1]);
        }
        else{
            dp[v][0] = min(d1[v], dp[pr][0]);
            dp[v][1] = min(d2[v], dp[pr][1]);
            used[v] = 1;
            for(auto [to, w] : g[v]){
                if(d[to] > d[v] + w){
                    d[to] = d[v] + w;
                    q.push({-d[to], to, v});
                }
            }
        }
    }
    ans = min(ans, dp[fi][0] + dp[fi][1]);
}
void dijkstra1(int s){
    for(int i = 1; i <= n; i++){
        used[i] = 0;
        d1[i] = 1e18;
    }
    d1[s] = 0;
    priority_queue<pair<int, int>>q;
    q.push({0, s});
    while(q.size()){
        int v = q.top().second;
        q.pop();
        if(used[v]) continue;
        used[v] = 1;
        for(auto [to, w] : g[v]){
            if(d1[to] > d1[v] + w){
                d1[to] = d1[v] + w;
                q.push({-d1[to], to});
            }
        }
    }
}
void dijkstra2(int s){
    for(int i = 1; i <= n; i++){
        used[i] = 0;
        d2[i] = 1e18;
    }
    d2[s] = 0;
    priority_queue<pair<int, int>>q;
    q.push({0, s});
    while(q.size()){
        int v = q.top().second;
        q.pop();
        if(used[v]) continue;
        used[v] = 1;
        for(auto [to, w] : g[v]){
            if(d2[to] > d2[v] + w){
                d2[to] = d2[v] + w;
                q.push({-d[to], to});
            }
        }
    }
}
void solve(){
    cin>>n>>m>>s>>t>>u>>v;
    for(int i = 1; i <= m; i++){
        int a, b, w;
        cin>>a>>b>>w;
        g[a].pb({b, w});
        g[b].pb({a, w});
    }
    dijkstra1(u);
    dijkstra2(v);
    dijkstra(s, t);
    dijkstra(t, s);
    cout<<ans;
}
signed main(){
    ios_base :: sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t = 1;
    //cin>>t;
    while(t--){
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...