Pagini recente » Cod sursa (job #2823370) | Cod sursa (job #523977) | Cod sursa (job #1687003) | Cod sursa (job #1091296) | Cod sursa (job #1915315)
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <algorithm>
using namespace std;
vector< vector< pair<int,int> > >g(15010);
struct edges
{
int a,b,dist;
};
edges v[30010];
struct stramosi
{
int node,maxi;
};
stramosi d[15010][15];
int dad[15010];
int depth[15010];
bool viz[15010];
int ans;
int maxim(int a,int b)
{
if(a>b)
return a;
else
return b;
}
bool cmp(edges x,edges y)
{
return x.dist<y.dist;
}
int find_dad(int x)
{
if(x==dad[x])
return x;
dad[x]=find_dad(dad[x]);
return dad[x];
}
void dfs(int node)
{
int bit,l,i;
viz[node]=true;
depth[node]=depth[d[node][0].node]+1;
for(bit=1; bit<=13; bit++)
{
d[node][bit].node=d[d[node][bit-1].node][bit-1].node;
d[node][bit].maxi=maxim(d[d[node][bit-1].node][bit-1].maxi,d[node][bit-1].maxi);
}
l=g[node].size();
for(i=0; i<l; i++)
{
if(viz[g[node][i].first]==false)
{
d[g[node][i].first][0].node=node;
d[g[node][i].first][0].maxi=g[node][i].second;
dfs(g[node][i].first);
}
}
}
void same_level(int &x,int &y)
{
int bit,dist;
if(depth[x]==depth[y])
return;
else if(depth[x]>depth[y])
{
dist=depth[x]-depth[y];
for(bit=13; bit>=0; bit--)
if(((1<<bit) & dist)!=0)
{
ans=maxim(ans,d[x][bit].maxi);
x=d[x][bit].node;
}
}
else
{
dist=depth[y]-depth[x];
for(bit=13; bit>=0; bit--)
if(((1<<bit) & dist)!=0)
{
ans=maxim(ans,d[y][bit].maxi);
y=d[y][bit].node;
}
}
}
int lca(int x,int y)
{
int bit;
same_level(x,y);
if(x==y)
return ans;
for(bit=13; bit>=0; bit--)
if(d[x][bit].node!=d[y][bit].node)
{
ans=maxim(ans,d[x][bit].maxi);
x=d[x][bit].node;
ans=maxim(ans,d[y][bit].maxi);
y=d[y][bit].node;
}
ans=maxim(ans,maxim(d[x][0].maxi,d[y][0].maxi));
return ans;
}
int main()
{
srand(time(0));
freopen("radiatie.in","r",stdin);
freopen("radiatie.out","w",stdout);
int n,m,k,x,y,i,s=0;
scanf("%d%d%d",&n,&m,&k);
for(i=1; i<=m; i++)
scanf("%d%d%d",&v[i].a,&v[i].b,&v[i].dist);
for(i=1; i<=n; i++)
dad[i]=i;
sort(v+1,v+m+1,cmp);
for(i=1; i<=m; i++)
{
x=find_dad(v[i].a);
y=find_dad(v[i].b);
if(x!=y)
{
if(rand()%2==0)
dad[x]=y;
else
dad[y]=x;
g[v[i].a].push_back(make_pair(v[i].b,v[i].dist));
g[v[i].b].push_back(make_pair(v[i].a,v[i].dist));
}
}
for(i=1; i<=n; i++)
if(viz[i]==false)
dfs(i);
for(i=1;i<=k;i++)
{
ans=0;
scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y));
}
return 0;
}