Cod sursa(job #3331436)

Utilizator Grama2008Grama Andrei Teodor Grama2008 Data 27 decembrie 2025 23:41:32
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <bits/stdc++.h>
using namespace std;

const int N=15005, M=3e4+5;

int parent[N],ans[N];
set<int>s[N];
tuple<int,int,int>edges[M];

int findparent(int x) {
    if (parent[x]==x) {
        return x;
    }
    return parent[x]=findparent(parent[x]);
}

void unite(int i) {
    auto [w,a,b]=edges[i];
    a=findparent(a);
    b=findparent(b);
    if (a==b)return;
    if (s[b].size()>s[a].size())swap(a,b);
    for (auto x:s[b]) {
        if (s[a].find(x)!=s[a].end()) {
            ans[x]=w;
            s[a].erase(x);
        }
        else {
            s[a].insert(x);
        }
    }
    parent[b]=a;
    s[b].clear();
}

signed main() {
    for (int i=1;i<N;i++) {
        parent[i]=i;
    }
    freopen("radiatie.in", "r", stdin);
    freopen("radiatie.out", "w", stdout);
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n,m,k;cin>>n>>m>>k;
    for (int i=0;i<m;i++) {
        int u,v,w;cin>>u>>v>>w;
        edges[i]={w,u,v};
    }
    for (int i=0;i<k;i++) {
        int a,b;cin>>a>>b;
        s[a].insert(i);
        s[b].insert(i);
    }
    sort(edges, edges+m);
    for (int i=0;i<m;i++) {
        unite(i);
    }
    for (int i=0;i<k;i++) {
        cout<<ans[i]<<'\n';
    }
    return 0;
}