Cod sursa(job #3183288)

Utilizator radu._.21Radu Pelea radu._.21 Data 11 decembrie 2023 14:01:44
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <iostream>
#include <bits/stdc++.h>


using namespace std;
vector<int>G[15001];
int tata[15001],cost[15001];
ifstream fin("radiatie.in");
ofstream fout("radiatie.out");
struct abc{
    int i; int j; int cost;
}v[30001];
bool cmp(abc a,abc b){
    return a.cost<b.cost;
}
int root(int nod){
    while(tata[nod]>0)
        nod=tata[nod];
    return nod;
}
int n,m,q,radacina,nivel[15001];
void dfs(int nod,int lvl){
    nivel[nod]=lvl;
    for(auto x : G[nod])
        dfs(x,lvl+1);
}
int main(){
    fin>>n>>m>>q;
    for(int i=1;i<=m;i++){
        fin>>v[i].i>>v[i].j>>v[i].cost;
    }
    for(int i=1;i<=n;i++)
        tata[i]=-1;
    sort(v+1,v+m+1,cmp);
    int k=0;
    for(int i=1;k<n-1;i++){
        /// adasug muchia i ( candidatra)
        /// verific
        int rx = root(v[i].i);
        int ry = root(v[i].j);
        if(rx!=ry){
            k++;

            if(tata[rx]<tata[ry]){
                /// pun in rx
                G[rx].push_back(ry);
                cost[ry]=v[i].cost;
                tata[rx]+=tata[ry];
                tata[ry]=rx;
                radacina = rx;
            }
            else{
                G[ry].push_back(rx);
                cost[rx]=v[i].cost;
                tata[ry]+=tata[rx];
                tata[rx]=ry;
                radacina = ry;
            }
        }

    }
    dfs(radacina,1);
    while(q--){
        int x,y; fin>>x>>y;
       int max0=-1000000000;
        while(nivel[x]>nivel[y])
            max0=max(max0,cost[x]),x=tata[x];
        while(nivel[y]>nivel[x])
            max0=max(max0,cost[y]),y=tata[y];
        max0=max(max0,max(cost[x],cost[y]));
        fout<<max0<<'\n';
    }


    return 0;
}