Cod sursa(job #3194209)

Utilizator Dia3141Costea Diana Stefania Dia3141 Data 17 ianuarie 2024 12:01:07
Problema Radiatie Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin("radiatie.in");
ofstream cout("radiatie.out");
int n,m,q,i,x,y,c,sol,r,nivel[15005],root[15005],cost[15005];
vector<pair<int,pair<int,int>>>v;
vector<pair<int,int>>apm[15005];
int getroot(int x){
    while(root[x]>0)
        x=root[x];
    return x;
}
void construire_apm(){
    for(int i=0;i<m;i++){
        int rx=getroot(v[i].second.first),ry=getroot(v[i].second.second);
        if(rx!=ry){
            if(root[rx]>root[ry])
                swap(rx,ry);
            root[rx]+=root[ry];
            root[ry]=rx;
            apm[v[i].second.first].push_back({v[i].second.second,v[i].first});
            apm[v[i].second.second].push_back({v[i].second.first,v[i].first});
            r=rx;
        }
    }
}
void dfs(int nod,int nvl){
    nivel[nod]=nvl;
    for(int i=0;i<apm[nod].size();i++){
        int vecin=apm[nod][i].first,c=apm[nod][i].second;
        if(nivel[vecin]==0){
            root[vecin]=nod;
            cost[vecin]=c;
            dfs(vecin,nvl+1);
        }
    }
}
void lca(int x,int y){
    if(nivel[x]<nivel[y])
        swap(x,y);
    while(nivel[x]!=nivel[y]){
        sol=max(sol,cost[x]);
        x=root[x];
    }
    while(x!=y){
        sol=max(sol,cost[x]);
        sol=max(sol,cost[y]);
        x=root[x];
        y=root[y];
    }
}
int main()
{
    cin>>n>>m>>q;
    for(i=1;i<=n;i++)
        root[i]=-1;
    for(i=1;i<=m;i++){
        cin>>x>>y>>c;
        v.push_back({c,{x,y}});
    }
    sort(v.begin(),v.end());
    construire_apm();
    root[r]=0;
    dfs(r,0);
    for(i=1;i<=q;i++){
        cin>>x>>y;
        sol=0;
        lca(x,y);
        cout<<sol<<'\n';
    }
    return 0;
}