Cod sursa(job #3185542)

Utilizator antonio_sefu_tauLaslau Antonio antonio_sefu_tau Data 19 decembrie 2023 15:28:41
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.6 kb
#include <bits/stdc++.h>
using namespace std;
const int dim=3e4+5;
vector<pair<int,int>> G[dim];
int n,m,q,t[dim],r[dim],d[dim],dp[20][dim],bl[20][dim],blc[20][dim];
bool viz[dim];
struct muc{
    int x,y,c;
}a[3*dim];
bool cmp(muc A, muc B){
    return A.c<B.c;
}
int rad(int nod){
    if(nod==t[nod]){
        return nod;
    }
    else{
        return (t[nod]=rad(t[nod]));
    }
}
void uneste(int x, int y){
    if(r[x]<r[y]){
        t[x]=y;
        r[y]+=r[x];
    }
    else{
        t[y]=x;
        r[x]+=r[y];
    }
}
void bfs(int nod){
    queue<int> Q;
    Q.push(nod);
    viz[nod]=1;
    while(!Q.empty()){
        int x=Q.front();
        Q.pop();
        for(auto u:G[x]){
            if(!viz[u.first]){
                viz[u.first]=1;
                Q.push(u.first);
                d[u.first]=d[x]+1;
                dp[0][u.first]=u.second;
                bl[0][u.first]=x;
            }
        }
    }
}
void RMQ(){
    for(int k=1;k<=20;k++){
        for(int i=1;i<=n;i++){
            bl[k][i]=bl[k-1][bl[k-1][i]];
        }
    }
    for(int k=0;k<=20;k++){
        for(int i=1;i<=n;i++){
            blc[k][i]=bl[k][i];
        }
    }
    for(int k=1;k<=20;k++){
        for(int i=1;i<=n;i++){
            dp[k][i]=max(dp[k-1][i],dp[k-1][bl[k-1][i]]);
        }
    }
    for(int k=0;k<=20;k++){
        for(int i=1;i<=n;i++){
            bl[k][i]=blc[k][i];
        }
    }
}
int lca_max(int x, int y){
    int sol=0;
    if(d[x]<d[y]){
        swap(x,y);
    }
    for(int k=20;k>=0;k--){
        if(d[x]-(1<<k)>=d[y]){
            sol=max(sol,dp[k][x]);
            x=bl[k][x];
        }
    }
    if(x==y){
        return sol;
    }
    for(int k=20;k>=0;k--){
        if(bl[k][x] and bl[k][x]!=bl[k][y]){
            sol=max(sol,max(dp[k][x],dp[k][y]));
            x=bl[k][x];
            y=bl[k][y];
        }
    }
    sol=max(sol,dp[0][x]);
    return sol;
}
int main(){
    ifstream f("radiatie.in");
    ofstream g("radiatie.out");
    f>>n>>m>>q;
    for(int i=1;i<=n;i++){
        t[i]=i;
        r[i]=1;
    }
    for(int i=1;i<=m;i++){
        f>>a[i].x>>a[i].y>>a[i].c;
    }
    sort(a+1,a+m+1,cmp);
    int s=0;
    for(int i=1;i<=m;i++){
        int r1=rad(a[i].x),r2=rad(a[i].y);
        if(r1!=r2){
            s+=a[i].c;
            uneste(r1,r2);
            G[a[i].x].push_back({a[i].y,a[i].c});
            G[a[i].y].push_back({a[i].x,a[i].c});
        }
    }
    bfs(1);
    RMQ();
    while(q--){
        int x,y;
        f>>x>>y;
        g<<lca_max(x,y)<<'\n';
    }
    return 0;
}