Submission #137059

#TimeUsernameProblemLanguageResultExecution timeMemory
137059meatrowEvacuation plan (IZhO18_plan)C++17
100 / 100
998 ms52048 KiB
//#pragma GCC optimize("O3")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,tune=native")
//#pragma GCC optimize ("unroll-loops")
#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using ld = long double;

const int N = 1e5 + 1;

int par[N];
set<int> lst[N];
int ans[N];
vector<pair<int, int>> g[N];

int get_root(int v) {
    return v == par[v] ? v : par[v] = get_root(par[v]);
}

void un(int v, int u, int kek) {
    v = get_root(v);
    u = get_root(u);
    if (lst[v].size() < lst[u].size()) {
        swap(v, u);
    }
    if (v != u) {
        par[u] = v;
        for (int x : lst[u]) {
            if (lst[v].count(x)) {
                ans[x] = kek;
                lst[v].erase(x);
            } else {
                lst[v].insert(x);
            }
        }
    }
}

int main() {
    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n, m;
    cin >> n >> m;
    iota(par, par + n + 1, 0);
    for (int i = 0; i < m; i++) {
        int v, u, w;
        cin >> v >> u >> w;
        g[v].emplace_back(u, w);
        g[u].emplace_back(v, w);
    }
    int k;
    cin >> k;
    for (int i = 0; i < k; i++) {
        int v;
        cin >> v;
        g[0].emplace_back(v, 0);
    }
    vector<int> dist(n + 1, INT32_MAX);
    dist[0] = 0;
    set<pair<int, int>> st;
    st.insert({ 0, 0 });
    while (!st.empty()) {
        auto p = *st.begin();
        st.erase(st.begin());
        int v = p.second;
        for (auto e : g[v]) {
            if (dist[v] + e.second < dist[e.first]) {
                st.erase({ dist[e.first], e.first });
                dist[e.first] = dist[v] + e.second;
                st.insert({ dist[e.first], e.first });
            }
        }
    }
    int Q;
    cin >> Q;
    for (int i = 0; i < Q; i++) {
        int s, t;
        cin >> s >> t;
        if (s != t) {
            lst[s].insert(i);
            lst[t].insert(i);
        } else {
            ans[i] = dist[s];
        }
    }
    vector<int> p(n);
    iota(p.begin(), p.end(), 1);
    sort(p.begin(), p.end(), [&](int a, int b) {
        return dist[a] > dist[b];
    });
    vector<int> used(n + 1);
    for (int i = 0; i < n; i++) {
        int v = p[i];
        used[v] = 1;
        for (auto e : g[v]) {
            if (used[e.first]) {
                un(v, e.first, dist[v]);
            }
        }
    }
    for (int i = 0; i < Q; i++) {
        cout << ans[i] << '\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...