Cod sursa(job #1834294)

Utilizator LucianTLucian Trepteanu LucianT Data 24 decembrie 2016 12:18:49
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <bits/stdc++.h>
#define maxN 15005
#define maxLog 15
using namespace std;
int t[maxN],lvl[maxN];
vector<pair<int,int> >v[maxN];
vector<pair<int,pair<int,int> > >edges;
int n,m,k,i,j,x,y,z,tx,ty;
int anc[maxLog][maxN],bst[maxLog][maxN];
int Find(int x)
{
    if(t[x]==x)
        return x;
    return t[x]=Find(t[x]);
}
void Union(int x,int y)
{
    t[Find(x)]=Find(y);
}
void dfs(int nod,int tata)
{
    lvl[nod]=lvl[tata]+1;
    vector<pair<int,int> >::iterator it;
    for(it=v[nod].begin();it!=v[nod].end();it++)
        if(it->first!=tata)
        {
            anc[0][it->first]=nod;
            bst[0][it->first]=it->second;
            dfs(it->first,nod);
        }
}
int query(int x,int y)
{
    if(lvl[x]<lvl[y])
        swap(x,y);
    int len=lvl[x]-lvl[y],sol=0;
    for(int i=0;i<maxLog;i++)
        if(len&(1<<i))
            sol=max(sol,bst[i][x]),
            x=anc[i][x];
    if(x==y)
        return sol;
    for(int i=maxLog-1;i>=0;i--)
        if(anc[i][x]!=anc[i][y])
        {
            sol=max(sol,max(bst[i][x],bst[i][y]));
            x=anc[i][x];
            y=anc[i][y];
        }
    sol=max(sol,max(bst[0][x],bst[0][y]));
    return sol;
}
int main()
{
    freopen("radiatie.in","r",stdin);
    freopen("radiatie.out","w",stdout);
    scanf("%d %d %d",&n,&m,&k);
    for(i=1;i<=n;i++)
        t[i]=i;
    for(i=1;i<=m;i++)
        scanf("%d %d %d",&x,&y,&z),
        edges.push_back(make_pair(z,make_pair(x,y)));
    sort(edges.begin(),edges.end());
    for(auto it:edges)
    {
        x=it.second.first;
        y=it.second.second;
        tx=Find(x);
        ty=Find(y);
        if(tx==ty)
            continue;
        Union(x,y);
        v[x].push_back(make_pair(y,it.first));
        v[y].push_back(make_pair(x,it.first));
    }
    dfs(1,0);
    for(i=1;i<maxLog;i++)
        for(j=1;j<=n;j++)
            anc[i][j]=anc[i-1][anc[i-1][j]],
            bst[i][j]=max(bst[i-1][j],bst[i-1][anc[i-1][j]]);
    while(k--)
    {
        scanf("%d %d",&x,&y);
        printf("%d\n",query(x,y));
    }
    return 0;
}