Cod sursa(job #132475)

Utilizator megabyteBarsan Paul megabyte Data 5 februarie 2008 21:57:45
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define INF "radiatie.in"
#define OUF "radiatie.out"
#define pb(arg) push_back(arg)
#define sz(arg) arg.size()


using namespace std;
const int NMAX=16002;
const int MMAX=30002;
const int BIG=2000000000;

struct arc
{
	short x,y;
	int l;
}ed[MMAX];
struct arc2
{
	short nb;
	int l;
};
short n,m,k,niv[NMAX]={0},cc[NMAX]={0},t[NMAX]={0};
int lng[NMAX]={0};
char viz[NMAX]={0};
vector<short> mc[NMAX];
vector<arc2> a[NMAX];//ARBORE

bool cmp(arc alfa,arc beta) {return alfa.l<beta.l;}
void apm()
{
	sort(ed+1,ed+m+1,cmp);
	short i,nbx,nby,nr,aux,j;
	arc2 ab;
	for(i=1;i<=n;++i) 
	{
		mc[i].pb(i);
		cc[i]=i;
	}
	
	i=1;nr=n-1;
	while(nr>0)
	{
		while(i<=m&&cc[ed[i].x]==cc[ed[i].y]) ++i;
		nbx=ed[i].x;nby=ed[i].y;
//		printf("%hd %hd\n",nbx,nby);
		ab.l=ed[i].l;
		ab.nb=nby;a[nbx].pb(ab);
		ab.nb=nbx;a[nby].pb(ab);

		if(cc[nbx]>cc[nby])
		{
			aux=nbx;
			nbx=nby;
			nby=aux;
		}
		for(j=0;j<sz(mc[nby]);++j) cc[mc[nby][j]]=nbx;
		mc[nbx].insert(mc[nbx].end(),mc[nby].begin(),mc[nby].end());
		mc[nby].clear();
		--nr;
	}
}

void dfs(short nd,short lev)
{
	short i,nb;
	viz[nd]=1;niv[nd]=lev;
	for(i=0;i<sz(a[nd]);++i)
	if(!viz[a[nd][i].nb]) 
	{
		nb=a[nd][i].nb;
		t[nb]=nd;lng[nb]=a[nd][i].l;
		dfs(nb,lev+1);
	}
}

int query(short x,short y)
{
	int max=-1;
	short i,j;
	i=x;j=y;
	if(niv[i]>niv[j])
	{
		while(i>1&&niv[i]>niv[j])
		{
			if(max<lng[i]) max=lng[i];
			i=t[i];
		}
	}
	else
	{
		while(j>1&&niv[j]>niv[i])
		{
			if(max<lng[j]) max=lng[j];
			j=t[j];
		}
	}
	while(i>1&&i!=j)
	{
		if(max<lng[i]) max=lng[i];
		if(max<lng[j]) max=lng[j];
		i=t[i];j=t[j];
	}
	return max;
}

int main()
{
	FILE *in,*out;
	in=fopen(INF,"r");
	out=fopen(OUF,"w");
	short i,alfa,beta;
	int v;
	fscanf(in,"%hd%hd%hd",&n,&m,&k);
	for(i=1;i<=m;++i)
	{
		fscanf(in,"%hd%hd%d",&ed[i].x,&ed[i].y,&ed[i].l);
	}

	apm();
	for(i=0;i<=n;++i) lng[i]=BIG;
	dfs(1,1);
//	for(i=1;i<=n;++i) printf("%hd ",sz(a[i])); 
	for(i=1;i<=k;++i)
	{
		fscanf(in,"%hd%hd",&alfa,&beta);
		v=query(alfa,beta);
		fprintf(out,"%d\n",v);
//		if(v<1) while(1);
	}
	
	fclose(in);fclose(out);
	return 0;
}