Cod sursa(job #1303629)

Utilizator OctaDuiu Octavian Octa Data 28 decembrie 2014 11:20:41
Problema Radiatie Scor 100
Compilator cpp Status done
Runda tema_vacanta_iarna Marime 1.31 kb
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
struct E { int x,y,v; } e[30003];
int n,m,k,t[15003],lv[15003],c[15003];
vector < int > g[15003];

bool cmp(E a,E b) { return a.v<b.v; }

int root(int x)
{
    while(t[x])
        x=t[x];

  return x;
}

void dfs(int nod)
{
    for(int i=0;i<g[nod].size();++i)
    {
        lv[g[nod][i]]=lv[nod]+1;
        dfs(g[nod][i]);
    }
}
int main()
{
    freopen("radiatie.in","r",stdin);freopen("radiatie.out","w",stdout);

    int i,x,y,Max;

    scanf("%d %d %d",&n,&m,&k);

    for(i=0;i<m;++i)
        scanf("%d %d %d",&e[i].x,&e[i].y,&e[i].v);

    sort(e,e+m,cmp);

    for(i=0;i<m;++i)
    {
        x=root(e[i].x);
        y=root(e[i].y);

        if(x!=y)
        {
            t[x]=y;
            g[y].push_back(x);
            c[x]=e[i].v;
        }
    }

    for(i=1;t[i];++i);
        dfs(i);

    while(k--)
    {
        scanf("%d %d",&x,&y);

        Max=0;
        if(lv[x]<lv[y])
            swap(x,y);

        while(lv[x]>lv[y])
        {
            Max=max(Max,c[x]);
            x=t[x];
        }

        while(x!=y)
        {
            Max=max(Max,max(c[x],c[y]));

            x=t[x];
            y=t[y];
        }

        printf("%d\n",Max);
    }

  return 0;
}