Cod sursa(job #2904834)

Utilizator andreibodnarAndrei Bodnar andreibodnar Data 18 mai 2022 09:27:26
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <bits/stdc++.h>

using namespace std;

struct edge {
    int a, b, c;
};

int t[15005], Rank[15005];
int depth[15005];
int anc[15005][16];
int len[15005][16];
vector < pair < int, int > > graph[15005];

int root(int k) {
    if(t[k] == 0)
        return k;
    else {
        int x = root(t[k]);
        t[k] = x;
        return x;
    }
}

void Union(int u, int v, int c) {
    int root_u = root(u), root_v = root(v);
    if(root_u != root_v) {
        graph[u].push_back({v, c});
        graph[v].push_back({u, c});
        if(Rank[root_u] > Rank[root_v]) {
            Rank[root_u] += Rank[root_v];
            Rank[root_v] = 0;
            t[root_v] = root_u;
        }
        else {
            Rank[root_v] += Rank[root_u];
            Rank[root_u] = 0;
            t[root_u] = root_v;
        }
    }
}

void dfs(int k, int dad) {
    for(pair < int, int > x : graph[k]) {
        if(x.first == dad)
            continue;
        anc[x.first][0] = k;
        len[x.first][0] = x.second;
        depth[x.first] = depth[k] + 1;
        for(int i = 1; i <= 14; i++) {
            anc[x.first][i] = anc[anc[x.first][i - 1]][i - 1];
            len[x.first][i] = max(len[x.first][i - 1], len[anc[x.first][i - 1]][i - 1]);
        }
        dfs(x.first, k);
    }
}

int lca(int a, int b) {
    int best = 0;
    if(depth[a] < depth[b])
        swap(a, b);
    int k = depth[a] - depth[b];
    for(int i = 0; i <= 14; i++) {
        if(k & (1 << i)) {
            best = max(best, len[a][i]);
            a = anc[a][i];
        }
    }

    if(a == b)
        return best;

    for(int i = 14; i >= 0; i--) {
        if(anc[a][i] != anc[b][i]) {
            best = max(best, max(len[a][i], len[b][i]));
            a = anc[a][i];
            b = anc[b][i];
        }
    }
    best = max(best, max(len[a][0], len[b][0]));
    return best;
}

bool cmp(const edge x, const edge y) {
    return x.c < y.c;
}

int n, m, k;
edge e[30005];

int main()
{
    freopen("radiatie.in", "r", stdin);
    freopen("radiatie.out", "w", stdout);

    scanf("%d%d%d", &n, &m, &k);

    for(int i = 1; i <= m; i++)  {
        scanf("%d%d%d", &e[i].a, &e[i].b, &e[i].c);
    }

    sort(e + 1, e + m + 1, cmp);

    for(int i = 1; i <= m; i++) {
        Union(e[i].a, e[i].b, e[i].c);
    }

    for(int i = 0; i <= 14; i++)
        anc[1][i] = 1;

    dfs(1, 0);

    while(k--) {
        int u, v;
        scanf("%d%d", &u, &v);
        printf("%d\n", lca(u, v));
    }

    return 0;
}