Cod sursa(job #218803)

Utilizator andrei.12Andrei Parvu andrei.12 Data 3 noiembrie 2008 17:46:16
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<stdio.h>
#include<set>
#include<algorithm>

using namespace std;

#define x first
#define y second
#define lg 100005

int n, m, k, i, cnt[lg], h[lg], rsp[lg], cost[lg], tata[lg], x, y;
pair<int, pair <int, int> > v[lg];

void adg(int x, int y){
	if (x == y)
		return ;
	if (h[x] < h[y])
		tata[x] = y, cost[x] = v[i].x, cnt[y] += cnt[x];
	else{
		if (h[x] == h[y])
			h[x] ++;
		tata[y] = x, cost[y] = v[i].x, cnt[x] += cnt[y];
	}
}
int find(int x){
	int r = x, val;

	for (; tata[r]; r = tata[r])
		val = cost[r];
	while (tata[x]){
		int k = tata[x];
		tata[x] = r;
		cost[x] = val;
		x = k;
	}

	return r;
}

int main()
{
	freopen("radiatie.in", "rt", stdin);
	freopen("radiatie.out", "wt", stdout);

	scanf("%d%d%d", &n, &m, &k);
	for (i = 1; i <= m; i ++)
		scanf("%d%d%d", &v[i].y.x, &v[i].y.y, &v[i].x);
	for (i = 1; i <= n; i ++)
		cnt[i] = 1;

	sort(v+1, v+n+1);

	for (i = 1; i <= m; i ++){
		adg(find(v[i].y.x), find(v[i].y.y));
		
//	       printf("%d\n", cnt[find(1)]);	
		if (cnt[find(1)] == n)
			break;
	}
	printf("%d\n", i);

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

		set<int> q;
		rsp[x] = 0; q.insert(x);
		for (; tata[x]; x = tata[x]){
			rsp[tata[x]] = cost[x];
			q.insert(tata[x]);
		}

		if (q.find(y) != q.end()){
			printf("%d\n", rsp[y]);
			continue;
		}
		for (; tata[y]; y = tata[y]){
			rsp[tata[y]] = max(rsp[tata[y]], cost[y]);
			if (q.find(tata[y]) != q.end()){
				printf("%d\n", rsp[tata[y]]);
				break;
			}
		}
	}

	return 0;
}