제출 #1345528

#제출 시각아이디문제언어결과실행 시간메모리
1345528vjudge1Commuter Pass (JOI18_commuter_pass)C++20
15 / 100
325 ms45836 KiB
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef vector<ll> vll;
typedef vector<int> vi;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
const ll oo = 1e18+7, maxN = 1e5+5;
#define x first
#define y second

vector<vector<pll>> adj;

void dijkstra(int s, vll &d, vll &p) {
    int n = adj.size();
    
    d.assign(n, oo);
    p.assign(n, -1);
    
    priority_queue<pll, vector<pll>, greater<pll>> pq;
    
    d[s] = 0;
    pq.push({0, s});   // {distance, node}

    while (!pq.empty()) {
        auto [dist, v] = pq.top();
        pq.pop();

        if (dist != d[v]) continue; // skip outdated state

        for (auto [to, len] : adj[v]) {
            if (d[v] + len < d[to]) {
                d[to] = d[v] + len;
                p[to] = v;
                pq.push({d[to], to});
            }
        }
    }
}

void solve() {
    int n, m; cin >> n >> m;
    int s, t; cin >> s >> t; s--, t--;
    int u, v; cin >> u >> v; u--, v--;

    adj.assign(n, {});
    map<pll, ll> m_w;
    while (m--) {
        ll a, b, c; cin >> a >> b >> c;
        adj[--a].push_back({--b, c});
        adj[b].push_back({a, c});
        m_w[{a,b}] = c;
        m_w[{b,a}] = c;
    }

    vll d_s, p_s;
    dijkstra(s, d_s, p_s);
    vi route;
    int curr = t;
    do {
        route.push_back(curr);
        curr = p_s[curr];
    } while (curr != -1);

    vll d_u, p_u, d_v, p_v;
    dijkstra(u, d_u, p_u);
    dijkstra(v, d_v, p_v);


    ll ans = d_u[v];
    // cout << ans << '\n';

    ll mn = oo, U, V;
    for (auto &i: route) 
        if (mn > d_u[i]) {
            mn = d_u[i];
            U = i;
        }
    mn = oo;
    for (auto &i: route) 
        if (mn > d_v[i]) {
            mn = d_v[i];
            V = i;
        }

    vi u_route, v_route;
    curr = U;
    do {
        u_route.push_back(curr);
        curr = p_u[curr];
    } while (curr != -1);
    curr = V;
    do {
        v_route.push_back(curr);
        curr = p_v[curr];
    } while (curr != -1);

    vector<pii> edges;
    for (int i=0; i<u_route.size()-1; i++)
        edges.push_back({u_route[i], u_route[i+1]});

    for (int i=0; i<v_route.size()-1; i++)
        edges.push_back({v_route[i], v_route[i+1]});

    // sort(edges.begin(), edges.end());
    // edges.erase(unique(edges.begin(), edges.end()), edges.end());

    ll ans2 = 0;
    for (auto &i: edges) ans2 += m_w[i];
    // for (auto &i: edges) cout << i.x+1 << '-' << i.y+1 << ' ';
    // cout << '\n';
    cout << min(ans, ans2);
}
 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    // cin >> t;
    while (t--) solve(), cout << '\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...