Cod sursa(job #503725)

Utilizator cdascaluDascalu Cristian cdascalu Data 24 noiembrie 2010 17:56:00
Problema Radiatie Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include<stdio.h>
#include<algorithm>
#define MAX 15001
using namespace std;
int n,m,k,X,Y,T[MAX],R[MAX],L[3][3*MAX],cont,viz[MAX],ok,maxim;
struct muchie
{
	int x,y,c;
}v[MAX*2];
int cmp(muchie a,muchie b)
{
	return (a.c<b.c);
}
void compress(int x,int rad)
{
	int var;
	for(;x!=T[x];x = var)
	{
		var = T[x];
		T[x] = rad;
	}
}
int find(int x)
{
	int i=x;
	for(;i!=T[i];i=T[i]);
	
	compress(x,i);
	return i;
}
void unite(int x,int y)
{
	if(R[x] >= R[y])
	{
		R[x]+=R[y];
		T[y] = x;
	}
	else
	{
		R[y]+=R[x];
		T[x] = y;
	}
}
void add(int x,int y,int c)
{
	if(!L[1][x])
	{
		L[1][x] = cont;
	}
	else
	{
		L[1][L[0][x]] = cont;
	}
	L[0][x] = cont;
	L[0][cont] = y;
	L[1][cont] = 0;
	L[2][cont] = c;
	++cont;
}
void apm()
{
	int i,var = 1;
	for(i=1;i<=m && var<=n-1;++i)
	if(find(v[i].x)!=find(v[i].y))
	{
		//printf("%d %d\n",v[i].x,v[i].y);
		unite(find(v[i].x), find(v[i].y));
		add(v[i].x,v[i].y,v[i].c);
		add(v[i].y,v[i].x,v[i].c);
		++var;
	}
}
int MAXIM(int a,int b)
{
	if(a>=b)return a;
	return b;
}
void DF(int nod,int nodf)
{
	viz[nod] = cont;
	if(nod!=nodf)
	{
		int var = L[1][nod];
		while(var && !ok)
		{
			if(viz[L[0][var]] != cont)
				DF(L[0][var],nodf);
			
			if(ok)maxim = MAXIM(maxim,L[2][var]);
			var = L[1][var];
		}
	}
	else
	{
		ok = 1;
	}
}
int main()
{
	FILE*f = fopen("radiatie.in","r");
	FILE*g = fopen("radiatie.out","w");
	fscanf(f,"%d%d%d",&n,&m,&k);
	int i;
	cont = n+1;
	for(i=1;i<=m;++i)
	{
		fscanf(f,"%d%d%d",&v[i].x,&v[i].y,&v[i].c);
		if(i<=n){T[i] = i;R[i] = 1;}
	}

	sort(v+1,v+m+1,cmp);
	apm();
	cont = 1;
	for(i=1;i<=k;++i)
	{
		fscanf(f,"%d%d",&X,&Y);
		ok = 0;maxim = -1;
		DF(X,Y);
		fprintf(g,"%d\n",maxim);
		
		++cont;
	}
	
	fclose(f);
	fclose(g);
	return 0;
}