Cod sursa(job #273965)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 9 martie 2009 11:47:27
Problema Radiatie Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cassert>
#include <iostream>
#include <iomanip>
#include <queue>
#include <vector>
#include <deque>
#include <algorithm>
#include <set>
#include <bitset>
#include <stack>

using namespace std;

#define pb			push_back
#define mp			make_pair
#define all(v)			v.begin(), v.end()
#define ff			first
#define ss			second
#define pii			pair<int,int>
#define maxN			16384
#define maxM			32768
#define oo			1100000000
struct g {
	int A, B, Cost;
} Graf[maxM];

int Comp[maxN], Level[maxN], Cost[maxN], N, M, K, NrFii[maxN];

inline bool cmp ( g a, g b ) {
	return a.Cost < b.Cost;
}

int grupa ( int nod ) {
	for ( ; Comp[nod] != nod; nod = Comp[nod] ) ;
	return nod;
}

void Apm () {
	int i, a, b, nr = 0;
	for (i = 1; i <= N; ++ i)	Comp[i] = i;
	
	for (i = 0; i < M && nr < N - 1; ++ i) {
		if ( (a = grupa(Graf[i].A)) != (b = grupa(Graf[i].B)) ) {
			++ nr;
			if ( Level[a] < Level[b] ) {
				Comp[a] = b;
				Cost[a] = Graf[i].Cost;
				++ Level[a];
			} else {
				Comp[b] = a;
				Cost[b] = Graf[i].Cost;
				++ Level[b];
			}
		}
	}
}

int search_dist (int nod) {
	int ret = -13;
	for ( ; Comp[nod] != nod && NrFii[nod] < 2; nod = Comp[nod])	
		if (Cost[nod] > ret)	ret = Cost[nod];
	return ret;
}

int main () {
	int i, a, b, nod, x, y;
	
	freopen("radiatie.in", "r", stdin);
	freopen("radiatie.out", "w", stdout);
	
	for (scanf("%d%d%d", &N, &M, &K), i = 0; i < M; ++ i) 
		scanf("%u%u%u", &Graf[i].A, &Graf[i].B, &Graf[i].Cost);

	sort(Graf, Graf + M, cmp);
#ifdef DEBUG
	for (i = 0; i < M; ++ i)
		printf("%d %d %d\n", Graf[i].A, Graf[i].B, Graf[i].Cost);
#endif
	Apm();
#ifdef DEBUG
	for (i = 1; i <= N; ++ i)
		printf("%d ", grupa(i));
	puts("");
	
	for (i = 1; i <= N; ++ i)
		printf("%d ", Level[i]);
#endif
	for (i = 1; i <= K; ++ i) {
		scanf("%u%u", &x, &y);
		for (nod = x ; Comp[nod] != nod ; nod = Comp[nod] ) 	NrFii[nod] ++;
		for (nod = y ; Comp[nod] != nod ; nod = Comp[nod] )	NrFii[nod] ++;
		
		printf("%d\n", ( (a = search_dist(x)) > (b = search_dist(y))) ? a : b);
		
		for (nod = x ; Comp[nod] != nod ; nod = Comp[nod] ) 	NrFii[nod] --;
		for (nod = y ; Comp[nod] != nod ; nod = Comp[nod] )	NrFii[nod] --;
	}
}

// powered by gedit snippets and suse :)