Cod sursa(job #424869)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 25 martie 2010 11:56:48
Problema Radiatie Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>

using namespace std;

#define N 15100
#define M 30100

typedef struct{int x, y, c;} muchii;
muchii mu[M];

int tata[N], L[N], h[N], cost[N], n, m, k;


void citire(), apm(), rezolva();

bool cmp(int a, int b){
    return (mu[a].c < mu[b].c);
}

inline int max(int a, int b){ if (a > b) return a; else return b;}



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

    citire();

    apm();

    rezolva();

    return 0;
}

void citire(){
int i;
    scanf("%d %d %d", &n, &m, &k);

    for (i = 1; i <= m; i++){

        h[i] = i;
        scanf("%d %d %d", &mu[i].x, &mu[i].y, &mu[i].c);

    }
}

void apm(){
int i, cur, u, v, r1, r2;

    sort(h+1, h+m+1, cmp);
    for (i = 1; i <= n; i++) tata[i] = i;

    for (i = 1; i <= m; ++i){
        cur = h[i];

        for (u = mu[cur].x, r1 = 0; tata[u] != u; r1++, u = tata[u]);
        for (v = mu[cur].y, r2 = 0; tata[v] != v; r2++, v = tata[v]);

        if (u != v){
			if (r1 < r2){
                tata[v] = u;
                cost[v] = mu[cur].c;
			}
			else{
				tata[u] = v;
				cost[u] = mu[cur].c;
			}
        }
    }
}


void rezolva(){
int Sol, i, j, xx, yy;
    for (i = 1; i <= n; i++)
        for (j = i; tata[j] != j; j = tata[j])
            L[i]++;

    for ( ; k; --k){
        scanf("%d %d", &xx, &yy);
        Sol = 0;
        for ( ;L[xx] > L[yy]; xx = tata[xx])
            Sol = max(cost[xx],Sol);
        for ( ;L[yy] > L[xx]; yy = tata[yy])
            Sol = max(cost[yy],Sol);
        for ( ; xx != yy; xx = tata[xx], yy = tata[yy])
            Sol = max(cost[xx], max(cost[yy], Sol));
        printf("%d\n", Sol);
    }
}