Cod sursa(job #1305094)

Utilizator gapdanPopescu George gapdan Data 29 decembrie 2014 15:35:36
Problema Radiatie Scor 100
Compilator cpp Status done
Runda tema_vacanta_iarna Marime 1.43 kb
#include<cstdio>
#include<algorithm>
#define NMAX 30004
using namespace std;
int n,m,x,y,i,k,Max,m1,m2;
struct muchie
{
    int x,y,c;
};
muchie v[NMAX];
int niv[NMAX],tata[NMAX],d[NMAX];
int cmp(muchie p,muchie q)
{
    if (p.c<q.c) return 1;
    else return 0;
}
int mul(int x)
{
    while(x!=tata[x])
        x=tata[x];
    return x;
}
void calc(int x)
{
    if (tata[x]==x) return;
    calc(tata[x]);
    niv[x]=niv[tata[x]]+1;
}
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)
        scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].c);
    sort(v+1,v+m+1,cmp);
    for (i=1;i<=n;++i) tata[i]=i;
    for (i=1;i<=m;++i)
    {
        m1=mul(v[i].x);
        m2=mul(v[i].y);
        if (m1!=m2)
        {
            tata[m1]=m2;
            d[m1]=v[i].c;
        }
    }
    for (i=1;i<=n;++i)
        if (niv[i]==0) calc(i);
    for (i=1;i<=k;++i)
    {
        scanf("%d%d",&x,&y);
        Max=0;
        while(niv[x]<niv[y])
        {
            Max=max(Max,d[y]);
            y=tata[y];
        }
        while(niv[x]>niv[y])
        {
            Max=max(Max,d[x]);
            x=tata[x];
        }
        while(x!=y)
        {
            Max=max(Max,d[x]);
            Max=max(Max,d[y]);
            x=tata[x];
            y=tata[y];
        }
        printf("%d\n",Max);
    }
    return 0;
}