Cod sursa(job #2075532)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 25 noiembrie 2017 15:20:47
Problema Radiatie Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
FILE *f=fopen("radiatie.in","r");
FILE *g=fopen("radiatie.out","w");
int N,M,K;
pair<int,pair<int,int> > edge[15005];
vector<pair<int,int> > G[15005];
int T[15005];
int t[16][15005];
int mx[16][15005];
int lvl[15005];
int fi(int x)
{
    if(!T[x])return x;
    return T[x]=fi(T[x]);
}
void u(int x,int y,int c)
{
    int Tx=fi(x);
    int Ty=fi(y);
    if(Tx==Ty)return ;
    T[Tx]=Ty;
    G[x].push_back({y,c});
    G[y].push_back({x,c});
}
void dfs(int nod,int tata,int cost)
{
    t[0][nod]=tata;
    mx[0][nod]=cost;
    lvl[nod]=1+lvl[tata];
    for(auto it:G[nod])
        if(it.first!=tata)
            dfs(it.first,nod,it.second);
}
int solve(int x,int y)
{
    int rez=0;
    if(lvl[x]>lvl[y])
        swap(x,y);
    for(int pas=15;pas>=0;pas--)
    {
        if(lvl[y]-lvl[x]>=1<<pas)
        {
            rez=max(rez,mx[pas][y]);
            y=t[pas][y];
        }
    }
    if(x==y)return rez;
    for(int pas=15;pas>=0;pas--)
    {
        if(t[pas][x]!=t[pas][y])
        {
            rez=max(rez,max(mx[pas][x],mx[pas][y]));
            x=t[pas][x];
            y=t[pas][y];
        }
    }
    rez=max(rez,max(mx[0][x],mx[0][y]));
    return rez;
}
int main()
{
    fscanf(f,"%d %d %d",&N,&M,&K);
    for(int i=1;i<=M;i++)
    {
        fscanf(f,"%d %d %d",&edge[i].second.first,&edge[i].second.second,&edge[i].first);
    }
    sort(edge+1,edge+1+M);
    for(int i=1;i<=M;i++)
        u(edge[i].second.first,edge[i].second.second,edge[i].first);
    dfs(1,0,0);
    for(int lg=1;lg<16;lg++)
        for(int i=1;i<=N;i++)
        {
            t[lg][i]=t[lg-1][t[lg-1][i]];
            mx[lg][i]=max(mx[lg-1][i],mx[lg-1][t[lg-1][i]]);
        }
    for(int i=1;i<=K;i++)
    {
        int x,y;
        fscanf(f,"%d %d",&x,&y);
        fprintf(g,"%d\n",solve(x,y));
    }
    fclose(f);
    fclose(g);
    return 0;
}