제출 #445143

#제출 시각아이디문제언어결과실행 시간메모리
445143ak2006Commuter Pass (JOI18_commuter_pass)C++14
100 / 100
910 ms46136 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vb = vector<bool>;
using vvb = vector<vb>;
using vi = vector<int>;
using vvi = vector<vi>;
using vl = vector<ll>;
using vvl = vector<vl>;
using vvvl = vector<vvl>;
const ll mod = 1e9 + 7,inf = 1e18;
#define pb push_back
#define fast ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
void setIO()
{
    fast;
}
int n = 1e5 + 5,m = 2e5 + 5,S,T,U,V;
vvvl adj(n);
vl distU(n,inf),distV(n,inf),distS(n,inf),distT(n,inf);
vvl dp(n,vl(2,inf));
int main()
{
    setIO();
    cin>>n>>m>>S>>T>>U>>V;
    while (m--){
        int u,v,w;
        cin>>u>>v>>w;
        adj[u].pb({v,w}),adj[v].pb({u,w});
    }
    priority_queue<pair<ll,int>>pq;
    distU[U] = 0;
    distV[V] = 0;
    distS[S] = 0;
    distT[T] = 0;

    pq.push({0,V});
    while (!pq.empty()){
        int cur = pq.top().second;
        if (distV[cur] != -pq.top().first){pq.pop();continue;}
        pq.pop();
        for (auto val:adj[cur]){
            int x = val[0];
            ll wt = val[1];
            if (distV[x] > distV[cur] + wt){
                distV[x] = distV[cur] + wt;
                pq.push({-distV[x],x});
            }
        }
    }

    pq.push({0,U});
    while (!pq.empty()){
        int cur = pq.top().second;
        if (distU[cur] != -pq.top().first){pq.pop();continue;}
        pq.pop();
        for (auto val:adj[cur]){
            int x = val[0];
            ll wt = val[1];
            if (distU[x] > distU[cur] + wt){
                distU[x] = distU[cur] + wt;
                pq.push({-distU[x],x});
            }
        }
    }

    pq.push({0,S});
    while (!pq.empty()){
        int cur = pq.top().second;
        if (distS[cur] != -pq.top().first){pq.pop();continue;}
        pq.pop();
        for (auto val:adj[cur]){
            int x = val[0];
            ll wt = val[1];
            if (distS[x] > distS[cur] + wt){
                distS[x] = distS[cur] + wt;
                pq.push({-distS[x],x});
            }
        }
    }

    pq.push({0,T});
    while (!pq.empty()){
        int cur = pq.top().second;
        if (distT[cur] != -pq.top().first){pq.pop();continue;}
        pq.pop();
        for (auto val:adj[cur]){
            int x = val[0];
            ll wt = val[1];
            if (distT[x] > distT[cur] + wt){
                distT[x] = distT[cur] + wt;
                pq.push({-distT[x],x});
            }
        }
    }

    vvl all;
    
    for (int i = 1;i<=n;i++)
        if (distS[i] + distT[i] == distS[T])all.pb({distS[i],i});
    sort(all.begin(),all.end());
    
    ll ans = distU[V];
    
    for (auto val:all){
        int x = val[1];
        dp[x][0] = min(dp[x][0],distU[x]);
        dp[x][1] = min(dp[x][1],distV[x]);
        for (auto val:adj[x]){
            int y = val[0];
            dp[y][0] = min(dp[y][0],dp[x][0]);
            dp[y][1] = min(dp[y][1],dp[x][1]);
        }
        ans = min(ans,dp[x][0] + distV[x]);
        ans = min(ans,dp[x][1] + distU[x]);
    }

    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...