Cod sursa(job #1303164)

Utilizator serban_ioan97Ciofu Serban serban_ioan97 Data 27 decembrie 2014 18:03:34
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <cstdio>
#include <algorithm>
#define nmax 15010
#define mmax 30010

using namespace std;

int dad1, dad2, n, m, i, k, sol, x, y, dad[nmax], level[nmax], cost[nmax];

struct edges
{
    int x, y, c;
}edge[30100];

inline bool cmp(edges x,edges y)
{
    return x.c<y.c;
}

inline int dad_det(int x)
{
    while(x!=dad[x])
    x=dad[x];
    return x;
}

void level_det(int x)
{
    if(dad[x]==x) return ;
    level_det(dad[x]);
    level[x]=level[dad[x]]+1;
}

int main()
{
    freopen("radiatie.in", "rt", stdin);
    freopen("radiatie.out", "wt", stdout);

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

    for(i=1; i<=m; ++i)
    scanf("%d%d%d", &edge[i].x, &edge[i].y, &edge[i].c);

    sort(edge+1, edge+m+1, cmp);

    for(i=1; i<=n; ++i) dad[i]=i;

    for(i=1; i<=m; ++i)
    {
        dad1=dad_det(edge[i].x);
        dad2=dad_det(edge[i].y);

        if(dad1!=dad2)
        {
            dad[dad1]=dad2;
            cost[dad1]=edge[i].c;
        }
    }

    for(i=1; i<=n; ++i)
    if(!level[i]) level_det(i);

    for(i=1; i<=k; ++i)
    {
        scanf("%d%d", &x, &y);

        sol=0;

        while(level[x]<level[y])
        {
            sol=max(sol, cost[y]);
            y=dad[y];
        }

        while(level[x]>level[y])
        {
            sol=max(sol, cost[x]);
            x=dad[x];
        }

        while(x!=y)
        {
            sol=max(sol,cost[x]);
            sol=max(sol,cost[y]);
            x=dad[x];
            y=dad[y];
        }
        printf("%d\n", sol);
    }

    return 0;
}