Cod sursa(job #1001224)

Utilizator andrettiAndretti Naiden andretti Data 24 septembrie 2013 19:05:06
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<stdio.h>
#include<algorithm>
#define maxn 15005
#define maxm 30005
using namespace std;

struct edg{int x,y,c;} a[maxm];
int n,m,K;
int father[maxn],h[maxn],cst[maxn];

void read()
{
    scanf("%d%d%d",&n,&m,&K);
    for(int i=1;i<=m;i++)
        scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].c);
}

int search(int k)
{
    if(father[k]==k) return k;
    return search(father[k]);
}

bool cmp(const edg &a,const edg &b){
    return a.c<b.c;
}

void kruskal()
{
    int rx,ry;

    sort(a+1,a+m+1,cmp);
    for(int i=1;i<=n;i++) father[i]=i,h[i]=1;
    for(int i=1;i<=m;i++)
    {
        rx=search(a[i].x); ry=search(a[i].y);
        if(rx!=ry)
        {
            if(h[rx]<=h[ry])
            {
                father[rx]=ry;
                cst[rx]=a[i].c;
                h[ry]+=h[rx];
            }
            else
            {
                father[ry]=rx;
                cst[ry]=a[i].c;
                h[rx]+=h[ry];
            }
        }
    }
}

void solve()
{
    int x,y,sol=0,k;
    for(int i=1;i<=K;i++)
    {
        scanf("%d%d",&x,&y); sol=0;
        for(k=x;father[k]!=k;k=father[k]) sol=max(sol,cst[k]);
        for(k=y;father[k]!=k;k=father[k]) sol=max(sol,cst[k]);
        printf("%d\n",sol);
    }
}

int main()
{
    freopen("radiatie.in","r",stdin);
    freopen("radiatie.out","w",stdout);

    read();
    kruskal();
    solve();

    fclose(stdin);
    fclose(stdout);
    return 0;
}