제출 #1170267

#제출 시각아이디문제언어결과실행 시간메모리
1170267susanthenerdRelay Marathon (NOI20_relaymarathon)C++20
25 / 100
983 ms137020 KiB
#include <iostream>
#include <vector>
#include <tuple>
#include <queue>

using namespace std;
using ll = long long;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);


    int n, m, k;
    cin >> n >> m >> k;

    vector<vector<pair<int, ll> > > adj(n + 1);

    while (m--) {
        int u, v;
        ll c;
        cin >> u >> v >> c;
        adj[u].emplace_back(v, c);
        adj[v].emplace_back(u, c);
    }


    vector<bool> special(n + 1);
    for (ll i = 0; i < k; ++i) {
        int x;
        cin >> x;
        special[x] = true;
    }


    auto dijkstra_all = [&] {
        priority_queue<pair<ll, int> > pq;
        vector<ll> dist(n + 1, 1e18);
        vector<int> per(n + 1);
        for (int i = 1; i <= n; ++i) {
            if (special[i]) {
                pq.emplace(0, i);
                per[i] = i;
                dist[i] = 0;
            }
        }

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

            if (-d != dist[u])
                continue;
            for (auto &[v, c]: adj[u]) {
                if (dist[u] + c < dist[v]) {
                    per[v] = per[u];
                    dist[v] = dist[u] + c;
                    pq.emplace(-dist[v], v);
                }
            }
        }

        ll ans = 1e18;
        int a = 0, b = 0;
        for (int u = 1; u <= n; ++u) {
            for (auto &[v, c]: adj[u]) {
                if (per[u] != per[v] && dist[u] + dist[v] + c < ans) {
                    ans = dist[u] + dist[v] + c;
                    a = u;
                    b = v;
                }
            }
        }

        return tuple{ans, a, b};
    };

    auto dijkstra = [&](int x)-> pair<ll, int> {
        priority_queue<pair<ll, int> > pq;
        vector<ll> dist(n + 1, 1e18);
        dist[x] = 0;
        pq.emplace(0, x);

        while (!pq.empty()) {
            auto [d, u] = pq.top();
            pq.pop();
            if (special[u]) return {-d, u};
            if (dist[u] != d) continue;
            for (auto &[v, c]: adj[u]) {
                if (dist[u] + c < dist[v]) {
                    dist[v] = dist[u] + c;
                    pq.emplace(-dist[v], v);
                }
            }
        }

        return {1e18, 0};
    };

    ll ans = 1e18;

    auto [cost1, x, y] = dijkstra_all();
    special[x] = special[y] = false;
    ans = min(ans, cost1 + get<0>(dijkstra_all()));


    auto [cost2, a] = dijkstra(x);
    special[a] = false;
    ans = min(ans, cost2 + dijkstra(y).first);
    special[a] = true;


    auto [cost3, b] = dijkstra(y);
    special[b] = false;
    ans = min(ans, cost2 + dijkstra(x).first);

    cout << ans << '\n';
}

/*
5 4 4
1 2 1
3 4 2
4 5 5
5 3 8
3 1 5 2
*/

/*
6 6 4
1 2 5
2 4 7
4 6 50
6 5 3
1 5 15
3 5 6
1 5 4 6
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...