제출 #1134277

#제출 시각아이디문제언어결과실행 시간메모리
1134277awesomemathsCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
274 ms23172 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 200005
ll n, m, s, t, u, v; 
vector<pair<ll, ll>> adj[MAXN];
void dijkstra(ll start, vector<ll> &dist)
{
    dist[start] = 0;
    vector<bool> visited(n + 1);
    using T = pair<long long, int>;
    priority_queue<T, vector<T>, greater<T>> pq;
    pq.push({0, start});
    while(!pq.empty()){
        const auto[cdist, node] = pq.top();
        pq.pop();
        if(visited[node]) continue;
        visited[node] = true;
        for(const pair<ll, ll> &i: adj[node]){
            if(cdist + i.second < dist[i.first]){
                pq.push({dist[i.first] = cdist + i.second, i.first});
            }
        }
    }

}
vector<ll> dijkstra2(ll start, vector<ll> &dist, vector<ll> &cost)
{
    dist[start] = 0;
    vector<ll> min_cost(n + 1, LLONG_MAX);
    vector<bool> visited(n + 1);
    using T = pair<long long, int>;
    priority_queue<T, vector<T>, greater<T>> pq;
    pq.push({0, start}); min_cost[start] = cost[start];
    while(!pq.empty()){
        const auto[cdist, node] = pq.top();
        pq.pop();
        if(visited[node]) continue;
        visited[node] = true;
        for(const pair<ll, ll> &i: adj[node]){
            if(cdist + i.second < dist[i.first]){
                min_cost[i.first] = min(cost[i.first], min_cost[node]);
                pq.push({dist[i.first] = cdist + i.second, i.first});
            }
            else if(cdist + i.second == dist[i.first]){
                min_cost[i.first] = min(cost[i.first], min(min_cost[i.first], min_cost[node]));
            }
        }
    }
    return min_cost;

}
int main()
{
    cin >> n >> m >> u >> v >> s >> t;
    for(int i = 0; i < m; i++){
        ll a, b, c; cin >> a >> b >> c;
        adj[a].push_back({b, c});
        adj[b].push_back({a, c});
    }
    vector<ll> tdist(n + 1, LLONG_MAX);
    dijkstra(t, tdist);
    // for(int i = 1; i <= n; i++){
    //     cout << tdist[i] << " ";
    // }
    // cout << "\n";
    vector<ll> sdist(n + 1, LLONG_MAX);
    dijkstra(s, sdist);
    vector<ll> vdist(n + 1, LLONG_MAX);
    vector<ll> udist(n + 1, LLONG_MAX);
    vector<ll> cost1 = dijkstra2(v, vdist, tdist);
    vector<ll> cost2 = dijkstra2(u, udist, tdist);
    ll res = sdist[t];
    for(int i = 1; i <= n; i++){
        //cout << vdist[i] << " " << udist[i] << " " << vdist[u] << "\n";
        if(vdist[i] + udist[i] == vdist[u]){
            res = min(res, sdist[i] + min(cost1[i], cost2[i]));
        }
    }
    cout << res << "\n";
}           
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...