Cod sursa(job #389859)

Utilizator Alexa_ioana_14Antoche Ioana Alexandra Alexa_ioana_14 Data 2 februarie 2010 12:58:14
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 15001
#define M N<<1
#define minn(a,b) ((a>b)?(a):(b))
#include<vector>
vector<short int> x(M),y(M),dist(N,0),gr(N);
vector<int> z(M),c(N);
short int n,k,x1,y1,ind[M];
int m;
void df(short int x)
{
	if (gr[x]==x)
	{
		dist[x]=1;
		return;
	}
	df(gr[x]);
	dist[x]=1+dist[gr[x]];
}
short int find(short int x)
{
	if (gr[x]==x)
		return x;
	return find(gr[x]);
}
void apm()
{
	for (short int i=1; i<=n; ++i)
		gr[i]=i;
	short int u,v;
	for (short int i=1; i<=m; ++i)
	{
		u=find(x[ind[i]]);
		v=find(y[ind[i]]);
		if (u==v) continue;
		gr[u]=v;
		c[u]=z[ind[i]];
		
	}
	for (short int i=1; i<=n; ++i)
		if (!dist[i])
			df(i);
}
void solve(short int x,short int y)
{
	if (dist[x]<dist[y])
		swap(x,y);
	while (dist[x]>dist[y])
	{
		m=minn(m,c[x]);
		x=gr[x];
	}
	while (x!=y)
	{
		m=minn(m,c[x]);
		m=minn(m,c[y]);
		x=gr[x];
		y=gr[y];
	}
}
bool cmp(const short int &i,const short int&j)
{
	return z[i]<z[j];
}
void citire()
{
	freopen("radiatie.in","r",stdin);
	freopen("radiatie.out","w",stdout);
	scanf("%hd%d%hd",&n,&m,&k);
	for (short int i=1; i<=m; ++i)
	{
		scanf("%hd%hd%d",&x[i],&y[i],&z[i]);
		ind[i]=i;
	}
	sort(ind+1,ind+1+m,cmp);
	apm();
	while(k--)
	{
		scanf("%hd%hd",&x1,&y1);
		m=0;
		solve(x1,y1);
		printf("%d\n",m);
	}
}
int main()
{
	citire();
	return 0;
}