Cod sursa(job #568425)

Utilizator katakunaCazacu Alexandru katakuna Data 31 martie 2011 10:34:06
Problema Radiatie Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 kb
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;

#define Mmax 30010
#define Nmax 15010
#define Log 18

struct muchie {
    int x, y, cst;
} M[Mmax];

int n, m, nq, maxlg, k;
int viz[Nmax], T[Nmax], Niv[Nmax];
int str[Log][Nmax], din[Log][Nmax];
vector < pair <int, int> > V[Nmax];

void citire () {

    int i;
    scanf ("%d %d %d", &n, &m, &nq);
    for (i = 1; i <= m; i++) {
        scanf ("%d %d %d", &M[i].x, &M[i].y, &M[i].cst);
        V[ M[i].x ].push_back ( make_pair (M[i].y, M[i].cst) );
        V[ M[i].y ].push_back ( make_pair (M[i].x, M[i].cst) );
    }
}

bool cmp (const muchie &a, const muchie &b) {

    return a.cst < b.cst;
}

int Tata (int nod) {

    for (; T[nod] > 0; nod = T[nod]);
    return nod;
}

void dfs (int nod, int niv) {

    viz[nod] = 1; Niv[nod] = niv;
    for (vector < pair <int, int> >::iterator it = V[nod].begin (); it != V[nod].end (); it++)
        if (!viz[it->first]) {

            str[0][it->first] = nod;
            din[0][it->first] = it->second;

            for (k = 1; str[k-1][ str[k-1][it->first] ] != 0; k++) {
                if (k > maxlg) maxlg = k;
                str[k][it->first] = str[k-1][ str[k-1][it->first] ];
                din[k][it->first] = max (din[k-1][it->first], din[k-1][ str[k-1][it->first] ]);
            }

            dfs (it->first, niv + 1);
        }
}

void APM () {

    int i, x, y, t1, t2;
    sort (M + 1, M + m + 1, cmp);

    memset (T, -1, sizeof (T));

    for (i = 1; i <= m; i++) {
        x = M[i].x; y = M[i].y;
        t1 = Tata (x); t2 = Tata (y);

        if (t1 != t2) {
            if (-T[t1] >= -T[t2]) {
                T[t1]+= T[t2];
                T[t2] = t1;
            }
            else {
                T[t2]+= T[t1];
                T[t1] = t2;
            }
        }
    }
}

int query (int x, int y) {

    int k, aux, rez = 0;
    if (Niv[x] < Niv[y])
        aux = x, x = y, y = aux;

    for (k = maxlg; k >= 0; k--)
        if (Niv[ str[k][x] ] >= Niv[ y ])
            rez = max (rez, din[k][x]), x = str[k][x];

    for (k = maxlg; k >= 0; k--)
        if (str[k][x]  != str[k][y]) {
            rez = max (rez, max (din[k][x], din[k][y]));
            x = str[k][x];
            y = str[k][y];
        }

    if (x != y)
        rez = max ( rez, max (din[0][x], din[0][y]) );

    return rez;
}

void rezolva () {

    int i, x, y;
    for (i = 1; i <= nq; i++) {
        scanf ("%d %d", &x, &y);
        printf ("%d\n", query (x, y));
    }
}

int main () {

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

    citire ();
    APM ();
    dfs (1, 1);
    rezolva ();

    return 0;
}