Submission #1346861

#TimeUsernameProblemLanguageResultExecution timeMemory
1346861satoulogaritEvacuation plan (IZhO18_plan)C++20
41 / 100
4090 ms26944 KiB
//LongvnXD
#include <bits/stdc++.h>

#define ll long long 
#define pll pair<ll, ll>
#define ii pair<int, int>
#define fi first
#define se second
#define x first
#define y second
#define all(v) v.begin(), v.end()

const int N = 2e5 + 5;
const int oo = 1e9 + 9;

using namespace std;

int n, m, k, q, d[N];
vector<ii> g[N];

namespace task1234 {
    int par[20][N], Min[20][N], de[N];

    void dfs(int u,int p) {
        de[u] = de[p] + 1;
        par[0][u] = p;
        Min[0][u] = d[u];
        for(int i = 1; i < 20; ++i) {
            par[i][u] = par[i - 1][par[i - 1][u]];
            Min[i][u] = min(Min[i - 1][u], Min[i - 1][par[i - 1][u]]);
        }

        for(ii& temp : g[u]) {
            int v = temp.fi;
            if(v != p)
                dfs(v, u);
        }
    }

    int get(int u,int v) {
        int ok = oo;
        if(de[u] < de[v]) swap(u, v);
        for(int i = 19; i >= 0; --i) {
            if(de[u] - (1 << i) >= de[v]) {
                ok = min(ok, Min[i][u]);
                u = par[i][u];
            }
        }
        if(u == v) return min(ok, Min[0][u]);
        for(int i = 19; i >= 0; --i) {
            if(par[i][u] != par[i][v]) {
                ok = min({ok, Min[i][u], Min[i][v]});
                u = par[i][u];
                v = par[i][v];
            }
        }
        return min({ok, Min[1][u], Min[1][v]});
    }

    void solve() {
        for(int i = 0; i < 20; ++i) for(int j = 1; j <= n; ++j) Min[i][j] = oo;
        dfs(1, 0);
        cin >> q;
        int u, v;
        while(q--) {
            cin >> u >> v;
            cout << get(u, v) << '\n';
        }
    }
}

namespace task5 {
    int b[N];

    bool check(int s,int t,int x) {
        for(int i = 1; i <= n; ++i) b[i] = 0;
        queue<int> q;
        q.push(s);
        b[s] = 1;
        while(q.size()) {
            int u = q.front(); q.pop();
            for(ii& temp2 : g[u]) {
                int v = temp2.fi;
                if(d[v] >= x && !b[v])
                    q.push(v), b[v] = 1;
            }
        }
        return b[t];
    }

    void solve() {
        cin >> q;
        int u, v;
        while(q--) {
            cin >> u >> v;

            int l = 0, r = min(d[u], d[v]), mid;
            while(l <= r) {
                mid = l + r >> 1;
                if(check(u, v, mid))
                    l = mid + 1;
                else
                    r = mid - 1;
            }
            cout << l - 1 << '\n';
        }
    }
}

void solve() {
    if(m == n - 1) task1234::solve();
    else task5::solve();
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    
    cin >> n >> m;
    for(int i = 1, u, v, w; i <= m; ++i) {
        cin >> u >> v >> w;
        g[u].push_back({v, w});
        g[v].push_back({u, w});
    }
    cin >> k;
    
    for(int i = 1; i <= n; ++i) d[i] = oo;
    priority_queue<ii, vector<ii>, greater<ii>> q;
    for(int i = 1, x; i <= k; ++i) {
        cin >> x;
        d[x] = 0;
        q.push({0, x});
    }
    while(q.size()) {
        ii temp = q.top(); q.pop();
        int x = temp.fi;
        int u = temp.se;

        if(d[u] != x) continue;

        for(ii& temp2 : g[u]) {
            int v = temp2.fi, w = temp2.se;
            if(d[v] > x + w) {
                d[v] = x + w;
                q.push({x + w, v});
            }
        }
    }

    solve();

    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...