Cod sursa(job #935599)

Utilizator rudarelLup Ionut rudarel Data 4 aprilie 2013 10:56:43
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<stdio.h>
#include<stdlib.h>

#define MMAX 30010
#define NMAX 15010
#define nd(a) (*(t_edge *)(a))

typedef struct
{
	int x, y, c;
}t_edge;

int cmp(const void *a, const void *b);
int gasit(int x);
void uneste(int x, int y, int cost);


int N, M, T[NMAX], rang[NMAX], d[NMAX], c[NMAX], Q;
t_edge edge[MMAX];

int main()
{
	int i, j, max, a, b, aux;

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

	scanf("%d%d%d", &N, &M, &Q);
	for(i = 0; i < M; i++)
	scanf("%d%d%d", &edge[i].x, &edge[i].y, &edge[i].c);
	qsort(edge, M, sizeof(t_edge), cmp);

	for(i = 1; i <= N; i++)
	T[i] = i, d[i] = 1;

	for(i = 0; i < M; i++)
	{
		if(gasit(edge[i].x) == gasit(edge[i].y)) continue;
		uneste(gasit(edge[i].x), gasit(edge[i].y), edge[i].c);
	}
	for(i = 1; i <= N; i++) gasit(i);

	for(i = 0; i < Q; i++)
	{
		scanf("%d%d", &a, &b);
		max = 0;
		if(d[a] < d[b]) aux = a, a = b, b = aux;
		for(; d[a] > d[b]; a = T[a])
		max = max < c[a] ? c[a] : max;
		for(; a != b; a = T[a], b = T[b])
		max = max < c[a] ? c[a] : max,
		max = max < c[b] ? c[b] : max;
		printf("%d\n", max);
	}
	return 0;
}

int cmp(const void *a, const void *b)
{
	return nd(a).c - nd(b).c;
}

int gasit(int x)
{
	int nr = 0, y;
	y = x;
	for(; x != T[x]; x = T[x], nr++);
	d[y] = nr;
	return x;
}

void uneste(int x, int y, int cost)
{
	if(rang[x] <= rang[y])
	{
		T[x] = y, c[x] = cost;
		if(rang[x] == rang[y])
		rang[y]++;
	}
	else T[y] = x, c[y] = cost;
}