Submission #1345525

#TimeUsernameProblemLanguageResultExecution timeMemory
1345525vjudge1Commuter Pass (JOI18_commuter_pass)C++20
0 / 100
2096 ms39588 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);
    vector<bool> u(n, false);

    d[s] = 0;
    for (int i = 0; i < n; i++) {
        int v = -1;
        for (int j = 0; j < n; j++) {
            if (!u[j] && (v == -1 || d[j] < d[v]))
                v = j;
        }

        if (d[v] == oo)
            break;

        u[v] = true;
        for (auto edge : adj[v]) {
            int to = edge.first;
            int len = edge.second;

            if (d[v] + len < d[to]) {
                d[to] = d[v] + len;
                p[to] = v;
            }
        }
    }
}

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...