Pagini recente » Cod sursa (job #812752) | Cod sursa (job #1648507) | Cod sursa (job #817263) | Cod sursa (job #2813821) | Cod sursa (job #524891)
Cod sursa(job #524891)
#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;
}