Cod sursa(job #922579)

Utilizator tudgal1001Profir Tudor tudgal1001 Data 22 martie 2013 15:34:10
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include<algorithm>
#include<cstdio>
#include<vector>
#define MMax 30005
#define NMax 15005
using namespace std;

struct muchie { int x,y,cost; };
muchie a[MMax];
int rang[NMax],p[NMax],lev[NMax];
int rmq[20][NMax],rmqv[20][NMax];
int n,lev_max;
vector<pair<int,int> > vc[NMax];
vector<pair<int,int> >::iterator it;

bool cmp (muchie aa, muchie bb)
{
    return aa.cost<bb.cost;
}

void init ()
{
    for (int i=1; i<=n; i++)
        p[i]=i;
}

int find (int x)
{
    if (x!=p[x])
        p[x]=find(p[x]);
    return p[x];
}

void unite (int x, int y)
{
    if (rang[x]>rang[y])
        p[y]=x;
    else
        p[x]=y;
    if (rang[x]==rang[y])
        rang[y]++;
}

void df (int nod)
{
    int i;
    for (i=0; i<vc[nod].size(); i++)
        if (!lev[vc[nod][i].first])
        {
            lev[vc[nod][i].first]=lev[nod]+1;
            rmq[0][vc[nod][i].first]=nod;
            rmqv[0][vc[nod][i].first]=vc[nod][i].second;
            df(vc[nod][i].first);
        }
}

int lca (int x, int y)
{
    int sol=0,niv,step;
    if (lev[x]>lev[y])
        swap(x,y);
    niv=lev[y];
    for (step=1; (1<<step)<=niv-lev[x]; step++);
    for (; step>=0; step--)
        if (niv-(1<<step)>=lev[x])
        {
            niv-=(1<<step);
            sol=max(sol,rmqv[step][y]);
            y=rmq[step][y];
        }
    for (step=1; (1<<step)<=lev[x]; step++);
    for (; step>=0; step--)
        if (rmq[step][x]!=rmq[step][y])
        {
            sol=max(sol,rmqv[step][x]);
            sol=max(sol,rmqv[step][y]);
            x=rmq[step][x];
            y=rmq[step][y];
        }
    return sol;
}

int main ()
{
    int i,r1,r2,k,m,step,x,y;
    //freopen("radiatie.in","r",stdin);
    //freopen("radiatie.out","w",stdout);
    scanf("%d%d%d",&n,&m,&k);
    for (i=1; i<=m; i++)
        scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].cost);
    sort(a+1,a+m+1,cmp);
    init();
    for (i=1; i<=m; i++)
    {
        r1=find(a[i].x);
        r2=find(a[i].y);
        if (r1!=r2)
        {
            unite(r1,r2);
            vc[a[i].x].push_back(make_pair(a[i].y,a[i].cost));
            vc[a[i].y].push_back(make_pair(a[i].x,a[i].cost));
        }
    }
    lev[1]=1;
    df(1);
    for (i=1; i<=n; i++)
        lev_max=max(lev_max,lev[i]);
    for (step=1; (1<<step)<=lev_max; step++)
        for (i=1; i<=n; i++)
        {
            rmq[step][i]=rmq[step-1][rmq[step-1][i]];
            rmqv[step][i]=max(rmqv[step-1][i],rmqv[step-1][rmq[step-1][i]]);
        }
    while (k--)
    {
        scanf("%d%d",&x,&y);
        printf("%d\n",lca(x,y));
    }
    return 0;
}