Pagini recente » Cod sursa (job #796462) | Cod sursa (job #623313) | Cod sursa (job #999170) | Cod sursa (job #819260) | Cod sursa (job #3331982)
#include <bits/stdc++.h>
using namespace std;
struct Edge{int a,b;int w;};
struct DSU{
vector<int> p,r;
DSU(int n):p(n+1),r(n+1,0){iota(p.begin(),p.end(),0);}
int find(int x){return p[x]==x?x:p[x]=find(p[x]);}
bool unite(int a,int b){
a=find(a);b=find(b);
if(a==b) return false;
if(r[a]<r[b]) swap(a,b);
p[b]=a;
if(r[a]==r[b]) r[a]++;
return true;
}
};
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
// File redirection
freopen("radiatie.in","r",stdin);
freopen("radiatie.out","w",stdout);
int N,M,K;
cin>>N>>M>>K;
vector<Edge> edges(M);
for(int i=0;i<M;i++) cin>>edges[i].a>>edges[i].b>>edges[i].w;
vector<vector<pair<int,int>>> g(N+1);
DSU dsu(N);
sort(edges.begin(),edges.end(),[](const Edge& x,const Edge& y){return x.w<y.w;});
for(auto &e:edges){
if(dsu.unite(e.a,e.b)){
g[e.a].push_back({e.b,e.w});
g[e.b].push_back({e.a,e.w});
}
}
int LOG=1;
while((1<<LOG)<=N) LOG++;
vector<vector<int>> up(LOG, vector<int>(N+1,0));
vector<vector<int>> mx(LOG, vector<int>(N+1,0));
vector<int> depth(N+1,0), vis(N+1,0);
for(int s=1;s<=N;s++){
if(vis[s]) continue;
vis[s]=1;
depth[s]=0;
up[0][s]=s;
mx[0][s]=0;
stack<int> st;
st.push(s);
while(!st.empty()){
int u=st.top(); st.pop();
for(auto &pr:g[u]){
int v=pr.first,w=pr.second;
if(v==up[0][u]) continue;
if(vis[v]) continue;
vis[v]=1;
up[0][v]=u;
mx[0][v]=w;
depth[v]=depth[u]+1;
st.push(v);
}
}
}
for(int j=1;j<LOG;j++){
for(int i=1;i<=N;i++){
up[j][i]=up[j-1][ up[j-1][i] ];
mx[j][i]=max(mx[j-1][i], mx[j-1][ up[j-1][i] ]);
}
}
auto query=[&](int a,int b){
int ans=0;
if(depth[a]<depth[b]) swap(a,b);
int diff=depth[a]-depth[b];
for(int j=0;j<LOG;j++){
if(diff&(1<<j)){
ans=max(ans,mx[j][a]);
a=up[j][a];
}
}
if(a==b) return ans;
for(int j=LOG-1;j>=0;j--){
if(up[j][a]!=up[j][b]){
ans=max(ans,mx[j][a]);
ans=max(ans,mx[j][b]);
a=up[j][a];
b=up[j][b];
}
}
ans=max(ans,mx[0][a]);
ans=max(ans,mx[0][b]);
return ans;
};
for(int i=0;i<K;i++){
int x,y;cin>>x>>y;
cout<<query(x,y)<<"\n";
}
return 0;
}