Pagini recente » Cod sursa (job #2773190) | Cod sursa (job #2787164) | Cod sursa (job #2259124) | Cod sursa (job #2760663) | Cod sursa (job #3336569)
#include <bits/stdc++.h>
#define tu tuple<int,int,int>
#define pi pair<int,int>
using namespace std;
ifstream f("radiatie.in");
ofstream g("radiatie.out");
int t,n,m,i,j,a,b,c,q,parent[20005],sz[20005],lca[20005][16];
int mx[20005][16],level[20005];
vector<pi>v[20005];
priority_queue<tu,vector<tu>,greater<tu>>PQ;
void init(int node){
parent[node]=node;
sz[node]=1;
}
int father(int node){
if(node==parent[node])return node;
return parent[node]=father(parent[node]);
}
void unite(int a,int b){
int x=father(a);
int y=father(b);
if (sz[x]<sz[y]){
parent[x]=y;
sz[y]+=x;
}
else {
parent[y]=x;
sz[x]+=y;
}
}
void dfs(int node,int tta){
for (auto it : v[node]){
int a,b;
tie(a,b)=it;
if (b==tta){
continue;
}
else{
lca[b][0]=node;
mx[b][0]=a;
level[b]=level[node]+1;
dfs(b,node);
}
}
}
void ans(int a,int b){
if (a==b){cout<<0<<'\n';return;}
if (level[a]>level[b])swap(a,b);
int ansa=0,ansb=0;
int k=(1<<15),cnt=15;
while(level[a]!=level[b]){
int hw=level[b]-level[a];
//cout<<"!!!!"<<level[a]<<' '<<level[b]<<'\n';
if (hw>=k){
ansb=max(ansb,mx[b][cnt]);
b=lca[b][cnt];
}
k>>=1;
cnt--;
}
k=(1<<15);cnt=15;
while(k){
if (lca[a][cnt]!=lca[b][cnt]){
ansa=max(ansa,mx[a][cnt]);
ansb=max(ansb,mx[b][cnt]);
b=lca[b][cnt];
a=lca[a][cnt];
}
k>>=1;
cnt--;
}
ansa=max(ansa,mc[a][0]);
ansb=max(ansb,mx[b][0]);
g<<max(ansa,ansb)<<'\n';
}
int main()
{ f>>n>>m>>q;
for (i=1;i<=m;i++){
f>>a>>b>>c;
PQ.push(make_tuple(c,a,b));
}
for (i=1;i<=n;i++){
init(i);
}
while(!PQ.empty()){
tie (c,a,b)=PQ.top();
PQ.pop();
if (father(a)!=father(b)){
unite(father(a),father(b));
//cout<<a<<' '<<b<<'\n';
v[a].push_back({c,b});
v[b].push_back({c,a});
}
}
lca[1][0]=0;
level[1]=1;
dfs(1,0);
for (i=1;i<=15;i++){
for (j=1;j<=n;j++){
lca[j][i]=lca[lca[j][i-1]][i-1];
mx[j][i]=max(mx[j][i-1],mx[lca[j][i-1]][i-1]);
}
}
//cout<<level[4]<<mx[4][1]<<' '<<lca[4][2]<<"!!!\n";
for (i=1;i<=q;i++){
f>>a>>b;
ans(a,b);
}
return 0;
}