제출 #1336848

#제출 시각아이디문제언어결과실행 시간메모리
1336848HossamHero7Commuter Pass (JOI18_commuter_pass)C++20
0 / 100
1453 ms327680 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){
    assert(n<=1e5);
    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> d = dijk(v);
    priority_queue<array<ll,3>,vector<array<ll,3>>,greater<>> q;
    vector<pair<ll,ll>> dis(n+1,{1e18,1e18});
    dis[u] = {0,d[u]};
    q.push({0,d[u],u});
    while(q.size()){
        assert(q.size() <= 1e8);
        auto [cost,mn,node] = q.top();      q.pop();
        if(make_pair(cost,mn) > dis[node]) continue;
        for(auto [ch,c] : adj[node]){
            if(make_pair(cost+c,min(mn,d[ch])) > dis[ch]) continue;
            dis[ch] = {cost + c , min(mn,d[ch])};
            q.push({cost+c,min(mn,d[ch]),ch});
        }
    }
    cout<<dis[t].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...