Submission #1326832

#TimeUsernameProblemLanguageResultExecution timeMemory
1326832husseinjuandaEvacuation plan (IZhO18_plan)C++20
0 / 100
144 ms25808 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long 

vector<int> ans;
vector<int> par;
vector<vector<int>> isi;
vector<vector<pair<int, int>>> que;

int fpar(int k){
    if(par[k] == k) return k;
    par[k] = fpar(par[k]);
    return par[k];
}

int cursz = 0;

void merge(int k, int f){
    k = fpar(k);
    f = fpar(f);
    //k itu yg lebih kecil sizenya
    if(isi[k].size() > isi[f].size()){
        swap(k, f);
    }
    for(auto y : isi[k]){
        for(auto j : que[y]){
            int fp = fpar(j.first);
            if(fp == f){
                ans[j.second] = max(ans[j.second], cursz);
            }
        }
        isi[f].push_back(y);
    }
    par[k] = f;
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, m; cin >> n >> m;
    isi.resize(n+1);
    par.resize(n+1);
    for(int i = 1; i <= n; i++){
        par[i] = i;
        isi[i] = {i};
    }
    vector<vector<pair<int, int>>> g(n+1);
    for(int i = 0; i < m; i++){
        int a, b, w; cin >> a >> b >> w;
        g[a].push_back({b, w});
        g[b].push_back({a, w});
    }
    int c; cin >> c;
    multiset<pair<int, int>> s;
    vector<bool> d(n+1);
    vector<int> dis(n+1, 1e18);
    for(int i = 0; i < c; i++){
        int h; cin >> h;
        s.insert({0, h});
        dis[h] = 0;
    }
    while(s.size() > 0){
        auto [time, k] = *s.begin();
        s.erase(s.begin());
        if(d[k]) continue;
        d[k] = true;
        for(auto[a, b] : g[k]){
            if(d[a]) continue;
            if(dis[a] > time + b){
                dis[a] = time+b;
                s.insert({dis[a], a});
            }
        }
    }
    // cout << "CHECK" << endl;
    // for(int y = 1; y <= n; y++){
    //     cout << dis[y] << endl;
    // }
    vector<int> srt = dis;
    sort(srt.begin(), srt.end());
    srt.erase(unique(srt.begin(), srt.end()), srt.end());
    reverse(srt.begin(), srt.end());
    map<int, vector<int>> mp;
    for(int i = 1; i <= n; i++){
        mp[dis[i]].push_back(i);
    }
    int q; cin >> q;
    que.resize(n+1);
    for(int i = 0; i < q; i++){
        int a, b; cin >> a >> b;
        que[a].push_back({b, i});
        que[b].push_back({a, i});
    }
    ans.resize(q);
    for(auto i : srt){
        cursz = i;
        for(auto y : mp[i]){
            for(int z = 0; z < g[y].size(); z++){
                if(dis[g[y][z].first] >= cursz){
                    merge(g[y][z].first, y);
                }
            }
        }
    }
    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...