Cod sursa(job #1303152)

Utilizator serban_ioan97Ciofu Serban serban_ioan97 Data 27 decembrie 2014 17:50:39
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <cstdio>
#include <algorithm>
#define nmax 15005
#define mmax 30003
using namespace std;

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

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

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

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

void level_determ(int x)
{
    if(dad[x]==x) return;

    level_determ(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_determ(edge[i].x);
        dad2=dad_determ(edge[i].y);
        if(dad1!=dad2)
        {
            dad[dad1]=dad2;
            cost[dad1]=edge[i].c;
        }
    }

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

    int sol;
    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, level[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;
}