Submission #94218

#TimeUsernameProblemLanguageResultExecution timeMemory
942184llowerEvacuation plan (IZhO18_plan)C++14
0 / 100
887 ms110232 KiB
#include <bits/stdc++.h>

#define rust(a, b, c, d) sqrt(sqr(a - c) + sqr(b - d))
#define sqr(a) (a)*(a)
#define m_p make_pair
#define fi first
#define se second
#define fast_io ios_base::sync_with_stdio(0);cin.tie(0);
#define endl "\n"
#define pll pair <ll,ll>
#define next stopplz
#define y1 STOPPLZ

typedef long long ll;

const int MAXINT=2147483640;
const ll MAXLL=9223372036854775800LL;
const ll MAXN = 1e6;
const double eps = 1e-9;
const ll mod = 1e9 + 7;

using namespace std;
ll dsu[MAXN], tin[MAXN], tout[MAXN], p[100020][22], ans[100200][22], n, m, b[MAXN], stn, v1[MAXN], v2[MAXN];
vector <pll> v[MAXN];
ll get(ll x){
    if (dsu[x] != x) dsu[x] = get(dsu[x]);
    return dsu[x];
}
void dfs(ll x, ll pred){
    p[x][0] = pred;
    ans[x][0] = b[pred];
    tin[x] = ++stn;
    for (int i = 1; i <= 20; ++i) {
            p[x][i] = max(1ll, p[p[x][i - 1]][i - 1]);
            ans[x][i] = min(ans[x][i - 1], ans[p[x][i - 1]][i - 1]);
    }
    for (auto i : v[x]) if (i.fi != pred) dfs(i.fi, x);
    tout[x] = ++stn;
}

bool lower(ll x, ll y){
    if (tin[x] <= tin[y] && tout[y] <= tout[x]) return 1;
    else return 0;
}

ll lca(ll x, ll y){
    if (lower(x, y)) return 1e18;
    ll val = 1e18;
    for (int i = 20; i >= 0; i--) if (!lower(p[x][i], y)) {
            val = min(val, ans[x][i]);
            x = p[x][i];
    }
    val = min(val, ans[p[x][0]][0]);
    return val;
}

int main() {
    srand(time(0));
//    freopen("input.txt","r",stdin);
//    freopen("output.txt","w",stdout);
    fast_io;
    cin >> n >> m;
    for (int i = 0; i <= n; ++i) dsu[i] = i, b[i] = 1e18;
    vector <pair <ll, pll> > vans;
    for (int i = 1; i <= m; ++i){
        ll val;
        cin >> v1[i] >> v2[i] >> val;
        v[v1[i]].push_back(m_p(v2[i], val));
        v[v2[i]].push_back(m_p(v1[i], val));
    }

    ll k;
    cin >> k;
    set <pll> s;
    for (int i = 1; i <= k; ++i) {
        ll x;
        cin >> x;
        s.insert(m_p(0, x));
        b[x] = 0;
    }

    while (!s.empty()){
        ll x = s.begin() -> se, val = s.begin() -> fi;
        s.erase(s.begin());
        for (auto i : v[x]) if (val + i.se < b[i.fi]){
            s.erase(m_p(b[i.fi], i.fi));
            b[i.fi] = i.se + val;
            s.insert(m_p(b[i.fi], i.fi));
        }
    }

    for (int i = 1; i <= n; ++i) v[i].clear();
    for (int i = 1; i <= m; ++i) vans.push_back(m_p(min(b[v1[i]], b[v2[i]]), m_p(v1[i], v2[i])));
    sort(vans.begin(), vans.end());
    reverse(vans.begin(), vans.end());
    for (auto i : vans) if (get(i.se.se) != get(i.se.fi)){
        dsu[get(i.se.se)] = get(i.se.fi);
        v[i.se.se].push_back(m_p(i.se.fi, 0));
        v[i.se.fi].push_back(m_p(i.se.se, 0));
    }

    dfs(1, 0);

    ll kek;
    cin >> kek;
    for (int i = 1; i <= kek; ++i){
        ll l, r;
        cin >> l >> r;
        ll mn = lca(l, r);
        mn = min(lca(r, l), mn);
        mn = min(b[l], mn);
        mn = min(b[r], mn);
        cout << mn << endl;
    }

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