Pagini recente » Cod sursa (job #164245) | Cod sursa (job #3145475) | Cod sursa (job #1296225) | Cod sursa (job #2208826) | Cod sursa (job #3307373)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin("radiatie.in");
ofstream cout("radiatie.out");
const int maxn=15e3+5;
struct muchie{
int a,b,c;
};
muchie M[maxn*2];
int tata[maxn],h[maxn];
vector<pair<int,int>>adj[maxn];
int root(int x){
if(x==tata[x]) return x;
else return tata[x]=root(tata[x]);
}
bool same_component(int x,int y){
return root(x)==root(y);
}
void join(int x,int y){
x=root(x);
y=root(y);
if(h[x]<h[y]) swap(x,y);
if(h[x]==h[y]) h[x]++;
tata[y]=x;
}
int n,m,k;
int t[maxn][15];
int mx[maxn][15];
int H[maxn];
void dfs(int ant,int nod){
for(auto e:adj[nod]){
int next=e.first,dist=e.second;
if(next==ant) continue;
t[next][0]=nod;
mx[next][0]=dist;
H[next]=H[nod]+1;
for(int i=1;i<=14;i++){
t[next][i]=t[t[next][i-1]][i-1];
mx[next][i]=max(mx[t[next][i-1]][i-1],mx[next][i-1]);
}
dfs(nod,next);
}
}
int query(int x,int y){
if(H[x]<H[y]) swap(x,y);
int dif=H[x]-H[y];
int ans=0;
for(int i=0;i<=14;i++){
if(dif&(1<<i)){
ans=max(ans,mx[x][i]);
x=t[x][i];
}
}
for(int i=14;i>=0;i--){
if(t[x][i]!=t[y][i]){
ans=max(ans,max(mx[x][i],mx[y][i]));
x=t[x][i];
y=t[y][i];
}
}
return max(ans,max(mx[x][0],mx[y][0]));
}
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
tata[i]=i;
h[i]=1;
}
for(int i=1;i<=m;i++){
cin>>M[i].a>>M[i].b>>M[i].c;
}
sort(M+1,M+m+1,[](muchie a,muchie b){
return a.c<b.c;
});
for(int i=1;i<=m;i++){
int a=M[i].a,b=M[i].b,c=M[i].c;
if(!same_component(a,b)){
join(a,b);
adj[a].push_back({b,c});
adj[b].push_back({a,c});
}
}
H[1]=0;
for(int i=0;i<=14;i++){
t[1][i]=0;
mx[1][i]=0;
}
dfs(0,1);
for(int i=1;i<=k;i++){
int x,y;
cin>>x>>y;
cout<<query(x,y)<<'\n';
}
return 0;
}