Cod sursa(job #3040908)

Utilizator Zed1YasuoAlex Birsan Zed1Yasuo Data 30 martie 2023 16:48:09
Problema Radiatie Scor 0
Compilator cpp-64 Status done
Runda tot_ Marime 2.28 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
int n,m,k;
const int N=15005;
struct muc
{
    int x,y,cost;
}edge[2*N];
int tt[N],sz[N];
bool cmp(muc X,muc Y)
{
    return X.cost<Y.cost;
}
int get_root(int x)
{
    if(tt[x]==x)
        return x;
    return tt[x]=get_root(tt[x]);
}
void unite(int x,int y)
{
    if(sz[x]<sz[y])
        swap(x,y);
    sz[x]+=sz[y];
    tt[y]=x;
}
struct pct
{
    int x,y;
};
vector<pct>a[N];
int niv[N];
int rmq_mx[18][N];
int rmq_dad[18][N];
void dfs(int nod,int tt)
{
    niv[nod]=niv[tt]+1;
    for(int i=1;i<=16;i++)
    {
        rmq_dad[i][nod]=rmq_dad[i-1][rmq_dad[i-1][nod]];
        rmq_mx[i][nod]=max(rmq_mx[i-1][nod],rmq_mx[i-1][rmq_dad[i-1][nod]]);
        if(!rmq_dad[i][nod])
            break;
    }
    for(auto x:a[nod])
    {
        if(x.x==tt)
            continue;
        rmq_dad[0][x.x]=nod;
        rmq_mx[0][x.x]=x.y;
        dfs(x.x,nod);
    }
}
int solve_lca(int x,int y)
{
    if(niv[x]<niv[y])
        swap(x,y);
    int D=niv[x]-niv[y];
    int MX=0;
    for(int i=16;i>=0;i--)
        if((1<<i)&D)
        {
            MX=max(MX,rmq_mx[i][x]);
            x=rmq_dad[i][x];
        }
    if(x==y)
        return MX;
    for(int i=16;i>=0;i--)
    {
        if(rmq_dad[i][x]!=rmq_dad[i][y])
        {
            x=rmq_dad[i][x];
            y=rmq_dad[i][y];
            MX=max(MX,max(rmq_mx[i][x],rmq_mx[i][y]));
        }
    }
    MX=max(MX,rmq_mx[0][x]);
    MX=max(MX,rmq_mx[0][y]);
    return MX;
}
int main()
{
    f>>n>>m>>k;
    for(int i=1;i<=m;i++)
        f>>edge[i].x>>edge[i].y>>edge[i].cost;
    sort(edge+1,edge+m+1,cmp);
    for(int i=1;i<=n;i++)
        tt[i]=i,sz[i]=1;
    for(int i=1;i<=m;i++)
    {
        int X=get_root(edge[i].x);
        int Y=get_root(edge[i].y);
        if(X!=Y)
        {
            unite(X,Y);
            a[edge[i].x].push_back({edge[i].y,edge[i].cost});
            a[edge[i].y].push_back({edge[i].x,edge[i].cost});
            if(sz[get_root(1)]==n)
                break;
        }
    }
    dfs(1,0);
    while(k--)
    {
        int x,y;
        f>>x>>y;
        g<<solve_lca(x,y)<<'\n';
    }
    return 0;
}