Cod sursa(job #701270)

Utilizator eukristianCristian L. eukristian Data 1 martie 2012 14:51:36
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <cstdio>
#include <algorithm>
#define MAXN 15001
using namespace std;

struct edge {
	unsigned short x, y;
	int cost;
} edges[MAXN << 1];

int n, m, k, edgeCount;
int parent[MAXN], rank[MAXN], costToParent[MAXN], lastWalk[MAXN];

inline bool compare(const edge &a, const edge &b)
{
	return a.cost < b.cost;
}

int findSet(int vertex)
{
	if (parent[vertex] != 0)
		return findSet(parent[vertex]);
	return vertex;
}

void link(int v1, int v2, int cost)
{
	if (rank[v1] > rank[v2])
	{
		parent[v2] = v1;
		costToParent[v2] = cost;
	}
	else
	{
		parent[v1] = v2;
		costToParent[v1] = cost;
		if (rank[v1] == rank[v2])
			rank[v2]++;
	}
}

int query(int a, int b, int color)
{
	int max = 0, first = a;
	
	while (parent[a] != 0)
	{
		lastWalk[a] = color;
		a = parent[a];
	}
	
	while (parent[b] != 0 && lastWalk[b] != color)
	{
		if (max < costToParent[b])
			max = costToParent[b];
		b = parent[b];
	}
			
	while (first != b)
	{
		if (max < costToParent[first])
			max = costToParent[first];
		first = parent[first];
	}
	
	return max;
}

int main()
{
	freopen("radiatie.out", "w", stdout);
	freopen("radiatie.in", "r", stdin);
	scanf("%d%d%d", &n, &m, &k);
	
	for (int i = 1 ; i<= m ; ++i)
	{
		int a, b, c;
		scanf("%d%d%d", &a, &b, &c);
		edges[++edgeCount].x = a;
		edges[edgeCount].y = b;
		edges[edgeCount].cost = c;
	}
	
	sort(edges + 1, edges + m + 1, compare);
	
	for (int i = 1 ; i <= m ; ++i)
	{
		int s1, s2;
		if ((s1 = findSet(edges[i].x)) != (s2 = findSet(edges[i].y)))
			link(s1, s2, edges[i].cost);
	}
	
	for (int i = 1 ; i <= k ; ++i)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		printf("%d\n", query(a, b, i));
	}
	
	return 0;
}