Submission #1330237

#TimeUsernameProblemLanguageResultExecution timeMemory
1330237NipphitchCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
270 ms27176 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define pii pair <int,int> 
#define a3 array <int,3>
const int N=1e5+5;
const int INF=1e15+7;

int n,m,st1,en1,st2,en2,d1[N],d2[N],d3[N],dp1[N],dp2[N],ans;
vector <pii> adj[N];

void stp1(int st,int d[]){
    priority_queue <pii,vector <pii>,greater <pii>> pq;
    pq.push({d[st]=0,st});
    while(!pq.empty()){
        auto [d_u,u]=pq.top();
        pq.pop();
        if(d_u>d[u]) continue;
        for(auto [v,w]:adj[u]) if(d[v]>d_u+w) pq.push({d[v]=d_u+w,v});
    }
}

void stp2(int st,int en){
    for(int i=0;i<N;i++) dp1[i]=dp2[i]=INF;
    vector <bool> vis(N+5,false);
    priority_queue <a3,vector <a3>,greater <a3>> pq;
    pq.push({0,st,0});
    while(!pq.empty()){
        auto [d_u,u,p_u]=pq.top();
        pq.pop();
        if(!vis[u]){
            vis[u]=true;
            d3[u]=d_u;
            dp1[u]=min(dp1[p_u],d1[u]);
            dp2[u]=min(dp1[u]+d2[u],dp2[p_u]);
            for(auto [v,w]:adj[u]) pq.push({d_u+w,v,u});
        }
        else if(d3[u]==d_u){
            dp1[u]=min(dp1[u],dp1[p_u]);
            dp2[u]=min({dp2[u],dp1[u]+d2[u],dp2[p_u]});
        }
    }
    ans=min(ans,dp2[en]);
}

signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    for(int i=0;i<N;i++) d1[i]=d2[i]=INF;
    cin >> n >> m >> st1 >> en1 >> st2 >> en2;
    for(int i=1;i<=m;i++){
        int u,v,w;
        cin >> u >> v >> w;
        adj[u].push_back({v,w});
        adj[v].push_back({u,w});
    }
    stp1(st2,d1);
    stp1(en2,d2);
    ans=d1[en2];
    stp2(st1,en1);
    stp2(en1,st1);
    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...