Submission #1167941

#TimeUsernameProblemLanguageResultExecution timeMemory
1167941ricardsjansonsCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
192 ms19616 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
#define remin(a,b...) a=min({a,b})
#define remax(a,b...) a=max({a,b})
#define ll long long
#define ld long double
#define pii array<int,2>
#define pll array<ll,2>
#define vi vector<int>
#define vl vector<ll>
#define vb vector<bool>
#define vii vector<array<int,2>>
#define vll vector<array<ll,2>>
#define v2d(T) vector<vector<T>>
#define v3d(T) vector<vector<vector<T>>>
#define pub push_back
#define tup make_tuple
using namespace std;

const ll C=1e9;
const ll M=2e5;

ll n,m,s,t,u,v;
vector<vll> adj;

vl dij(int x){
    vl d(n+1,C*M);
    vb vis(n+1);
    d[x]=0;
    priority_queue<pll>pq;
    pq.push({0,x});
    while(!pq.empty()){
        int i=pq.top()[1];
        pq.pop();
        if(vis[i]){
            continue;
        }
        vis[i]=1;
        for(auto[j,c]:adj[i]){
            if(d[i]+c<d[j]){
                d[j]=d[i]+c;
                pq.push({-d[j],j});
            }
        }
    }
    return d;
}

int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n>>m>>s>>t>>u>>v;
    adj.resize(n+1);
    for(int i=0;i<m;i++){
        ll a,b,c;
        cin>>a>>b>>c;
        adj[a].pub({b,c});
        adj[b].pub({a,c});
    }

    vl du=dij(u);
    vl dv=dij(v);
    vl ds=dij(s);
    vl dt=dij(t);
    vb b(n+1);
    for(int i=1;i<=n;i++){
        b[i]=(ds[i]+dt[i]==ds[t]);
    }
    vll dp(n+1,{C*M,C*M});
    dp[s]={du[s],dv[s]};
    priority_queue<pll>pq;
    pq.push({0,s});
    vb vis(n+1);
    ll res=M*C;
    while(!pq.empty()){
        int i=pq.top()[1];
        pq.pop();
        if(vis[i]){
            continue;
        }
        vis[i]=1;
        for(auto[j,c]:adj[i]){
            if(ds[j]>ds[i]&&b[j]){
                pq.push({-ds[j],j});
                remin(dp[j][0],dp[i][0],du[j]);
                remin(dp[j][1],dp[i][1],dv[j]);
                remin(res,dp[j][0]+dv[j],dp[j][1]+du[j]);
            }
        }
    }
    cout<<min(res,du[v]);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...