Submission #1332858

#TimeUsernameProblemLanguageResultExecution timeMemory
1332858piolkCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
188 ms25184 KiB
#include <bits/stdc++.h>
using namespace std;

constexpr int maxn=1e5 + 5;
constexpr long long inf=2e18;
vector<pair<int,int>> g[maxn];
vector<pair<int,int>> dag[maxn];

int n,m,S,T,U,V;

long long odls[maxn],odlt[maxn],odlu[maxn],odlv[maxn],closestu[maxn],closestv[maxn];
int indeg[maxn];
vector<int> in[maxn];


void dijk(int start,long long *tab){
    priority_queue<pair<long long,int>,vector<pair<long long,int>>,greater<>> pq;
    pq.push({0,start});

    tab[start]=0;

    while (!pq.empty()){
        auto [dist,v]=pq.top();
        pq.pop();

        if (dist!=tab[v]) continue;

        for (auto [u,w]:g[v]){
            if (dist+w >= tab[u]) continue;
            tab[u]=dist+w;
            pq.push({tab[u],u});
        }
    }
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin>>n>>m;

    for (int i=1;i<=n;i++){
        odls[i]=inf;
        odlu[i]=inf;
        odlv[i]=inf;
        odlt[i]=inf;
        closestu[i]=inf;
        closestv[i]=inf;
    }

    cin>>S>>T>>U>>V;

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

    dijk(S,odls);
    dijk(T,odlt);
    dijk(U,odlu);
    dijk(V,odlv);

    for (int i=1;i<=n;i++){
        for (auto [u,w]:g[i]){
            if (odls[i]+w+odlt[u]==odls[T]){
                dag[i].push_back({u,w});
                in[u].push_back(i);
                indeg[u]++;
            }
        }
    }

    queue<int> q;
    for (int i=1;i<=n;i++){
        if (indeg[i]==0) q.push(i);
    }

    long long ans=inf;

    while (!q.empty()){
        int v=q.front();
        q.pop();

        closestu[v]=odlu[v];
        closestv[v]=odlv[v];

        for (int u:in[v]){
            closestu[v]=min(closestu[v],closestu[u]);
            closestv[v]=min(closestv[v],closestv[u]);
        }

        ans=min({ans , closestu[v]+odlv[v] , closestv[v]+odlu[v]});

        for (auto [u,w]:dag[v]){
            indeg[u]--;
            if (indeg[u]==0) q.push(u);
        }
    }

    cout<<ans<<"\n";

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...