Submission #1245595

#TimeUsernameProblemLanguageResultExecution timeMemory
1245595corvusValley (BOI19_valley)C++20
36 / 100
3093 ms21996 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define ll long long
#define all(x) (x).begin(), (x).end()

const int N = 2e5 + 100 , LOG = 20;

vector <vector <pair <int , int>>> edj;
map <pair <int , int> , int> idx;
vector <bool> vis;
bool ok = 1 , ok2 = 0;
int target ;
void dfs(int node , int nx) {
    if(vis[node] || ok2) return; vis[node] = 1;
    if(target == node) ok2 = 1;
    for(auto [w , to] : edj[node]) {
        int k = idx[{node , to}];
        if(k == nx) continue;
        // cout << k << ' ' << nx << '\n';
        dfs(to , nx);
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n , s , Q , e ; cin >> n >> s >> Q >> e; target = e;
    edj = vector <vector <pair <int , int>>> (n + 1);
    vector <tuple <int , int , int>> vec(n - 1);
    vis = vector <bool>(n + 1, false);
    for(int i = 0 ; i < n - 1 ; i ++) {
        int u , v , w;  cin >> u >> v >> w;
        vec[i] = {u , v , w};
        idx[{u , v}] = idx[{v , u}] = i + 1;
        edj[u].pb({w , v});
        edj[v].pb({w , u});
    }
    vector <int> shops(s);
    for(int i = 0 ; i < s ; i ++) {
        cin >> shops[i];
    }
    // for(int i = 1 ; i <= n ; i ++) cout << dist[i] << ' ';cout << '\n';
    while( Q-- ) {
        int l , r ; cin >> l >> r; ok = 1; ok2 = 0;
        fill(all(vis) , 0);
        dfs(r , l);
        if(ok2) {
            cout << "escaped\n"; continue;
        }

        queue <int> q;
        vector <ll> dist(n + 1 , (ll) 1e18);
        for(int i = 0 ; i < s ; i ++) {
            q.push(shops[i]);
            dist[shops[i]] = 0;
        }
        while(q.size()) {
            int u = q.front(); q.pop();
            for(auto [w , to] : edj[u]) {
                int k = idx[{u , to}];
                if(k == l) continue;
                // cout << 
                if(dist[to] > dist[u] + w) {
                    dist[to] = dist[u] + w;
                    q.push(to);
                }
            }
        }
        // cout << dist[r] << '\n';
        if(dist[r] == (ll)1e18) cout << "oo\n";
        else cout << dist[r] << '\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...