Cod sursa(job #29304)

Utilizator DITzoneCAdrian Diaconu DITzoneC Data 8 martie 2007 21:46:24
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define FOR(i,s,d) for(i=(s);i<(d);++i)
#define mmax 32768
#define f first
#define s second
#define mp make_pair

int n,m,k,h[mmax],ct[mmax],par[mmax],cul[mmax];
pair <int,pair<int,int> > V[mmax];

void marc(int i,int z)
{
	cul[i]+=z;
	if(par[i]!=i)
		marc(par[i],z);
}

int doit(int i)
{
	if(cul[i]==2)
		return 0;
	return max(doit(par[i]),ct[i]);
}

int rep(int i)
{
	if(i==par[i])
		return i;
	return rep(par[i]);
}

int main()
{
	int ii,i,j,c;
	freopen("radiatie.in","r",stdin);
	freopen("radiatie.out","w",stdout);
	scanf("%d %d %d",&n,&m,&k);
	FOR(ii,0,m)
	{
		scanf("%d %d %d",&i,&j,&c);
		i--,j--;
		V[ii]=mp(c,mp(i,j));
	}

	FOR(i,0,n)
		par[i]=i;

	sort(V,V+m);
	FOR(ii,0,m)
	{
		i=rep(V[ii].s.f);
		j=rep(V[ii].s.s);
		if(i==j)
			continue;
		if(h[i]>h[j])
			par[j]=i,ct[j]=V[ii].f;
		else
		{
			par[i]=j;
			ct[i]=V[ii].f;
			if(h[i]==h[j])
				h[j]++;
		}
	}

	FOR(ii,0,k)
	{
		scanf("%d %d",&i,&j);
		i--,j--;
		marc(i,1);
		marc(j,1);
		printf("%d\n",max(doit(i),doit(j)));
		marc(i,-1);
		marc(j,-1);
	}
	return 0;
}