Cod sursa(job #273957)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 9 martie 2009 11:39:27
Problema Radiatie Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.19 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 ) {
	if ( Comp[nod] == nod) {
		return nod;
	}
	return grupa(Comp[nod]);
}
void Apm () {
	int i, a, b;
	for (i = 1; i <= N; ++ i)	Comp[i] = i;
	
	for (i = 0; i < M; ++ i) {
		if ( (a = grupa(Graf[i].A)) != (b = grupa(Graf[i].B)) ) {
			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 a;
	if ( Comp[nod] == nod || NrFii[nod] == 2) {
		return -13;
	}
	return ( (a = search_dist(Comp[nod])) > Cost[nod]) ? a : Cost[nod];
}

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("%d%d%d", &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("%d%d", &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 :)