Cod sursa(job #1028107)

Utilizator supermitelArdelean Razvan Mitel supermitel Data 13 noiembrie 2013 17:28:36
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <cmath>

using namespace std;

struct muchie
{
    int x, y;
    long long d;
}u[30010];

struct cmp
{
    bool operator()(const muchie &a, const muchie &b)
    {
        return a.d < b.d;
    }
};

int n, m, T;

int par[15010], h[15010];
long long cost[15010];

void citire();
void kruskal();
void solve();
int getroot(int x);
bool comun(int x, int y);
void reuniune(muchie mu);
void krset();
long long drum(int x, int y);

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

    citire();
    kruskal();
    solve();

    return 0;
}

void citire()
{
    scanf("%d%d%d", &n, &m, &T);
    for(int i = 0; i < m; i++)
        scanf("%d%d%lld", &u[i].x, &u[i].y, &u[i].d);
    sort(u, u+m, cmp());
}

void kruskal()
{
    krset();
    int i, j = 0;
    for(i = 1; i < n; i++)
    {
        while(comun(u[j].x, u[j].y) && j < m)
            j++;
        reuniune(u[j]);
        j++;
    }
}

void krset()
{
    for(int i = 0; i <= n; i++)
        par[i] = -1;
}

int getroot(int x)
{
    if(par[x] == -1)
        return x;
    return getroot(par[x]);
}

bool comun(int x, int y)
{
    return getroot(x) == getroot(y);
}

void reuniune(muchie mu)
{
    int rx, ry;
    rx = getroot(mu.x);
    ry = getroot(mu.y);
    if(rx == ry)
        return;
    if(h[rx] < h[ry])
        swap(rx, ry);
    par[ry] = rx;
    cost[ry] = mu.d;
    if(h[rx] == h[ry])
        h[rx]++;
}

long long drum(int x, int y)
{
    long long maxim = 0;

    if(h[x] < h[y])
        swap(x, y);
    while(h[y] < h[x])
    {
        maxim = max(maxim, cost[y]);
        y = par[y];
    }
    while(x != y)
    {
        maxim = max(maxim, max(cost[x], cost[y]));
        x = par[x];
        y = par[y];
    }
    return maxim;
}

void solve()
{
    int x, y;
    long long rez;
    for(int i = 0; i < T; i++)
    {
        scanf("%d%d", &x, &y);
        rez = drum(x, y);
        printf("%lld\n", rez);
    }
}