제출 #1348755

#제출 시각아이디문제언어결과실행 시간메모리
1348755bananacookieCommuter Pass (JOI18_commuter_pass)C++17
15 / 100
184 ms16844 KiB
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'

using ll=long long;
using pli=pair<ll,int>;
const int N=1e5+5;
const ll INF=1e18;
vector<pair<int,ll>> adj[N];
ll dist[N],past[N],dist_U=INF,dist_V=INF;
bool sp[N];
int n,m,S,T,U,V;

int main(){
    ios::sync_with_stdio(false); cin.tie(0);
    
    cin>>n>>m>>S>>T>>U>>V;
    for(int i=0;i<m;i++){
        int u,v; ll w; cin>>u>>v>>w;
        adj[u].push_back({v,w});
        adj[v].push_back({u,w});
    }

    //dstra S->T
    for(int i=1;i<=n;i++){
        dist[i]=INF;
    }

    priority_queue<pli,vector<pli>,greater<pli>> pq;
    dist[S]=0; past[S]=-1; pq.push({dist[S],S});
    while(!pq.empty())
    {
        auto [d,u]=pq.top(); pq.pop();
        if(d!=dist[u]) continue;
        for(auto [v,w]:adj[u]){
            if(dist[u]+w<dist[v]){
                dist[v]=dist[u]+w;
                past[v]=u;
                pq.push({dist[v],v});
            }
        }
    }

    int cur=T;
    while(cur!=-1){
        sp[cur]=true;
        cur=past[cur];
    }

    //dstra from U
    for(int i=1;i<=n;i++){ dist[i]=INF; past[i]=0; }
    dist[U]=0; past[U]=-1; pq.push({dist[U],U});
    while(!pq.empty())
    {
        auto [d,u]=pq.top(); pq.pop();
        if(d!=dist[u]) continue;
        if(sp[u]){
            dist_U=min(dist_U,d);
            //continue;
        }

        for(auto [v,w]:adj[u]){
            if(dist[u]+w<dist[v]){
                dist[v]=dist[u]+w;
                past[v]=u;
                pq.push({dist[v],v});
            }
        }
    }

    cur=V; bool has_sp=false;
    while(cur!=-1){
        if(sp[cur]){
            has_sp=true; break;
        }

        cur=past[cur];
    }
    if(!has_sp) {cout<<dist[V]<<endl; return 0;}

    //dstra from V
    for(int i=1;i<=n;i++) dist[i]=INF;
    dist[V]=0;  pq.push({dist[V],V});
    while(!pq.empty())
    {
        auto [d,u]=pq.top(); pq.pop();
        if(d!=dist[u]) continue;
        if(sp[u]){
            dist_V=min(dist_V,d);
            //continue;
        }

        for(auto [v,w]:adj[u]){
            if(dist[u]+w<dist[v]){
                dist[v]=dist[u]+w;
                pq.push({dist[v],v});
            }
        }
    }

    cout<<dist_U+dist_V<<endl;
    //cout<<"has sp"<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...