Cod sursa(job #2847661)

Utilizator rares89_Dumitriu Rares rares89_ Data 11 februarie 2022 11:00:23
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <bitset>
 
using namespace std;
 
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
 
struct krusk {
    int x, y, c;
};
 
bool cmp(krusk a, krusk b) {
    return a.c < b.c;
}
 
vector<krusk> v;
int n, m, k, T[15005], c[15005], l[15005], root;
vector<int> G[15005];
bitset<15005> V;
 
void Union(int a, int b, int cost) {
    if(T[a] <= T[b]) {
        T[a] += T[b];
        T[b] = a;
        G[a].push_back(b);
        c[b] = cost;
        root = a;
    } else {
        T[b] += T[a];
        T[a] = b;
        G[b].push_back(a);
        c[a] = cost;
        root = b;
    }
}
 
int Find(int nod) {
    int x = nod;
    while(T[x] > 0) {
        x = T[x];
    }
    while(T[nod] > 0) {
        int temp = T[nod];
        T[nod] = x;
        nod = temp;
    }
    return nod;
}
 
void dfs(int nod) {
    V[nod] = true;
    for(auto it : G[nod]) {
        if(!V[it]) {
            l[it] = l[nod] + 1;
            dfs(it);
        }
    }
}
 
int main() {
    fin >> n >> m >> k;
    for(int i = 0; i < m; i++) {
        int x, y, c;
        fin >> x >> y >> c;
        v.push_back({x, y, c});
    }
    sort(v.begin(), v.end(), cmp);
    for(int i = 1; i <= n; i++) {
        T[i] = -1;
    }
    for(int i = 0; i < m; i++) {
        int nod1 = Find(v[i].x);
        int nod2 = Find(v[i].y);
        if(nod1 != nod2) {
            Union(nod1, nod2, v[i].c);
        }
    }
    l[root] = 1;
    dfs(root);
    for(int i = 1; i <= k; i++) {
        int x, y;
        fin >> x >> y;
        int maxim = 0;
        while(l[x] > l[y]) {
            maxim = max(maxim, c[x]);
            x = T[x];
        }
        while(l[y] > l[x]) {
            maxim = max(maxim, c[y]);
            y = T[y];
        }
        while(x != y) {
            maxim = max(maxim, max(c[x], c[y]));
            x = T[x], y = T[y];
        }
        fout << maxim << "\n";
    }
    return 0;
}