Cod sursa(job #1586170)

Utilizator delia_99Delia Draghici delia_99 Data 31 ianuarie 2016 20:39:38
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#define NMAX 15000
using namespace std;

int n,m,k,i,sol;
int str[13+5][NMAX+5],T[NMAX+5],H[NMAX+5],Max[13+5][NMAX+15];
vector < pair < int , pair < int , int > > > G;
vector < pair < int , int > > apm[NMAX+5];
bool ok[NMAX+5];

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

void dfs(int nod,int l)
{
    int s=apm[nod].size(),x,c;
    ok[nod]=true;
    H[nod]=l;
    for(int i=0; i<s; ++i)
    {
        x=apm[nod][i].first;
        c=apm[nod][i].second;
        if(!ok[x])
        {
            str[0][x]=nod;
            Max[0][x]=c;
            dfs(x,l+1);
        }
    }
}

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

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

int nivel(int nod,int h)
{
    int i;
    for(i=0; i<=13; ++i)
        if((h>>i)&1)
        {
            sol=max(sol,Max[i][nod]);
            nod=str[i][nod];
        }
    return nod;
}

int lca(int x,int y)
{
    int Min;
    sol=0;
    if(H[x]!=H[y])
    {
        Min=min(H[x],H[y]);
        if(H[x]!=Min)
            x=nivel(x,H[x]-Min);
        else y=nivel(y,H[y]-Min);
    }
    if(x==y)
    {
        printf("%d\n",sol);
        return 0;
    }
    sol=0;
    int step,i;
    step=13;
    for(i=0; step; step>>=1)
        if(str[i+step][x]!=str[i+step][y])
            i+=step;
    return i;
}

int main()
{
    freopen("radiatie.in","r",stdin);
    freopen("radiatie.out","w",stdout);
    scanf("%d%d%d",&n,&m,&k);
    for(i=1; i<=m; ++i)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        G.push_back(make_pair(c,make_pair(a,b)));
    }
    sort(G.begin(),G.end());
    for(i=1; i<=n; ++i)
        T[i]=i;
    for(i=0; i<m; ++i)
    {
        int e1,e2,c;
        e1=G[i].second.first;
        e2=G[i].second.second;
        c=G[i].first;
        if(multime(e1)!=multime(e2))
        {
            T[e2]=e1;
            apm[e1].push_back(make_pair(e2,c));
            apm[e2].push_back(make_pair(e1,c));
        }
    }
    dfs(1,0);
    stramosi();
    smax();
    for(i=1; i<=k; ++i)
    {
        int x,y,z;
        scanf("%d%d",&x,&y);
        z=lca(x,y);
        if(!sol)
            printf("%d\n",max(Max[z][x],Max[z][y]));
    }
    return 0;
}