Cod sursa(job #688563)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 23 februarie 2012 17:42:36
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>
#include <algorithm>
#define NMAx 15100
#define MMAx 30100
using namespace std;

int X[MMAx],Y[MMAx],C[MMAx],v[MMAx];
int Q,n,m,Gr[NMAx],Cost[NMAx],T[NMAx],viz[NMAx];

bool cmp(int a,int b) {
	return C[a]<C[b];
}
int tata(int nod) {
	
	for(;nod!=T[nod];nod=T[nod]);
		
	return nod;
	
}
void unite(int x,int y,int c) {
	
	if(Gr[x]<Gr[y]) {
		T[x]=y;
		Cost[x]=c;
		}
	else {
		T[y]=x;
		Cost[y]=c;
		}
	
	if(Gr[x]==Gr[y])
		Gr[x]++;
	
}
void Kruskal() {
	
	int i,a,b;
	
	sort(v,v+m+1,cmp);
	
	for(i=1;i<=m;i++) {
		a=tata(X[v[i]]);
		b=tata(Y[v[i]]);
		if(a!=b)
			unite(a,b,C[v[i]]);
		}
	
}
int LCA(int x,int y,int color) {
	
	for(;x!=T[x];x=T[x])
		viz[x]=color;
	for(;y!=T[y]&&viz[y]!=color;y=T[y]);
	
	return y;
	
}
int Query(int x,int y,int color) {
	
	int e,w=LCA(x,y,color);
	
	for(e=0;x!=w;x=T[x])
		e=max(e,Cost[x]);
	for(;y!=w;y=T[y])
		e=max(e,Cost[y]);
	
	return e;
	
}
int main() {
	
	int i,x,y;
	ifstream in("radiatie.in");
	ofstream out("radiatie.out");
	in>>n>>m>>Q;
	
	for(i=1;i<=m;i++) {
		in>>X[i]>>Y[i]>>C[i];
		v[i]=i;
		}

	for(i=1;i<=n;i++) {
		T[i]=i;
		Gr[i]=1;
		}
	
	Kruskal();
	
	for(i=1;i<=Q;i++) {
		in>>x>>y;
		out<<Query(x,y,i)<<'\n';
		}
	
	in.close();
	out.close();
	
	return 0;
	
}