Cod sursa(job #301024)

Utilizator katakunaCazacu Alexandru katakuna Data 7 aprilie 2009 20:59:20
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
using namespace std;
#include <cstdio>
#include <algorithm>

#define Nmax 15010
#define Mmax 30010

struct muchie {int x, y, c;} M[Mmax];

int n, m, k, i, aux, t1, t2, T[Nmax], D[Nmax], sol, viz[Nmax], x, y, cm[Mmax];
FILE *f = fopen("radiatie.in", "r");

int cmp(muchie a, muchie b){
	return a.c < b.c;
}

void citire(){

	fscanf(f,"%d %d %d", &n, &m, &k);
	
	for(i = 1; i <= m; i++)
		fscanf(f,"%d %d %d", &M[i].x, &M[i].y, &M[i].c);
	
}

int tata(int t){

	while( T[t] > 0 )
		t = T[t];

	return t;
}

void kruskal(){

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

	for(i = 1; i <= n; i++)
		T[i] = -1;
	
	for(i = 1; i <= m; i++){
		t1 = tata(M[i].x); t2 = tata(M[i].y);
		if( t1 != t2 ){
			if( -T[t1] > -T[t2] ){
				T[t1]+= T[t2];
				T[t2] = t1;
				cm[t2] = M[i].c;
			}
			
			else{
				T[t2]+= T[t1];
				T[t1] = t2;
				cm[t1] = M[i].c;
			}
			
		}
	}
	
}

void parc(int nod){

	if( viz[nod] ) return ;
	viz[nod] = 1;
	
	if(T[nod] < 0) {D[nod] = 1; return;}
	
	parc(T[nod]);
	D[nod] = D[T[nod]] + 1;
	
}

void solve(){

	FILE *g = fopen("radiatie.out", "w");
	
	for(i = 1; i <= n; i++)
		if( !viz[i] )
			parc(i);

	for(i = 1; i <= k; i++){
		fscanf(f,"%d %d",&x, &y);
		sol = 0;
		if( D[x] < D[y] ){aux = x; x = y; y = aux;}
		
		while( D[x] > D[y] ){ 
			sol = max(sol, cm[x]);
			x = T[x];
		}
		
		while( x != y ){
			sol = max(sol, cm[x]);
			x = T[x];
			
			sol = max(sol, cm[x]);
			y = T[y];
		}
		
		fprintf(g,"%d\n",sol);
	}

	fclose(f);
	fclose(g);
}	


int main(){

	citire();
	kruskal();
	solve();

}