제출 #1290080

#제출 시각아이디문제언어결과실행 시간메모리
1290080G_thang_dizz_lenhi관광 (NOI14_sightseeing)C++20
큐에 대기중
0 ms0 KiB
#include<bits/stdc++.h>
typedef int ii;
typedef long long ll;

using namespace std;

const string name = "TINHCLDD";
const ii MOD = 1e9 + 7;
const ii N = 5e5 + 10;
const ii INF = 1e9 + 237;

ii n, m, q;
vector<pair<ii, ii>> edge[N];
vector<pair<ii, ii>> e[N];
ii dp[N];

void INP(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    if (fopen((name + ".inp").c_str(),"r")){
        freopen((name + ".inp").c_str(),"r",stdin);
        freopen((name + ".out").c_str(),"w",stdout);
    }
    cin >> n >> m >> q;
    ii u, v, len;
    while(m--){
        cin >> u >> v >> len;
        edge[len].push_back({u, v});
    }
}

struct DSU{
    ii sz;vector<ii> par;

    void init(ii _sz){
        sz = _sz;
        par.resize(sz + 1);
        for (ii i = 1;i <= sz;i++) par[i] = i;
    }

    ii find_par(ii u){
        return (u == par[u] ? u : par[u] = find_par(par[u]));
    }

    bool connect(ii a,ii b){
        a = find_par(a);
        b = find_par(b);
        if (a == b) return false;
        par[a] = b;
        return true;
    }

} DSU;

void dfs(ii u, ii p){
    ii v, len;
    for(auto d : e[u]){
        tie(v, len) = d;
        if (v != p){
            dp[v] = min(dp[u], len);
            dfs(v, u);
        }
    }
}

int main(){
    INP();
    DSU.init(n);
    ii u, v, len;
    for (ii len = N - 1;len >= 0;len--)
    for (auto dir : edge[len]){
        tie(u, v) = dir;
        if (DSU.connect(u, v)){
            e[u].push_back({v, len});
            e[v].push_back({u, len});
//            cerr << u << " " << v << "\n";
        }
    }

    dp[1] = INF;
    dfs(1, 0);
    while(q--){
        cin >> u;
        cout << dp[u] << "\n";
    }
    cerr << 1000* clock() / CLOCKS_PER_SEC;
    return 0;
}

//NGT 1600-2000 cf
//1/200 hard quests