Pagini recente » Cod sursa (job #1923464) | Cod sursa (job #3156827) | Cod sursa (job #1029653) | Cod sursa (job #1784591) | Cod sursa (job #3287574)
#include <fstream>
#include <algorithm>
#include <vector>
#define nmax 15005
using namespace std;
ifstream cin("radiatie.in");
ofstream cout("radiatie.out");
int n,m,k,x,y,c,t[nmax],rmq[18][nmax],maxi[18][nmax],niv[nmax];
struct elem{
int x,y,c;
}mch[nmax*2];
vector<pair<int,int>>v[nmax];
bool cmp(const elem& a,const elem& b){
return a.c<b.c;
}
int get_root(int x){
if(t[x]>0)
return get_root(t[x]);
return x;
}
void join(int x,int y,int c){
int rx=get_root(x),ry=get_root(y);
if(rx==ry)
return ;
v[x].push_back({y,c});
v[y].push_back({x,c});
if(t[rx]>t[ry])
swap(rx,ry);
t[rx]+=t[ry];
t[ry]=rx;
}
void apm(){
sort(mch+1,mch+m+1,cmp);
for(int i=1;i<=m;i++)
join(mch[i].x,mch[i].y,mch[i].c);
}
void dfs(int nod,int t){
niv[nod]=niv[t]+1;
rmq[0][nod]=t;
for(auto i:v[nod])
if(i.first!=t){
maxi[0][i.first]=i.second;
dfs(i.first,nod);
}
}
int lca(int x,int y){
int r=0;
if(niv[x]<niv[y])
swap(x,y);
for(int i=17;i>=0&&niv[x]>niv[y];i--)
if(rmq[i][x]!=0&&niv[rmq[i][x]]>=niv[y]){
r=max(r,maxi[i][x]);
x=rmq[i][x];
}
for(int i=17;i>=0;i--)
if(rmq[i][x]!=0&&rmq[i][y]!=0&&rmq[i][x]!=rmq[i][y]){
r=max(r,max(maxi[i][y],maxi[i][x]));
x=rmq[i][x];
y=rmq[i][y];
}
if(x!=y)
r=max(r,max(maxi[0][x],maxi[0][y]));
return r;
}
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
t[i]=-1;
for(int i=1;i<=m;i++)
cin>>mch[i].x>>mch[i].y>>mch[i].c;
apm();
dfs(1,0);
for(int i=1;(1<<i)<=n;i++)
for(int j=1;j<=n;j++){
rmq[i][j]=rmq[i-1][rmq[i-1][j]];
maxi[i][j]=max(maxi[i-1][rmq[i-1][j]],maxi[i-1][j]);
}
while(k--){
cin>>x>>y;
cout<<lca(x,y)<<'\n';
}
return 0;
}