제출 #1361343

#제출 시각아이디문제언어결과실행 시간메모리
1361343BehruzbekXRelay Marathon (NOI20_relaymarathon)C++20
25 / 100
1166 ms208264 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

constexpr int inf = LONG_LONG_MAX;

tuple<int, int, int> solve (vector<vector<pair<int, int>>> a, vector<int> s, int n) {
    vector<pair<int, int>> dist(n, {inf, -1});
    int ans = inf, A = -1, B = -1;
    set<pair<int, int>> st;
    for (int i : s) dist[i] = {0, i}, st.emplace(0, i);
    while (st.size()) {
        auto [d_v, v] = *st.begin();
        st.erase(st.begin());
        for (auto [u, w] : a[v]) {
            int nx = d_v + w;
            if (nx < dist[u].first) {
                st.erase({dist[u].first, u});
                dist[u].first = nx, dist[u].second = dist[v].second;
                st.emplace(dist[u].first, u);
            }
        }
    }
    for (int i = 0; i < n; i++) {
        for (auto [j, w] : a[i]) {
            if (~dist[i].second && ~dist[j].second && dist[i].second != dist[j].second) {
                if (dist[i].first + dist[j].first + w < ans) ans = dist[i].first + dist[j].first + w, tie(A, B) = make_pair(dist[i].second, dist[j].second);
            }
        }
    }
    return {A, B, ans};
}

int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n, m, k, ANS = inf;
    cin >> n >> m >> k;
    vector<vector<pair<int, int>>> a(n), aa(n);
    for (int i = 0; i < m; i++) {
        int x, y, w;
        cin >> x >> y >> w, --x, --y;
        a[x].emplace_back(y, w);
        a[y].emplace_back(x, w);
    }
    vector<int> s(k);
    for (int &i: s) cin >> i, --i;
    auto [A, B, ans] = solve(a, s, n);
    s.erase(find(s.begin(), s.end(), A));
    s.erase(find(s.begin(), s.end(), B));
    auto [C, D, ans2] = solve(a, s, n);
    if (ans != inf && ans2 != inf) ANS = min(ANS, ans + ans2);
    // cout << ANS << '\n';
    // cout << A + 1 << ' ' << B + 1 << ' ' << C + 1 << ' ' << D + 1 << '\n';
    auto get = [&] (int st) {
        vector<int> dist(n, inf);
        dist[st] = 0;
        set<pair<int, int>> q;
        q.emplace(0, st);
        while (q.size()) {
            auto [d_v, v] = *q.begin();
            q.erase(q.begin());
            for (auto [u, w] : a[v]) {
                int nx = d_v + w;
                if (nx < dist[u]) {
                    q.erase({dist[u], u});
                    dist[u] = nx;
                    q.emplace(dist[u], u);
                }
            }
        }  
        return dist;
    };
    auto da = get(A);
    auto db = get(B);
    set<pair<int, int>> opt;
    for (int i = 0; i < n; i++) opt.emplace(da[i], i);
    opt.erase({da[B], B});
    opt.erase({da[A], A});
    for (int i = 0; i < n; i++) {
        if (i == B || i == A) continue;
        opt.erase({da[i], i});
        if (opt.size() && opt.begin()->first != inf && db[i] != inf) ANS = min(ANS, db[i] + opt.begin()->first);
        opt.emplace(da[i], i);
    }
    cout << ANS << '\n';
    return 0;                
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…