#include<iostream>
#include<algorithm>
#define maxn 50001
#include<cstring>
using namespace std;
struct Edge{ int v,w,u,nxt; }edge[maxn<<1],edge2[maxn<<1];
int head[maxn],cnt;
void add(int u,int v,int w){ edge[++cnt].w=w;edge[cnt].u=u;edge[cnt].v=v;edge[cnt].nxt=head[u];head[u]=cnt; }
int head2[maxn],cnt2;
void add2(int u,int v,int w){ edge2[++cnt2].w=w;edge2[cnt2].u=u;edge2[cnt2].v=v;edge2[cnt2].nxt=head2[u];head2[u]=cnt2; }
bool cmp(Edge a,Edge b){ return a.w>b.w; }
int f[maxn][21],n,m,q,dep[maxn],co[maxn],tmp,vis[maxn],fa[maxn],w[maxn][21];
// w 维护该区间内边权最小值,利用倍增思想,类似于一个ST表。 f 用来倍增lca。 Co用来表示是否联通
int find(int x){ return fa[x]!=x ? fa[x]=find(fa[x]) : fa[x] ; }
void merge(int u,int v){
int fu=find(u),fv=find(v);
if (fu==fv) return;
fa[fu]=fv;
}
void Kruskal(){
sort(edge+1,edge+m+1,cmp);
int u,v,fu,fv;
for (int i=1;i<=m;i++){
u=edge[i].u,v=edge[i].v,fu=find(u),fv=find(v);
if (fu==fv) continue;
if (u>v) swap(u,v);
merge(u,v),add2(u,v,edge[i].w),add2(v,u,edge[i].w);
w[v][0]=edge[i].w;
}
}
void dfs(int u,int father){
dep[u]=dep[father]+1,f[u][0]=father,vis[u]=1;
for (int i=1;(1<<i)<=dep[u];i++){
f[u][i]=f[f[u][i-1]][i-1];
w[u][i]=min(w[u][i-1],w[f[u][i-1]][i-1]);
}
for (int i=head2[u];i;i=edge2[i].nxt){
if (edge2[i].v!=father){ dfs(edge2[i].v,u); }
}
}
int AnsFromLca(int x,int y){ // 该函数运用的LCA,但返回的并不是lca,而是2点间最小边的最小值。
int ans=2147483647;
if (find(x)!=find(y)) return -1; // 如果最大生成树建立完后,2点还不在一个集合内,证明不连通。
if (dep[x]<dep[y]) swap(x,y);
for (int i=20;i>=0;i--){
if (dep[f[x][i]]<dep[y]) continue;
ans=min(ans,w[x][i]),x=f[x][i];
}
if (x==y) return ans;
for (int i=20;i>=0;i--){
if (f[x][i]==f[y][i]) continue;
ans=min(ans,w[x][i]),ans=min(ans,w[y][i]);
x=f[x][i],y=f[y][i];
}
ans=min(ans,w[x][0]),ans=min(ans,w[y][0]);
return ans;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
memset(w,0x3f,sizeof w);
cin>>n>>m; int u,v,a;
for (int i=1;i<=m;i++){ cin>>u>>v>>a; add(u,v,a); }
for (int i=1;i<=n;i++) fa[i]=i;
Kruskal();
for (int i=1;i<=n;i++){
if (!vis[i]){
dfs(i,i);
}
}
cin>>q;
for (int i=1;i<=q;i++){
cin>>u>>v;
cout<<AnsFromLca(u,v)<<"\n";
}
return 0;
}
WA5pts,悬赏关注,晚些来看,谢谢