Cod sursa(job #2354455)

Utilizator DovlecelBostan Andrei Dovlecel Data 25 februarie 2019 12:25:06
Problema Radiatie Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.79 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream in("radiatie.in");
ofstream out("radiatie.out");
const int N=15005;
const int LOG=18;
int s[LOG+2][N],rad[LOG+2][N],nr[N],t[N],n,nrm,k;

struct muchie
{
    int x,y,cost;
};
vector<muchie>v;

bool cmp(muchie x,muchie y)
{
    return(x.cost<y.cost);
}

int radacina(int x)
{
    if(t[x]==0)
        return x;
    t[x]=radacina(t[x]);
    return t[x];
}

void reuniune(int x,int y)
{
    int rx=radacina(x);
    int ry=radacina(y);
    if(nr[rx]<nr[ry])
    {
        t[rx]=ry;
        nr[ry]+=nr[rx];
        nr[rx]=0;
    }
    else
    {
        t[ry]=rx;
        nr[rx]+=nr[ry];
        nr[ry]=0;
    }
}

bool aceeasi(int x,int y)
{
    return(radacina(x)==radacina(y));
}

vector<int>a[N],c[N];
void apm(int x)
{
    for(int i=1;i<=x;i++)
    {
        nr[i]=1;
        t[i]=0;
    }
    sort(v.begin(),v.end(),cmp);
    for(unsigned i=0;i<v.size();i++)
        if(!aceeasi(v[i].x,v[i].y))
        {
            reuniune(v[i].x,v[i].y);
            a[v[i].x].push_back(v[i].y);
            a[v[i].y].push_back(v[i].x);
            c[v[i].x].push_back(v[i].cost);
            c[v[i].y].push_back(v[i].cost);
        }
}

int h[N];
bool viz[N];
void dfs(int x)
{
    int y,cost;
    for(unsigned i=0;i<a[x].size();i++)
    {
        y=a[x][i];
        cost=c[x][i];
        if(!viz[y])
        {
            viz[y]=true;
            s[0][y]=x;
            rad[0][y]=cost;
            h[y]=1+h[x];
            dfs(y);
        }
    }
}

void query(int x,int y)
{
    int p,sol=0;
    if(h[x]<h[y])
        swap(x,y);
    int h1=h[x];
    int h2=h[y];
    p=LOG;
    while(h1>h2)
    {
        if(h1-(1<<p)>=h2)
        {
            sol=max(sol,rad[p][x]);
            x=s[p][x];
            h1-=1<<p;
        }
        p--;
    }
    p=LOG;
    while(s[0][x]!=s[0][y])
    {
        if(s[p][x]!=s[p][y])
        {
            sol=max(sol,max(rad[p][x],rad[p][y]));
            x=s[p][x];
            y=s[p][y];
            h1-=1<<p;
            h2-=1<<p;
        }
        p--;
    }
    if(x!=y)
        sol=max(sol,max(rad[0][x],rad[0][y]));
    out<<sol<<'\n';
}

int main()
{

    int x,y,cost;
    muchie m;
    in>>n>>nrm>>k;
    for(int i=1;i<=nrm;i++)
    {
        in>>x>>y>>cost;
        m.x=x;
        m.y=y;
        m.cost=cost;
        v.push_back(m);
    }
    apm(n);
    h[1]=0;
    s[0][x]=0;
    viz[1]=true;
    dfs(1);
    for(int i=1;i<=LOG;i++)
        for(int j=1;j<=n;j++)
        {
            s[i][j]=s[i-1][s[i-1][j]];
            rad[i][j]=max(rad[i-1][j],rad[i-1][s[i-1][j]]);
        }
    for(int i=1;i<=k;i++)
    {
        in>>x>>y;
        query(x,y);
    }
    return 0;
}