Cod sursa(job #1160915)

Utilizator taigi100Cazacu Robert taigi100 Data 30 martie 2014 21:50:19
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
/*
	Keep It Simple!
*/

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#include<cstdio>
#include<algorithm>

#define MaxN 15005
#define MaxM 30005
#define MaxV(a,b) ((a)>(b)?(a):(b))

using namespace std;

struct drum
{
	int x, y, c;
}roads[MaxM];

int T[MaxN];
int C[MaxN];
int Rg[MaxN];
int Level[MaxN];
int Pad[MaxN];

int N, M, K;

bool cmp(drum First, drum Second)
{
	return First.c < Second.c;
}

int Find(int node)
{
	int root;
	for (root = node; Pad[root] != root; root = Pad[root]);

	while (node != root)
	{
		int aux = T[node];
		T[node] = root;
		node = aux;
	}

	return root;
}

void Unite(int x, int y,int cost)
{
	if (Rg[x] > Rg[y])
	{
		Pad[y] = x;
		T[y] = x;
		C[y] = cost;
		Level[y] = Level[x] + 1;
	}
	else
	{
		Pad[x] = y;
		T[x] = y;
		C[x] = cost;
		Level[x] = Level[y] + 1;
	}
	if (Rg[x] == Rg[y]) Rg[x]++;

}

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

	scanf("%d%d%d", &N, &M, &K);

	for (int i = 1; i <= M; i++)
		scanf("%d%d%d", &roads[i].x, &roads[i].y, &roads[i].c);

	sort(roads + 1, roads + M + 1, cmp);

	for (int i = 1; i <= N; i++)
	{
		Pad[i] = i;
		T[i] = i;
		Rg[i] = 1;
	}

	for (int i = 1; i <= M; i++)
		if ( Find(roads[i].x) != Find(roads[i].y))
			Unite(roads[i].x, roads[i].y, roads[i].c);
			
		int x, y;

		for (int i = 1; i <= K; i++)
		{
			scanf("%d%d", &x, &y);

			int maxvalue = -1;
			while (x != y)
			{
				if (Level[x] > Level[y])
				{
					maxvalue = MaxV(maxvalue, C[x]);
					x = T[x];
				}
				else
				{
					maxvalue = MaxV(maxvalue, C[y]);
					y = T[y];
				}
			}

			printf("%d\n", maxvalue);
		}

}