Cod sursa(job #1060697)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 18 decembrie 2013 15:09:05
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.73 kb
#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

const int NMAX = 15005;
const int MMAX = 30005;
const int KMAX = 15005;

typedef pair<int,pair<int,int> > Edge1;
typedef pair<int,int> Edge2;

int N,M,K;

int root[NMAX];
int rang[NMAX];

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

void unite(int x,int y)
{
    if(rang[x]>rang[y]) {root[y]=x; return;}
    if(rang[x]<rang[y]) {root[x]=y; return;}
    root[x]=y; rang[y]++;
}

vector<Edge1> V;
vector<Edge2> W[NMAX];

void APM()
{
    vector<Edge1>::iterator it;
    int i,a,b,c,x,y;
    sort(V.begin(),V.end());
    for(i=1;i<=N;i++)
    {
        root[i]=i;
        rang[i]=1;
    }
    for(i=1,it=V.begin();i<=N-1 && it!=V.end();it++)
    {
        a=it->second.first;
        b=it->second.second;
        c=it->first;
        x=find(a);
        y=find(b);
        if(x==y) continue;
        unite(x,y);
        W[a].push_back(make_pair(b,c));
        W[b].push_back(make_pair(a,c));
        i++;
    }
}

int A[NMAX][15];
int B[NMAX][15];
int Nivel[NMAX];

void DFS(int x,int y)
{
    vector<Edge2>::iterator it;
    Nivel[x]=y;
    for(it=W[x].begin();it!=W[x].end();it++)
    {
        if(Nivel[it->first]) continue;
        A[it->first][0]=x;
        B[it->first][0]=it->second;
        DFS(it->first,y+1);
    }
}

void precalc()
{
    int i,j,p;
    for(i=1,p=2;p<=N;i++,p<<=1)
        for(j=1;j<=N;j++)
        {
            A[j][i]=A[A[j][i-1]][i-1];
            if(A[j][i]) B[j][i]=max(B[j][i-1],B[A[j][i-1]][i-1]);
        }
}

int query(int x,int y)
{
    int i,p,P,a=0,b=0;
    if(Nivel[x]>Nivel[y])
    {
        P=Nivel[x]-Nivel[y];
        for(i=0,p=1;p<=P;i++,p<<=1)
            if(P&p) {a=max(a,B[x][i]); x=A[x][i];}
    }
    if(Nivel[x]<Nivel[y])
    {
        P=Nivel[y]-Nivel[x];
        for(i=0,p=1;p<=P;i++,p<<=1)
            if(P&p) {b=max(b,B[y][i]); y=A[y][i];}
    }
    if(x!=y)
    {
        for(p=0,P=1;P<=Nivel[x];p++,P<<=1);
        for(i=p;i>=0;i--)
        {
            if(A[x][i] == A[y][i]) continue;
            a=max(a,B[x][i]);
            x=A[x][i];
            b=max(b,B[y][i]);
            y=A[y][i];
        }
        a=max(a,B[x][0]);
        b=max(b,B[y][0]);
    }
    return max(a,b);
}

int main()
{
    int a,b,c;
    freopen("radiatie.in","r",stdin);
    freopen("radiatie.out","w",stdout);
    scanf("%d%d%d",&N,&M,&K);
    for(;M;--M)
    {
        scanf("%d%d%d",&a,&b,&c);
        V.push_back(make_pair(c,make_pair(a,b)));
    }
    APM();
    DFS(1,1);
    precalc();
    for(;K;--K)
    {
        scanf("%d%d",&a,&b);
        printf("%d\n",query(a,b));
    }
    return 0;
}