Cod sursa(job #23449)

Utilizator ionescu_bogdanIonescu Bogdan-Gabriel ionescu_bogdan Data 28 februarie 2007 19:37:46
Problema Radiatie Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
#include <string.h>

#define nmax 15010
#define kmax 15010

int n,c[nmax],k,m,i,j,f,l,mid,aa,bb,cc,nc,ka[kmax],kb[kmax],kk;

struct nod
{
    int x,d;
    nod *n;
};

nod *adj[nmax],*aux;

void fill(int x,int xxx)
{
	nod *aux;
	for (aux=adj[x];aux!=NULL;aux=aux->n)
		if ((!c[aux->x])&&(aux->d<=xxx))
			c[aux->x]=nc,fill(aux->x,xxx);
}

int solve(int xxx)
{
	memset(c,0,sizeof(c)),nc=0;
	for (i=1;i<=n;i++)
		if (!c[i])
			c[i]=++nc,fill(i,xxx);
	if (c[ka[kk]]!=c[kb[kk]])
			return 0;
	return 1;
}

int main()
{
	freopen("radiatie.in","r",stdin);
	freopen("radiatie.out","w",stdout);

	scanf("%d%d%d",&n,&m,&k);
	for (i=0;i<m;i++)
	{
		scanf("%d%d%d",&aa,&bb,&cc);
		aux=new nod;
		aux->x=bb,aux->d=cc,aux->n=adj[aa],adj[aa]=aux;
		aux=new nod;
		aux->x=aa,aux->d=cc,aux->n=adj[bb],adj[bb]=aux;
	}
	for (i=0;i<k;i++)
		scanf("%d%d",ka+i,kb+i);

	for (kk=0;kk<k;kk++)
	{
		f=1,l=1000000000;
		while (l-f>1)
		{
			mid=(f+l)/2;
			if (solve(mid))
				l=mid;
			else
				f=mid+1;
		}

		if (solve(f))
			printf("%d\n",f);
		else
			printf("%d\n",l);
	}

	return 0;
}