Cod sursa(job #524833)

Utilizator loginLogin Iustin Anca login Data 23 ianuarie 2011 11:44:40
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
# include <fstream>
# include <iostream>
# include <algorithm>
# include <vector>
# include <set>
# define DIM 15003
# define pb push_back
# define mp make_pair
# define INF 2000000000
# define max(a,b) (a>b?a:b)
using namespace std;
int n, m, Q, t[16][DIM], c[16][DIM], d[DIM], v[DIM], niv[DIM];
vector< pair<int,int> >G[DIM];
set< pair <int,int> >S;
ifstream fin ("radiatie.in");

void read ()
{
	fin>>n>>m>>Q;
	int x, y, c;
	for(int i=1;i<=m;++i)
	{
		fin>>x>>y>>c;
		G[x].pb(mp(y,c));
		G[y].pb(mp(x,c));
	}
}	

void apm ()
{
	for(int i=2;i<=n;++i)
		c[0][i]=INF;
	v[1]=1;
	S.insert( mp(0,1) );
	int k;
	while (S.size()>0)
	{
		k=S.begin()->second;
		v[k]=1;
		S.erase(S.begin());
		for(int i=0;i<G[k].size();++i)
			if (!v[G[k][i].first] && G[k][i].second<c[0][G[k][i].first])
			{
				niv[G[k][i].first]=niv[k]+1;
				t[0][G[k][i].first]=k;
				c[0][G[k][i].first]=G[k][i].second;
				S.insert(mp(G[k][i].second,G[k][i].first));
			}
	}
}

void constr ()
{
	int cont;
	for(int i=1;cont;++i)
	{
		cont = 0;
		for(int j=2;j<=n;++j)
			if (t[i-1][t[i-1][j]])
			{
				cont=1;
				t[i][j]=t[i-1][t[i-1][j]];
				c[i][j]=max(c[i-1][j],c[i-1][t[i-1][j]]);
			}
	}
}

int dmm (int x, int y)
{
	int a, b, rez=-1, mij, cont=1;
	if (niv[x]<niv[y])a=x, b=y;
	else a=y, b=x;
	if (niv[a]==niv[b])cont=0;
	while (cont)
	{
		if (niv[t[0][b]]==niv[a])
			rez=max(rez,c[0][b]), b=t[0][b], cont=0;
		else
		{
			mij=15;
			while (!t[mij][b] || niv[t[mij][b]]<=niv[a])
				mij/=2;
			rez=max(rez,c[mij][b]);
			b=t[mij][b];
		}
	}
	if (a==b)cont=0;
	else cont=1;
	while (cont)
	{
		if(t[0][a]==t[0][b])
			rez=max(rez,max(c[0][a],c[0][b])), cont = 0;
		else
		{
			mij=15;
			while (mij && (!t[mij][a] || t[mij][a]==t[mij][b]))
				mij/=2;
			rez=max(rez,max(c[mij][a],c[mij][b]));
			a=t[mij][a];
			b=t[mij][b];
		}
	}
	return rez;
}
	
void solve ()
{
	freopen("radiatie.out", "w", stdout);
	int x, y;
	for(;Q--;)
	{
		fin>>x>>y;
		printf("%d\n", dmm(x,y));
	}
}
	
int main ()
{
	read ();
	apm();
	constr();
	solve ();
	return 0;
}