Cod sursa(job #1739792)

Utilizator delia_99Delia Draghici delia_99 Data 10 august 2016 11:35:27
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.6 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define NMAX 15000
using namespace std;

int n,m,k,i,sol;
int T[NMAX+5];
vector <pair <int,pair <int,int> > >tst;
vector <pair <int,int> >G[NMAX+5];
int lvl[NMAX+5],str[15][NMAX+5],dmax[15][NMAX+5];

int multime(int node)
{
    if(node==T[node])
        return node;
    int y=multime(T[node]);
    T[node]=y;
    return y;
}

void dfs(int node, int dad,int cost)
{
    lvl[node]=lvl[dad]+1;
    str[0][node]=dad;
    dmax[0][node]=cost;
    int s=G[node].size(),i,crt;
    for(i=0; i<s; ++i)
    {
        crt=G[node][i].first;
        if(crt!=dad)
            dfs(crt,node,G[node][i].second);
    }
}

void stramosi()
{
    int a,b;
    for(a=1; a<=13; ++a)
        for(b=1; b<=n; ++b)
        {
            str[a][b]=str[a-1][str[a-1][b]];
            if(str[a][b])
                dmax[a][b]=max(dmax[a-1][b],dmax[a-1][str[a-1][b]]);
        }
}

int rise(int node, int x)
{
    for(int i=0; i<=13; ++i)
        if((x>>i)&1)
        {
            sol=max(sol,dmax[i][node]);
            node=str[i][node];
        }
    return node;
}

int lca(int node1,int node2)
{
    if(lvl[node1]<lvl[node2])
        swap(node1,node2);
    node1=rise(node1,lvl[node1]-lvl[node2]);
    for(int i=13; i>=0; --i)
        if(str[i][node1]!=str[i][node2])
        {
            sol=max(sol,max(dmax[i][node1],dmax[i][node2]));
            node1=str[i][node1];
            node2=str[i][node2];
        }
    if(node1!=node2)
    {
        sol=max(sol,max(dmax[0][node1],dmax[0][node2]));
        return str[0][node1];
    }
    else return node1;
}

int main()
{
    freopen("radiatie.in","r",stdin);
    freopen("radiatie.out","w",stdout);

    scanf("%d%d%d",&n,&m,&k);
    for(i=0; i<m; ++i)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        tst.push_back(make_pair(c,make_pair(a,b)));
    }
    for(i=1; i<=n; ++i)
        T[i]=i;

    sort(tst.begin(),tst.end());
    for(i=0; i<m; ++i)
    {
        int node1,node2,cost,m1,m2;
        cost=tst[i].first;
        node1=tst[i].second.first;
        node2=tst[i].second.second;
        m1=multime(node1);
        m2=multime(node2);

        if(m1!=m2)
        {
            T[m1]=m2;
            G[node1].push_back(make_pair(node2,cost));
            G[node2].push_back(make_pair(node1,cost));
        }
    }

    lvl[0]=-1;
    dfs(1,0,0);
    stramosi();

    for(i=1; i<=k; ++i)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        sol=0;
        int L=lca(x,y);
        printf("%d\n",sol);
    }

    return 0;
}