제출 #545851

#제출 시각아이디문제언어결과실행 시간메모리
545851StickfishValley (BOI19_valley)C++17
36 / 100
3073 ms13696 KiB
#include <iostream>
#include <vector>
#include <bitset>
using namespace std;
using ll = long long;

const int MAXN = 1e5 + 123;
const ll INF = 1e18 + 177013;
const ll LESSINF = 1e14 + 177013;
vector<pair<int, ll>> edg[MAXN];
vector<pair<int, int>> qrs[MAXN];
bitset<MAXN> shop;
int tin[MAXN];
int tout[MAXN];
ll depth[MAXN];
vector<int> rtin;
int rt[MAXN];

void dfs(int v) {
    tin[v] = rtin.size();
    rtin.push_back(v);
    for (auto [u, w] : edg[v]) {
        if (u == rt[v])
            continue;
        rt[u] = v;
        depth[u] = depth[v] + w;
        dfs(u);
    }
    tout[v] = rtin.size();
}

int e;

ll ans_dfs(int v, int urest, int rt0, ll d) {
    if (v == e)
        return -1;
    ll ans = INF;
    if (shop[v])
        ans = d;
    for (auto [u, w] : edg[v]) {
        if (u == rt0 || (v == urest && rt[v] == u) || (u == urest && rt[u] == v))
            continue;
        ans = min(ans, ans_dfs(u, urest, v, d + w));
    }
    return ans;
}

signed main() {
    int n, s, q;
    cin >> n >> s >> q >> e;
    vector<pair<int, int>> roads(n - 1);
    --e;
    for (int i = 0; i < n - 1; ++i) {
        int u, v, w;
        cin >> u >> v >> w;
        --u, --v;
        edg[u].push_back({v, w});
        edg[v].push_back({u, w});
        roads[i] = {u, v};
    }
    for (int i = 0; i < s; ++i) {
        int c;
        cin >> c;
        shop[c - 1] = 1;
    }
    dfs(0);
    for (auto& [ru, rv] : roads) {
        if (rt[rv] == ru)
            swap(rv, ru);
    }
    for (int i = 0; i < q; ++i) {
        int ri, v;
        cin >> ri >> v;
        --ri, --v;
        int u = roads[ri].first;
        ll ans = ans_dfs(v, u, -1, 0);
        if (ans == -1) {
            cout << "escaped\n";
        } else if (ans > LESSINF) {
            cout << "oo\n";
        } else {
            cout << ans << '\n';
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...