Submission #1319925

#TimeUsernameProblemLanguageResultExecution timeMemory
1319925asafeCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
361 ms27360 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define vi vector<int>
#define pii pair<int,int>
#define vii vector<pair<int,int>>
#define vll vector<long long>
#define pb push_back
#define pll pair<long long ,long long>
#define pf push_front
#define ql cout<<endl;

#define int long long 
const ll inf=1e18;
const int maxn= 1e5+5;
int n,m,s,t,u,v;
int par[maxn];
vii g[maxn];
vll dists,distu,distv;
int dp[2][maxn];
bool bt[maxn];
int ans=inf;
void dijkstra(int start,vll &dist){
    dist.resize(n+1);
    priority_queue<pii,vii,greater<pii>> q;
    fill(dist.begin(),dist.end(),inf);
    dist[start]=0;
    q.push({0,start});
    fill(bt,bt+n+1,0);
    while(!q.empty()){
        auto[du,u]=q.top();
        q.pop();
        if(bt[u])continue;
        bt[u]=1;
        for(auto[viz , d] : g[u]){
            if (dist[viz] > du + d) {
                dist[viz] = du + d;
                q.push({dist[viz], viz});
            }
        }
    }

}

void dijkstra2(int start,int  end){
    fill(bt,bt+n+1,0);
    fill(dp[0],dp[0]+n+1,inf);
    fill(dp[1],dp[1]+n+1,inf);
    
    priority_queue<pair<int,pii>,vector<pair<int,pii>>,greater<pair<int,pii>>>q;
    
    q.push({0,{start,0}});
    dp[0][start]=distu[start];
    dp[1][start]=distu[start]+distv[start];
    while(!q.empty()){
        auto[du,p]=q.top();
        auto[u,paru]=p;
        q.pop();
        if (!bt[u]) {
            bt[u] = true;
            dists[u] = du;

            if (paru == 0) {
                dp[0][u] = distu[u];
                dp[1][u] = distu[u] + distv[u];
            } else {
                dp[0][u] = min(distu[u], dp[0][paru]);
                dp[1][u] = min(dp[0][u] + distv[u], dp[1][paru]);
            }

            for (auto [v, w] : g[u]) {
                q.push({du + w, {v, u}});
            }
        }
        else if (du == dists[u]) {
            dp[0][u] = min(dp[0][u], dp[0][paru]);
            dp[1][u] = min({dp[1][u], dp[0][u] + distv[u], dp[1][paru]});
        }
    }

    ans=min(ans,dp[1][end]);

}

int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin>>n>>m>>s>>t>>u>>v;

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

    dijkstra(u,distu);
    dijkstra(v,distv);
    
    ans=distu[v];
    dists.resize(n+1);
    dijkstra2(s,t);
    dijkstra2(t,s);

    cout<<ans;

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...