Submission #1351210

#TimeUsernameProblemLanguageResultExecution timeMemory
1351210IwantbemasterEvacuation plan (IZhO18_plan)C++20
41 / 100
4094 ms19608 KiB
#include <bits/stdc++.h>
using namespace std;

const int INF = 1e9;

int n, m, k, Q;
vector<pair<int, int>> adj[100005];
int dist_npp[100005];
vector<int> npps;

void dijkstra_multi_source() {
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    fill(dist_npp, dist_npp + n + 1, INF);

    for (int npp : npps) {
        dist_npp[npp] = 0;
        pq.push({0, npp});
    }

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

        if (d > dist_npp[u]) continue;

        for (auto [v, w] : adj[u]) {
            if (dist_npp[u] + w < dist_npp[v]) {
                dist_npp[v] = dist_npp[u] + w;
                pq.push({dist_npp[v], v});
            }
        }
    }
}

bool can_reach(int s, int t, int min_danger) {
    if (dist_npp[s] < min_danger || dist_npp[t] < min_danger) return false;

    vector<int> dist(n + 1, INF);
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;

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

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

        if (u == t) return true;
        if (d > dist[u]) continue;

        for (auto [v, w] : adj[u]) {
            if (dist_npp[v] >= min_danger && dist[u] + w < dist[v]) {
                dist[v] = dist[u] + w;
                pq.push({dist[v], v});
            }
        }
    }

    return false;
}

int solve(int s, int t) {
    int left = 0, right = INF, ans = 0;

    while (left <= right) {
        int mid = (left + right) / 2;
        if (can_reach(s, t, mid)) {
            ans = mid;
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }

    return ans;
}

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

    cin >> n >> m;

    for (int i = 0; i < m; i++) {
        int a, b, w;
        cin >> a >> b >> w;
        adj[a].push_back({b, w});
        adj[b].push_back({a, w});
    }

    cin >> k;
    npps.resize(k);
    for (int i = 0; i < k; i++) {
        cin >> npps[i];
    }

    dijkstra_multi_source();

    cin >> Q;
    for (int i = 0; i < Q; i++) {
        int s, t;
        cin >> s >> t;
        cout << solve(s, t) << "\n";
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...