Cod sursa(job #524891)

Utilizator bora_marianBora marian bora_marian Data 23 ianuarie 2011 15:43:13
Problema Radiatie Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include<fstream>
#include<vector>
#include<set>
#include<iostream>
using namespace std;
vector< pair<int ,int> >G[15003];
set< pair<int,int> >T;
int n,m,k;
int cost[18][15004],t[18][15004],vizitat[15003],nivel[15005];
void construiestegraf();
void construieste();
int LCA(int a,int b);
int dist(int a,int b);
int maxim(int a,int b);
int lca(int x, int y);
int main()
{
	ifstream fin("radiatie.in");
	ofstream fout("radiatie.out");
	int i,j;
	fin>>n>>m>>k;
	for(i=1;i<=m;i++)
	{
		int a,b,c;
		fin>>a>>b>>c;
		G[a].push_back(make_pair(b,c));
		G[b].push_back(make_pair(a,c));
	}	
	for(i=2;i<=n;i++)
	   cost[0][i]=2147000000;
	nivel[1]=1;
	cost[0][1]=0;
	construiestegraf();
	construieste();   
	for(i=1;i<=k;i++)
	{
		int a,b;
		fin>>a>>b;
		int x=LCA(a,b);
		//fout<<x<<endl;
		fout<<maxim(dist(a,x),dist(b,x))<<"\n";
	}
	return 0;
}
void construiestegraf()
{
	int i;
	T.insert(make_pair(0,1));	   
	vizitat[1]=1;
	while(T.size()>0)
	{
		int k=(*T.begin()).second;
		T.erase(*T.begin());
		vizitat[k]=1;
		for(i=0;i<G[k].size();i++)
		{
			if(vizitat[G[k][i].first]==0 && G[k][i].second<cost[0][G[k][i].first])
			{
				t[0][G[k][i].first]=k;
				cost[0][G[k][i].first]=G[k][i].second;
				nivel[G[k][i].first]=nivel[k]+1;
				T.insert(make_pair(G[k][i].second,G[k][i].first));
			}
		}
	}
}   			
void construieste()
{
	int i,j;
	for(i=1;(1<<i)<n;i++)
	    for(j=2;j<=n;j++)
	       if(t[i-1][t[i-1][j]])
	       {
			   t[i][j]=t[i-1][t[i-1][j]];
			   cost[i][j]=maxim(cost[i-1][j],cost[i-1][t[i-1][j]]);
		    }   
}
int LCA(int a,int b)
{
	if(nivel[a]<nivel[b])
	  swap(a,b);
	int log1=0,log2=0,i;
	for(log1=0;(1<<log1)<nivel[a];log1++);
	for(log2=0;(1<<log2)<nivel[b];log2++);
	for(i=log1;i>=0;i--)
	   if(nivel[a]-(1<<i)>=nivel[b])
	          a=t[i][a];
	if(a==b)
	   return a;
	for(i=log2;i>=0;--i)
	   if(t[i][a]!=t[i][b])
	     a=t[i][a],
	     b=t[i][b];
	return t[0][a];
}
int dist(int a,int b)
{
	if(a==b)
	  return 0;
	int sol=0;
	int log=0;
	for(log=0;(1<<log)<=nivel[a];log++);
	for(;log>=0;log--)
	   if(nivel[a]-(1<<log)>=nivel[b])
	   {
		   sol=maxim(sol,cost[log][a]);
		   a=t[log][a];
	   }
	return sol;
}                    
int maxim(int a,int b)
{
	if(a>b)
	  return a;
	else
	  return b;
  }