Submission #1315652

#TimeUsernameProblemLanguageResultExecution timeMemory
1315652mikrasCommuter Pass (JOI18_commuter_pass)C++20
31 / 100
535 ms60260 KiB
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
constexpr int MAXN=6e5+7;
ll INF=1e18;
vector<pair<int,ll>> graf[MAXN];
pair<pair<int,int>,ll> kraw[MAXN];
ll odl[MAXN];
ll odlA[MAXN];
ll odlB[MAXN];
bool odw[MAXN];
vector<pair<int,ll>> G[MAXN];
int n,m,A,B,C,D;
void wczytanie(){
    cin>>n>>m>>A>>B>>C>>D;
    int v,u;ll cena;
    for (int i=0;i<m;i++){
        cin>>v>>u>>cena;
        graf[u].push_back({v,cena});
        graf[v].push_back({u,cena});
        kraw[i]={{u,v},cena};
    }
}
void dijkstra_od_S(int S){
    for (int i=1;i<=n;i++) odl[i]=INF;
    for (int i=1;i<=n;i++) odw[i]=0;
    odl[S]=0;
    priority_queue<pair<ll,int>> q;
    q.push({0,S});
    int v;
    while (q.size()>0){
        v=q.top().second;q.pop();
        if (odw[v]) continue;
        odw[v]=1;
        for (pair<int,ll> u:graf[v]){
            if (odl[u.first]>odl[v]+u.second){
                odl[u.first]=odl[v]+u.second;
                q.push({-odl[u.first],u.first});
            }
        }
    }
}
void stworz_G(){
    int v,u;ll cena;
    ll OAB=odlA[B];
    for (int i=0;i<m;i++){
        v=kraw[i].first.first;u=kraw[i].first.second;cena=kraw[i].second;
        G[v].push_back({u,cena});
        G[u].push_back({v,cena});
        G[v+2*n].push_back({u+2*n,cena});
        G[u+2*n].push_back({v+2*n,cena});
        if (odlA[v]+cena+odlB[u]==OAB || odlB[v]+cena+odlA[u]==OAB){
            G[v+n].push_back({u+n,0});
            G[u+n].push_back({v+n,0});
        }
    }
    for (int i=1;i<=n;i++){
        G[i].push_back({i+n,0});
        G[i+n].push_back({i+2*n,0});
    }
}
ll solve(){
    for (int i=1;i<=3*n;i++) odl[i]=INF;
    for (int i=1;i<=3*n;i++) odw[i]=0;
    odl[C]=0;
    priority_queue<pair<ll,int>> q;
    q.push({0,C});
    int v;
    while (q.size()>0){
        v=q.top().second;q.pop();
        if (odw[v]) continue;
        odw[v]=1;
        for (pair<int,ll> u:G[v]){
            if (odl[u.first]>odl[v]+u.second){
                odl[u.first]=odl[v]+u.second;
                q.push({-odl[u.first],u.first});
            }
        }
    }
    return min(odl[D],min(odl[D+n],odl[D+2*n]));
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    wczytanie();
    dijkstra_od_S(A);
    for (int i=1;i<=n;i++) odlA[i]=odl[i];
    dijkstra_od_S(B);
    for (int i=1;i<=n;i++) odlB[i]=odl[i];
    stworz_G();
    cout<<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...