Cod sursa(job #2721757)

Utilizator bogdi1bogdan bancuta bogdi1 Data 12 martie 2021 10:50:24
Problema Radiatie Scor 100
Compilator cpp-32 Status done
Runda Arhiva de probleme Marime 2.9 kb
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
struct Muchie
{
    int u,v,c;
};
Muchie v[30005];
struct Solutie
{
    int x,y,c;
} sol[30005];
int t[15005];
int h[15005];
bool viz[15005];
int niv[15005];
struct Muchii
{
    int y,z;
};
vector<Muchii> g[15005];
struct Stramosi
{
    int nod,maxx;
} stramos[15005][20];
int FindSet(int x)
{
    while(x!=t[x])
        x=t[x];
    return x;
}
bool UnionSet(int x, int y)
{
    int tx,ty;
    tx=FindSet(x);
    ty=FindSet(y);
    if(tx==ty)
        return 0;
    else{
        if(h[tx]==h[ty]){
            h[tx]++;
            t[ty]=tx;
        }
        else{
            if(h[tx]<h[ty])
                t[tx]=ty;
            else
                t[ty]=tx;
        }
        return 1;
    }
}
bool cmp(Muchie a, Muchie b)
{
    return a.c<b.c;
}
void dfs(int nod, int tata, int cost)
{
    stramos[nod][0].nod=tata;
    stramos[nod][0].maxx=cost;
    niv[nod]=niv[tata]+1;
    for(int i=1; i<=15; i++){
        stramos[nod][i].nod=stramos[stramos[nod][i-1].nod][i-1].nod;
        stramos[nod][i].maxx=max(stramos[nod][i-1].maxx, stramos[stramos[nod][i-1].nod][i-1].maxx);
    }
    viz[nod]=1;
    for(int i=0; i<g[nod].size(); i++)
        if(viz[g[nod][i].y]==0)
            dfs(g[nod][i].y, nod, g[nod][i].z);
}
int lca(int x, int y)
{
    if(niv[x]<niv[y])
        swap(x, y);
    for(int i=15; i>=0; i--)
        if(niv[x]-(1<<i)>=niv[y])
            x=stramos[x][i].nod;
    if(x==y)
        return x;
    for(int i=15; i>=0; i--)
        if(stramos[x][i].nod && stramos[x][i].nod!=stramos[y][i].nod){
            x=stramos[x][i].nod;
            y=stramos[y][i].nod;
        }
    return stramos[x][0].nod;
}
int main()
{   freopen("radiatie.in", "r", stdin);
    freopen("radiatie.out", "w", stdout);
    int n,m,k,i,kk,j,x,y,r,maxx;
    scanf("%d%d%d", &n, &m, &k);
    for(i=1; i<=m; i++)
        scanf("%d%d%d", &v[i].u, &v[i].v, &v[i].c);
    for(i=1; i<=n; i++){
        t[i]=i;
        h[i]=1;
    }
    sort(v+1, v+m+1, cmp);
    kk=0;
    for(i=1; i<=m; i++)
        if(UnionSet(v[i].u, v[i].v)==1){
            sol[++kk].x=v[i].u;
            sol[kk].y=v[i].v;
            sol[kk].c=v[i].c;
        }
    for(i=1; i<=kk; i++){
        g[sol[i].x].push_back({sol[i].y, sol[i].c});
        g[sol[i].y].push_back({sol[i].x, sol[i].c});
    }
    dfs(1, 0, 0);
    for(j=1; j<=k; j++){
        scanf("%d%d", &x, &y);
        r=lca(x, y);
        maxx=0;
        for(i=15; i>=0; i--)
            if(niv[x]-(1<<i)>=niv[r]){
                maxx=max(maxx, stramos[x][i].maxx);
                x=stramos[x][i].nod;
            }
        for(i=15; i>=0; i--)
            if(niv[y]-(1<<i)>=niv[r]){
                maxx=max(maxx, stramos[y][i].maxx);
                y=stramos[y][i].nod;
            }
        printf("%d\n", maxx);
    }
    return 0;
}