代码如下
#define int long long
#define setmin(x) (memset(x,-0x7f,sizeof x))
using namespace std;
int n,m,ans,cnt,ans_mst;
int prt[100005],line_used[1000005];
struct line{
int u,v,c;
}a[3000005];
bool cmp(line a,line b){return a.c<b.c;}
int getprt(int o){if(o==prt[o])return o;return prt[o]=getprt(prt[o]);}
void add(int x,int y){ int a=getprt(x),b=getprt(y); if(a!=b)prt[a]=b;}
struct node{
int next,to,c;
}e[1000005];int h[1000005],cnt_n;
void ADD(int x,int y,int z){e[++cnt_n].to=y;e[cnt_n].next=h[x];e[cnt_n].c=z;h[x]=cnt_n;}
int root;
void prebody(){
cin>>n>>m;
for(int i=1;i<=n;i++)prt[i]=i;
for(int i=1;i<=m;i++){
scanf("%lld%lld%lld",&a[i].u,&a[i].v,&a[i].c);
a[i].c*=-1;
}
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++){
if(getprt(a[i].u)!=getprt(a[i].v)){
if(!root)root=a[i].u;
line_used[i]=1;
ADD(a[i].u,a[i].v,a[i].c);
ADD(a[i].v,a[i].u,a[i].c);
ans+=a[i].c;cnt++;
add(a[i].v,a[i].u);
}
if(cnt==n-1)break;
}
ans_mst=ans;
}
int st[105][10005],prt_tree[10005],max_deep;
int st_max[105][10005],deep[10005];
void build_tree(int k){
//cout<<k<<' '<<prt_tree[k]<<'\n';
max_deep=max(max_deep,deep[k]);
for(int i=h[k];i;i=e[i].next){
if(e[i].to==prt_tree[k])continue;
int now=e[i].to;
prt_tree[now]=k; deep[now]=deep[k]+1;
st[0][now]=prt_tree[e[i].to]; st_max[0][now]=e[i].c;
build_tree(now);
}
}
void buildst(){
build_tree(root);
for(int len=1;len<=log(max_deep)/log(2);len++){
for(int i=1;i<=n;i++){
st[len][i]=st[len-1][st[len-1][i]];
st_max[len][i]=max(st_max[len-1][i],st_max[len][i]);
st_max[len][i]=max(st_max[len-1][st[len-1][i]],st_max[len][i]);
}
}
}
int LCA(int x,int y){
int max_line=-2e18;
if(deep[x]<deep[y])swap(x,y);
int jump_deep;
while(deep[x]>deep[y]){
jump_deep=log(deep[x]-deep[y])/log(2);
max_line=max(max_line,st_max[jump_deep][x]);
x=st[jump_deep][x];
}
if(x==y)return max_line;
int jump_lca=log(max_deep)/log(2);
while(prt_tree[x]!=prt_tree[y]){
if(st[jump_lca][x]==st[jump_lca][y]){jump_lca--;continue;}
max_line=max(max_line,st_max[jump_lca][x]);
max_line=max(max_line,st_max[jump_lca][y]);
x=st[jump_lca][x];y=st[jump_lca][y];
}
max_line=max(max_line,max(st_max[0][x],st_max[0][y]));
return max_line;
}
void body(){
int t;cin>>t;
while(t--){
int xx,yy;cin>>xx>>yy;
int qqq=LCA(xx,yy);
qqq*=-1;
if(qqq==2e18)cout<<-1<<'\n';
else cout<<qqq<<'\n';
}
}
#define int int
int main(){
setmin(st_max);
cin.tie(0);cout.tie(0);
prebody();
buildst();
body();
return 0;
}```