제출 #1336856

#제출 시각아이디문제언어결과실행 시간메모리
1336856HossamHero7Commuter Pass (JOI18_commuter_pass)C++20
100 / 100
363 ms41112 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
const int N = 2e5 + 5;
vector<pair<int,ll>> adj[N];
int n;
vector<ll> dijk(int src){
    vector<ll> dis(n+1,1e18);
    priority_queue<pair<ll,ll>,vector<pair<ll,ll>>,greater<>> q;
    q.push({0,src});
    dis[src] = 0;
    while(q.size()){
        auto [cost,node] = q.top();         q.pop();
        if(cost > dis[node]) continue;
        for(auto [ch,c] : adj[node]){
            if(cost + c >= dis[ch]) continue;
            dis[ch] = cost + c;
            q.push({cost+c,ch});
        }
    }
    return dis;
}
void solve(){
    int m;
    int s,t,u,v;
    cin>>n>>m>>s>>t>>u>>v;
    for(int i=0;i<m;i++){
        int a,b,c;
        cin>>a>>b>>c;
        adj[a].push_back({b,c});
        adj[b].push_back({a,c});
    }
    vector<ll> d1 = dijk(u);
    vector<ll> d2 = dijk(v);
    priority_queue<array<ll,4>,vector<array<ll,4>>,greater<>> q;
    vector<vector<pair<ll,ll>>> dis(n+1,vector<pair<ll,ll>>(4,{1e18,1e18}));
    q.push({0,0,s,3});
    dis[s][3] = {0,0};
    while(q.size()){
        auto [c1,c2,node,tp] = q.top();         q.pop();
        if(make_pair(c1,c2) > dis[node][tp]) continue;
        for(auto [ch,c] : adj[node]){
            if(make_pair(c1+c,c2) >= dis[ch][tp]) continue;
            q.push({c1+c,c2,ch,tp});
            dis[ch][tp] = {c1+c,c2};
        }
        if(tp&1){
            if(make_pair(c1,c2+d1[node]) < dis[node][tp^1]){
                q.push({c1,c2+d1[node],node,tp^1});
                dis[node][tp^1] = {c1,c2+d1[node]};
            }
        }
        if(tp&2){
            if(make_pair(c1,c2+d2[node]) < dis[node][tp^2]){
                q.push({c1,c2+d2[node],node,tp^2});
                dis[node][tp^2] = {c1,c2+d2[node]};
            }
        }
    }
    cout<<min(d1[v],dis[t][0].second)<<endl;
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);      cout.tie(0);
    int t=1;
    //cin>>t;
    while(t--){
        solve();
    }
    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...