제출 #1368666

#제출 시각아이디문제언어결과실행 시간메모리
1368666temurbek1371Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
179 ms28416 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define vi vector<int>
#define vvi vector<vi>
#define pii pair<int,int>

const int INF = 4e18;

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n,m;
    cin>>n>>m;

    int S,T,U,V;
    cin>>S>>T;
    cin>>U>>V;

    --S; --T; --U; --V;

    vector<vector<array<int,2>>> g(n);
    vector<array<int,3>> edges;

    for(int i=0;i<m;i++){
        int a,b,w;
        cin>>a>>b>>w;
        --a; --b;

        g[a].push_back({b,w});
        g[b].push_back({a,w});

        edges.push_back({a,b,w});
    }

    auto dijkstra = [&](int src){

        vi dist(n,INF);

        priority_queue<pii,vector<pii>,greater<pii>> pq;

        dist[src]=0;
        pq.push({0,src});

        while(!pq.empty()){

            auto [d,v]=pq.top();
            pq.pop();

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

            for(auto [to,w]:g[v]){

                if(dist[to]>d+w){

                    dist[to]=d+w;
                    pq.push({dist[to],to});
                }
            }
        }

        return dist;
    };

    vi dS=dijkstra(S);
    vi dT=dijkstra(T);
    vi dU=dijkstra(U);
    vi dV=dijkstra(V);

    vector<vector<int>> dag(n);

    for(auto [a,b,w]:edges){

        if(dS[a]+w+dT[b]==dS[T]){

            dag[a].push_back(b);
        }

        if(dS[b]+w+dT[a]==dS[T]){

            dag[b].push_back(a);
        }
    }

    vi ord(n);
    iota(ord.begin(),ord.end(),0);

    sort(ord.begin(),ord.end(),[&](int a,int b){
        return dS[a]<dS[b];
    });

    vi mnU=dU;
    vi mnV=dV;

    reverse(ord.begin(),ord.end());

    for(int v:ord){

        for(int to:dag[v]){

            mnU[v]=min(mnU[v],mnU[to]);
            mnV[v]=min(mnV[v],mnV[to]);
        }
    }

    int ans=dU[V];

    for(int v=0;v<n;v++){

        ans=min(ans,dU[v]+mnV[v]);
        ans=min(ans,dV[v]+mnU[v]);
    }

    cout<<ans<<"\n";
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…