Cod sursa(job #3281728)

Utilizator BalanelBalan Stefan Balanel Data 3 martie 2025 15:12:07
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include<bits/stdc++.h>
using namespace std;
ifstream in("radiatie.in");
ofstream out("radiatie.out");
struct radi {
    int x,y,c;
}v[30005];
int n,m,t1,x,y,t[20001],h[20001],d[20001],b[20001],p;
vector<int> a[20001];
bool f[20001];
bool comp(radi a, radi b) {
    return a.c<b.c;
}
int rad(int x) {
    while(x!=t[x])
        x=t[x];
    return x;
}
void unif(int x, int y, int c) {
    int r1=rad(x),r2=rad(y);
    if(h[r1]<h[r2]) swap(r1,r2);
    t[r2]=r1,h[r1]+=h[r2];
    d[r2]=c;
    a[r1].push_back(r2);
    p=r1;
}
void dfs(int k, int x) {
    f[k]=1,b[k]=x;
    for(int i=0;i<a[k].size();++i)
        if(!f[a[k][i]]) dfs(a[k][i],x+1);
}
int lca(int x, int y) {
    int mx1=-1,mx2=-1;
    if(b[x]<b[y]) swap(x,y);
    while(b[x]!=b[y])
        mx1=max(mx1,d[x]),x=t[x];
    while(x!=y) {
        mx1=max(mx1,d[x]),x=t[x];
        mx2=max(mx2,d[y]),y=t[y];
        }
    return max(mx1,mx2);
}
int main()
{in>>n>>m>>t1;
for(int i=1;i<=n;++i)
    t[i]=i,h[i]=1;
for(int i=1;i<=m;++i)
    in>>v[i].x>>v[i].y>>v[i].c;
sort(v+1,v+m+1,comp);
for(int i=1;i<=m;++i)
    if(rad(v[i].x)!=rad(v[i].y)) unif(v[i].x,v[i].y,v[i].c);
dfs(p,1);
for(int i=1;i<=t1;++i)
    in>>x>>y,out<<lca(x,y)<<'\n';
return 0;
}