Cod sursa(job #605652)

Utilizator SpiderManSimoiu Robert SpiderMan Data 1 august 2011 15:22:42
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
# include <algorithm>
# include <cstdio>
# include <vector>
using namespace std;

# define x first
# define y second

const char *FIN = "radiatie.in", *FOU = "radiatie.out";
const int MAX = 15005;

int N, M, Test, T[MAX], R[MAX], m[MAX], viz[MAX], C[MAX];
pair <int, pair <int, int> > P[MAX << 1];
vector <int> SOL;

int search (int x) {
    for (; x != T[x]; x = T[x]);
    return x;
}

void reunion (int x, int y, int z) {
    if (R[x] < R[y]) T[x] = y, C[x] = z;
    else T[y] = x, C[y] = z;
    if (R[x] == R[y]) ++R[x];
}

int sol = 0;
int comp (void) {
    return ++sol;
}

int main (void) {
    freopen (FIN, "r", stdin);
    freopen (FOU, "w", stdout);

    scanf ("%d %d %d", &N, &M, &Test);
    for (int i = 1; i <= M; ++i)
        scanf ("%d %d %d", &P[i].y.x, &P[i].y.y, &P[i].x);
    generate_n (T + 1, N, comp);
    sort (P + 1, P + M + 1);
    for (int i = 1; i <= M; ++i)
        if (search (P[i].y.x) != search (P[i].y.y))
            reunion (search (P[i].y.x), search (P[i].y.y), P[i].x);
    for (int x, y, sol = 0, cnt = 0; Test; --Test, sol = 0) {
        scanf ("%d %d", &x, &y);
        for (m[x] = 0, viz[x] = ++cnt; x != T[x]; x = T[x]) {
            if (sol < C[x]) sol = C[x];
            m[T[x]] = sol, viz[T[x]] = cnt;
        }
        for (sol = 0; viz[y] != cnt; y = T[y])
            if (sol < C[y]) sol = C[y];
        if (sol < m[y]) sol = m[y];
        printf ("%d\n", sol);
    }
}