Cod sursa(job #913288)

Utilizator tibi9876Marin Tiberiu tibi9876 Data 13 martie 2013 11:20:28
Problema Radiatie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include<fstream>
#include<vector>
#include<algorithm>
using namespace std;

struct st
{
	int x,y,z;
};

st v[30001];
vector <int> a[15001],c[15001];
int l[15001],d[15001][15],e[15001][15],p[15001],t[15001],i,j,n,m,k,x,y,z,q,s,cx,cy;

bool cmp(st a,st b)
{
	return a.z<b.z;
}

void df(int x)
{
	int i;
	for (i=0;i<a[x].size();i++)
	{
		y=a[x][i];
		if (l[y]==0)
		{
			l[y]=l[x]+1;
			t[y]=x;
			p[y]=c[x][i];
			df(y);
		}
	}
}

int main()
{
	ifstream f("radiatie.in");
	ofstream g("radiatie.out");
	f >> n >> m >> k;
	for (i=1;i<=m;i++)
		f >> v[i].x >> v[i].y >> v[i].z;
	sort(v+1,v+m+1,cmp);
	for (i=1;i<=n;i++)
		p[i]=i;
	q=0;
	for (i=1;i<=m;i++)
	{
		x=v[i].x;
		y=v[i].y;
		while (p[x]!=x)
			x=p[x];
		while (p[y]!=y)
			y=p[y];
		if (x!=y)
		{
			p[x]=y;
			v[++q]=v[i];
		}
	}
	for (i=1;i<=q;i++)
	{
		a[v[i].x].push_back(v[i].y);
		a[v[i].y].push_back(v[i].x);
		c[v[i].x].push_back(v[i].z);
		c[v[i].y].push_back(v[i].z);
	}
	for (i=1;i<=n;i++)
	{
		if (l[i]==0)
		{
			l[i]=1;
			p[i]=0;
			df(i);
		}
	}
	for (i=1;i<=n;i++)
	{
		if (l[i]!=1)
		{
			d[i][0]=t[i];
			e[i][0]=p[i];
		}
	}
	for (i=1;i<=n;i++)
		if (l[i]!=1)
			for (j=1;j<=14;j++)
			{
				d[i][j]=d[d[i][j-1]][j-1];
				if (d[i][j]!=0)
					e[i][j]=max(e[i][j-1],e[d[i][j-1]][j-1]);
			}
			/*
	for (i=1;i<=n;i++)
	{
		for (j=0;j<=1;j++)
			g << d[i][j] << ' ';
		g << "\n";
		for (j=0;j<=1;j++)
			g << e[i][j] << ' ';
		g << "\n";
	}
			*/
	for (i=1;i<=k;i++)
	{
		f >> x >> y;
		cx=x;cy=y;
		s=0;
		if (l[x]<l[y])
			swap(x,y);
		if (l[x]>l[y])
		{
			for (j=0;j<=14;j++)
				if (((1 << j) & (l[x]-l[y]))>0)
				{
					s=max(s,e[x][j]);
					x=d[x][j];
				}
		}
		if (x!=y)
		{
			for (j=14;j>=0;j--)
				if (d[x][j]!=d[y][j])
				{
					s=max(s,max(e[x][j],e[y][j]));
					x=d[x][j];
					y=d[y][j];
				}
			s=max(s,max(e[x][0],e[y][0]));
		}
		g << s << "\n";
	}
	return 0;
}