제출 #1226957

#제출 시각아이디문제언어결과실행 시간메모리
1226957MalixCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
256 ms25196 KiB
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vii;
typedef pair<int,int> pi;
typedef vector<pi> pii;
typedef tuple<int,int,int> ti;
typedef vector<ll> li;
typedef vector<li> lii;
 
#define REP(i,a,b) for(int i=a;i<b;i++)
#define F first
#define S second
#define PB push_back
#define LSOne(s) ((s)&(-s))
#define all(x) (x).begin(),(x).end()
 
ll INF=1000000000000000010;
int inf=1e9+10;
ll M=1e9+7;

vector<vector<pair<int,ll>>> a;
vii p;
int n,m,S,T,U,V;

void djisktra(int s,vector<ll> &dist,vii &p){
    priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>> pq;
    pq.push({0,s});
    dist[s]=0;
    p.clear();p.resize(n);
    while(!pq.empty()){
        ll x=pq.top().F;
        int y=pq.top().S;
        pq.pop();
        if(dist[y]>x)continue;
        for(auto [u,v]:a[y]){
            if(dist[u]==dist[y]+v)p[u].PB(y);
            if(dist[u]>dist[y]+v){
                p[u].clear();
                dist[u]=dist[y]+v;
                p[u].PB(y);
                pq.push({dist[u],u});
            }
        }
    }
}

ll solve(int x,vector<ll> &dp,vector<ll> &dist){
    if(dp[x]!=INF)return dp[x];
    dp[x]=dist[x];
    for(auto u:p[x])dp[x]=min(dp[x],solve(u,dp,dist));
    return dp[x];
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
   cin>>n>>m>>S>>T>>U>>V;
    S--;T--;U--;V--;
    a.resize(n);
    REP(i,0,m){
        int x,y;cin>>x>>y;
        x--;y--;
        ll z;cin>>z;
        a[x].PB({y,z});
        a[y].PB({x,z});
    }
    vector<ll> distU(n,INF),distV(n,INF),dist(n,INF);
    djisktra(U,distU,p);
    djisktra(V,distV,p);
    djisktra(S,dist,p);
    vector<ll> dpU(n,INF),dpV(n,INF);
    solve(T,dpU,distU);
    solve(T,dpV,distV);
    ll ans=distU[V];
    REP(i,0,n){
        ans=min(ans,distU[i]+dpV[i]);
        ans=min(ans,distV[i]+dpU[i]);
    }
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...