Cod sursa(job #181071)

Utilizator razvi9Jurca Razvan razvi9 Data 17 aprilie 2008 20:49:52
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include<cstdio>
#include<cstdlib>
#include<vector>
#define max(a,b) (a)>(b)?(a):(b)
#define mp std::make_pair<int,int>
int n,m,K,i,r[15001],t[15001];
int cost[15001][20],T[15001][20];
struct muchie{int x,y,c;};
muchie a[30001];
std::vector<std::pair<int,int> > b[15001];
int cmp(const void *a,const void *b){muchie x,y;x=*(muchie *)a;y=*(muchie *)b;return x.c-y.c;}
inline int rad(int x)
{
	if(x==t[x]) return x;
	t[x]=rad(t[x]);
	return t[x];
}
inline int uneste(int x,int y)
{
	if(rad(x)!=rad(y))
	{
		if(r[t[x]]==r[t[y]])
			r[t[x]]++,t[t[y]]=t[x];
		else
			if(r[t[x]]>r[t[y]])
				t[t[y]]=t[x];
			else
				t[t[x]]=t[y];
		return 1;
	}
	return 0;
}
inline void kruskal()
{
	int left=n-1,i;
	for(i=1;i<=n;i++)
		t[i]=i,r[i]=0;
	i=1;
	while(left)
	{
		if(uneste(a[i].x,a[i].y))
		{
			b[a[i].x].push_back(mp(a[i].y,a[i].c));
			b[a[i].y].push_back(mp(a[i].x,a[i].c));
			left--;
		}
		i++;
	}
}
void df(int vf,int niv)
{
	t[vf]=niv;
	for(int i=0;i<b[vf].size();i++)
		if(!t[b[vf][i].first])
		{
			T[b[vf][i].first][0]=vf;
			cost[b[vf][i].first][0]=b[vf][i].second;
			df(b[vf][i].first,niv+1);
		}
}
int main()
{
	freopen("radiatie.in","r",stdin);
	freopen("radiatie.out","w",stdout);
	scanf("%d %d %d",&n,&m,&K);
	for(i=1;i<=m;i++)
		scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].c);
	qsort(a+1,m,sizeof(muchie),cmp);
	kruskal();
	memset(t,0,sizeof(t));
	df(1,1);
	int i,j,k;
	for(i=1;(1<<i)<=n;i++)
		for(j=1;j<=n;j++)
		{
			T[j][i]=T[T[j][i-1]][i-1];
			cost[j][i]=max(cost[j][i-1],cost[T[j][i-1]][i-1]);
		}
	k=i-1;
	int x,y,maxim;
	for(i=1;i<=K;i++)
	{
		scanf("%d %d",&x,&y);
		maxim=0;
		for(j=k;j>=0 && t[x]!=t[y];j--)
		{
			if(t[T[x][j]]>=t[y])
			{
				maxim=max(maxim,cost[x][j]);
				x=T[x][j];
			}
			if(t[T[y][j]]>=t[x])
			{
				maxim=max(maxim,cost[y][j]);
				y=T[y][j];
			}
		}
		if(x!=y)
		{
			for(j=k;j>0;j--)
				if(T[x][j]!=T[y][j])
				{
					maxim=max(maxim,max(cost[x][j],cost[y][j]));
					x=T[x][j];
					y=T[y][j];
				}
			for(j=0;j<=k;j++)
				if(T[x][j]==T[y][j]) break;
			maxim=max(maxim,max(cost[x][j],cost[y][j]));
		}
		printf("%d\n",maxim);
	}
	fclose(stdout);
	return 0;
}