Cod sursa(job #383625)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 17 ianuarie 2010 13:06:29
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#define NMAX 15001
#define LMAX 30001
using namespace std;
int n,m,k,ord[LMAX],rad[NMAX];
int grd[NMAX],cost[NMAX];
char viz[NMAX];
struct muchie
{
	int a,b,c;
};
muchie A[LMAX];
void read()
{
	scanf("%d%d%d",&n,&m,&k);
	int i;
	for (i=1; i<=m; i++)
	{
		scanf("%d%d%d",&A[i].a,&A[i].b,&A[i].c);
		ord[i]=i;
	}
}
bool comp(int x,int y)
{
	if (A[x].c<A[y].c)
		return 1;
	return 0;
}
void init()
{
	int i;
	for (i=1; i<=n; i++)
		rad[i]=i;
}
int root(int x)
{
	while (rad[x]!=x)
		x=rad[x];
	return x;
}
void unire(int x,int y,int z)
{
	rad[x]=y;
	cost[x]=z;
}
void get_apm()
{
	int i,x;
	init();
	for (i=1; i<=m; i++)
	{
		x=ord[i];
		if (root(A[x].a)!=root(A[x].b))
			unire(root(A[x].a),root(A[x].b),A[x].c);
	}
}
void dfs(int nod)
{
	viz[nod]=1;
	if (rad[nod]==nod)
		grd[nod]=1;
	else
	{
		if (!viz[rad[nod]])
			dfs(rad[nod]);
		grd[nod]=grd[rad[nod]]+1;
	}
}
void prep()
{
	int i;
	for (i=1; i<=n; i++)
		if (!viz[i])
			dfs(i);
}
inline int max(int x,int y)
{
	return x>y ? x : y;
}
void solve_queries()
{
	int i,x,y,t,rez;
	for (i=1; i<=k; i++)
	{
		scanf("%d%d",&x,&y);
		if (grd[x]<grd[y])
			t=x,x=y,y=t;
		rez=0;
		for ( ; grd[x]>grd[y]; x=rad[x])
			rez=max(rez,cost[x]);
		for ( ; x!=y; x=rad[x],y=rad[y])
			rez=max(rez,max(cost[x],cost[y]));
		printf("%d\n",rez);
	}
}
int main()
{
	freopen("radiatie.in","r",stdin);
	freopen("radiatie.out","w",stdout);
	read();
	sort(ord+1,ord+m+1,comp);
	get_apm();
	prep();
	solve_queries();
	return 0;
}