6245 2023. 11. 08 13:44:06 Error42 Nagysebességű vasút cpp17 Elfogadva 100/100 463ms 126964 KiB
#include <array>
#include <climits>
#include <iostream>
#include <optional>
#include <queue>
#include <set>
#include <tuple>
#include <vector>

using namespace std;

using ll = long long;

ll const INF = LLONG_MAX / 3;

pair<vector<int>, vector<ll>> dijkstra(
    vector<vector<pair<int, ll>>> const& graph,
    int const start
) {
    vector<ll> dist(graph.size(), INF);
    vector<int> from(graph.size(), -1);
    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq;

    dist[start] = 0;
    pq.push({ 0, start });

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

        if (cur_dist != dist[cur])
            continue;

        for (auto const& [neigh, w] : graph[cur]) {
            ll const new_dist = cur_dist + w;

            if (new_dist >= dist[neigh])
                continue;

            dist[neigh] = new_dist;
            from[neigh] = cur;
            pq.push({ new_dist, neigh });
        }
    }

    return { from, dist };
}

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

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

    vector<vector<pair<int, ll>>> graph(n);
    vector<tuple<int, int, ll>> edges(m);

    for (auto& [u, v, w] : edges) {
        cin >> u >> v >> w;
        
        graph[u].push_back({ v, w });
        graph[v].push_back({ u, w });
    }

    auto const [shortest_from, shortest_dist] = dijkstra(graph, 0);
    ll const base_dist = shortest_dist[n - 1];

    vector<bool> bad_cities(n, false);
    {
        int cur = n - 1;
        bad_cities[cur] = true;;

        while (shortest_from[cur] != -1) {
            cur = shortest_from[cur];
            bad_cities[cur] = true;
        }
    }

    auto const [_a, dist_a] = dijkstra(graph, 0);
    auto const [_b, dist_b] = dijkstra(graph, n - 1);

    ll ans = INF;

    for (auto const& [u, v, w] : edges) {
        if (bad_cities[u] && bad_cities[v])
            continue;

        for (auto const& [x, y] : vector<pair<int, int>>{ { u, v }, { v, u } }) {
            ll new_w = base_dist - 1 - dist_a[x] - dist_b[y];

            if (new_w < 1)
                continue;

            ll const cost = w - new_w;

            ans = min(ans, cost);
        }
    }

    if (ans == INF)
        cout << "-1\n";
    else
        cout << ans << "\n";
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 1828 KiB
2 Elfogadva 3ms 2020 KiB
subtask2 35/35
3 Elfogadva 4ms 2728 KiB
4 Elfogadva 4ms 2984 KiB
5 Elfogadva 4ms 2852 KiB
6 Elfogadva 4ms 3052 KiB
7 Elfogadva 4ms 3276 KiB
8 Elfogadva 4ms 3520 KiB
subtask3 30/30
9 Elfogadva 104ms 32184 KiB
10 Elfogadva 108ms 33648 KiB
11 Elfogadva 104ms 35156 KiB
12 Elfogadva 105ms 36716 KiB
13 Elfogadva 108ms 38532 KiB
14 Elfogadva 112ms 40240 KiB
subtask4 35/35
15 Elfogadva 432ms 77560 KiB
16 Elfogadva 389ms 83984 KiB
17 Elfogadva 435ms 90336 KiB
18 Elfogadva 430ms 96736 KiB
19 Elfogadva 458ms 103584 KiB
20 Elfogadva 409ms 109388 KiB
21 Elfogadva 463ms 115304 KiB
22 Elfogadva 456ms 121280 KiB
23 Elfogadva 456ms 126964 KiB
24 Elfogadva 184ms 107848 KiB
25 Elfogadva 112ms 99664 KiB
26 Elfogadva 112ms 101084 KiB
27 Elfogadva 104ms 102620 KiB