Cod sursa(job #721320)

Utilizator gabriel93Robu Gabriel gabriel93 Data 23 martie 2012 16:36:50
Problema Radiatie Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include<fstream>
#include<vector>
#define pb push_back
#define mp make_pair
#define f first
#define s second
using namespace std;
int n,m,k,nh;

struct heap
{
	int v1,v2,c;
};

struct arb
{
	int c,t,dr;
};

vector< pair <int,int> > g[15002];
heap h[15002];
arb a[15002];
char viz[15002];

void citire()
{
	int i,x,y,c;
	scanf("%d %d %d",&n,&m,&k);
	for(i=1;i<=m;++i)
	{
		scanf("%d %d %d",&x,&y,&c);
		g[x].pb(mp(y,c));
		g[y].pb(mp(x,c));
	}
}

void swap(int x,int y)
{
	heap aux;
	aux=h[x];
	h[x]=h[y];
	h[y]=aux;
}

void heapjos(int k)
{
	int x,fs,fd;
	do
	{
		x=0;
		fs=2*k;
		fd=2*k+1;
		if(fs<=nh)
		{
			x=fs;
			if(fd<=nh && h[fd].c < h[fs].c)
				x=fd;
			if(h[x].c >= h[k].c)
				x=0;
		}
		if(x)
		{
			swap(x,k);
			k=x;
		}
	}while(x);
}

void heapsus(int k)
{
	int x;
	x=k/2;
	while(k>1 && h[k].c < h[x].c)
	{
		swap(x,k);
		k=x;
		x=k/2;
	}
}

void sterg()
{
	h[1]=h[nh];
	--nh;
	heapjos(1);
}

void add(int v1,int v2,int c)
{
	++nh;
	h[nh].v1=v1;
	h[nh].v2=v2;
	h[nh].c=c;
	heapsus(nh);
}

void prim()
{
	int v1,v2;
	vector< pair <int,int> >::iterator it;
	for(it=g[1].begin();it!=g[1].end();++it)
		add(1,(*it).f,(*it).s);
	viz[1]=1;
	a[1].t=0; a[1].c=0; a[1].dr=0;
	while(nh)
	{
		v1=h[1].v1;
		v2=h[1].v2;
		if(viz[v1]==1 && viz[v2]==0)
		{
			a[v2].t=v1;
			a[v2].c=h[1].c;
			a[v2].dr=a[v1].dr+1;
			viz[v2]=1;
			sterg();
			for(it=g[v2].begin();it!=g[v2].end();++it)
				if(viz[(*it).f]==0)
					add(v2,(*it).f,(*it).s);
		}
		else
			sterg();
	}
}

void rezolv()
{
	int i,x,y,dmax;
	for(i=1;i<=k;++i)
	{
		scanf("%d %d",&x,&y);
		dmax=-1;
		while(a[x].dr < a[y].dr)
		{
			if(a[y].c > dmax)
				dmax=a[y].c;
			y=a[y].t;
		}
		while(a[x].dr > a[y].dr)
		{
			if(a[x].c > dmax)
				dmax=a[x].c;
			x=a[x].t;
		}
		while(x!=y)
		{
			if(a[x].c > dmax)
				dmax=a[x].c;
			if(a[y].c > dmax)
				dmax=a[y].c;
			x=a[x].t;
			y=a[y].t;
		}
		printf("%d\n",dmax);
	}
}

int main()
{
	freopen("radiatie.in","r",stdin);
	freopen("radiatie.out","w",stdout);
	citire();
	prim();
	rezolv();
	fclose(stdin);
	fclose(stdout);
	return 0;
}