Cod sursa(job #298376)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 6 aprilie 2009 00:12:33
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <iostream>
#include <algorithm>
#define FIN "radiatie.in"
#define FOUT "radiatie.out"
#define F first
#define S second
#define MAX_M 30010
#define MAX_N 15010
using namespace std;
int dad[MAX_N];
pair< int, pair< int ,int > > v[MAX_M];
int rank[MAX_N];
int depth[MAX_N];
int muchie[MAX_N];
int def[MAX_N];
int N,M,K;


void iofile(void){

	freopen(FIN,"rt",stdin);
	freopen(FOUT,"wt",stdout);

	memset(rank,0,sizeof(rank));

	scanf("%d%d%d",&N,&M,&K);

	for (int i=1;i<=N;++i) dad[i]=i;

	for (int i=1;i<=M;++i) scanf("%d%d%d",&v[i].S.F,&v[i].S.S,&v[i].F);

	return ;
}

int set(int x){

	if (x==dad[x]) return x;
	return set(dad[x]);
}

void merge(int x,int y,int cost){

	int Sx=set(x);
	int Sy=set(y);

	if (Sx!=Sy){

		if (rank[Sx]<rank[Sy]) { dad[Sx]=Sy;muchie[Sx]=cost; }
		else {dad[Sy]=Sx;muchie[Sy]=cost;}
		if (rank[Sx]==rank[Sy]) ++rank[Sx];
	}
}

void get_depth(int nod){

	if (def[nod]) return ;
	def[nod]=1;
	if (dad[nod]==nod){depth[nod]=1;} else {
		get_depth(dad[nod]);
		depth[nod]=depth[dad[nod]]+1;
	}
}

void fill_depth(void){

	memset(def,0,sizeof(def));
	for (int i=1;i<=N;++i) if (!def[i]) get_depth(i);
}


void kruskal(void){

	sort(v+1,v+M+1);
	for (int i=1;i<=M;++i) merge(v[i].S.F,v[i].S.S,v[i].F);
}

int ask(int x, int y){

	if (depth[x]<depth[y]){ int aux=x;x=y;y=aux;}
	int maxim=0;
	while (depth[x]>depth[y]){
		maxim=max(maxim,muchie[x]);
		x=dad[x];
	}
	while (x!=y){
		maxim=max(maxim,muchie[x]);
		maxim=max(maxim,muchie[y]);
		x=dad[x];
		y=dad[y];
	}
	return maxim;
}

void solve(void){

	int x,y;
	for (int i=1;i<=K;++i){

		scanf("%d%d",&x,&y);
		printf("%d\n",ask(x,y));

	}
	fclose(stdin);
	fclose(stdout);
}


int main(void){

	iofile();
	kruskal();
	fill_depth();
	solve();
	return 0;
}