Cod sursa(job #178900)

Utilizator tm_raduToma Radu tm_radu Data 15 aprilie 2008 13:00:27
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <stdio.h>
#define NM 15001
#define MM 30001
#define Max(a, b) ((a) > (b) ? (a) : (b))

int n, m, T;
int i, j, k;
int h[NM], t[NM], lev[NM], c[NM];
int a, b, cmax;
struct edge {
    int x, y, c;
} e[MM], aux;

void Qsort(int st, int dr);
void Kruskal();
int Find(int nod);
void Union(int i, int j);

int main()
{
    freopen("radiatie.in", "r", stdin);
    freopen("radiatie.out", "w", stdout);
    scanf("%d %d %d", &n, &m, &T);
    for ( i = 1; i <= m; i++ )
        scanf("%d %d %d", &e[i].x, &e[i].y, &e[i].c);
    Kruskal();
    
    for ( int g = 1; g <= T; g++ )
    {
        scanf("%d %d", &a, &b);
        cmax = 0;
        while ( lev[a] > lev[b] ) cmax = Max(cmax, c[a]), a = t[a];
        while ( lev[b] > lev[a] ) cmax = Max(cmax, c[b]), b = t[b];
        while ( a != b ) cmax = Max(cmax, Max(c[a], c[b])), a = t[a], b = t[b];
        printf("%d\n", cmax);
    }    
           
    return 0;
}

void Qsort(int st, int dr)
{
    int i = st-1;
    int j = dr+1;
    do
    {
        do { i++; } while ( e[i].c < e[st].c );
        do { j--; } while ( e[st].c < e[j].c );
        if ( i <= j )
            aux = e[i], e[i] = e[j], e[j] = aux;
    } while ( i <= j );
    if ( i < dr ) Qsort(i, dr);
    if ( st < j ) Qsort(st, j);
}

void Kruskal()
{
    Qsort(1, m);
    for ( i = 1; i <= n; i++ )
        t[i] = i, h[i] = lev[i] = 1, c[i] = 0;
    int nrm = n;
    for ( k = 1; k <= m; k++ )
    {
        if ( nrm == 1 ) break;
        int r1 = Find(e[k].x);
        int r2 = Find(e[k].y);
        if ( r1 != r2 )
        {
            Union(r1, r2);
            nrm--;
        }
    }
}

int Find(int nod)
{
    if ( t[nod] != nod ) return Find(t[nod]);
    return t[nod];
}

void Union(int i, int j)
{
    if ( h[i] > h[j] ) t[j] = i, lev[j] = lev[i]+1, c[j] = e[k].c;
    else
    {
        t[i] = j, lev[i] = lev[j]+1, c[i] = e[k].c;
        if ( h[i] == h[j] ) h[j]++;
    }
}