#include <bits/stdc++.h>
using namespace std;
inline int read() {
int x=0,f=1;
char ch=getchar();
while (ch<'0'||ch>'9') {
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&& ch<='9') {
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
const int maxn=400010;
struct edge{
int u,v,w;
}a[maxn];
bool cmp(edge a,edge b){
return a.w>b.w;
}
struct node{
int v;
int w;
};
int n,m,sum;
vector<node> e[maxn];
int fa[maxn],w[maxn];
int deep[maxn],jump[maxn][25];
int dis[maxn],val[maxn][25];
int find(int k){
if(fa[k]==k) return k;
return fa[k]=find(fa[k]);
}
void kruskal(){
sort(a+1,a+m+1,cmp);
for (int i=1;i<=n;i++){
fa[i]=i;
}
for (int i=1;i<=m;i++){
if (find(a[i].u) != find(a[i].v)){
int x=a[i].u,y=a[i].v;
e[y].push_back(node{x,a[i].w});
e[x].push_back(node{y,a[i].w});
fa[find(a[i].u)] = find(a[i].v);
}
}
}
void dfs(){
memset(deep,0x3f,sizeof(deep));
deep[0]=0;
deep[1]=1;
queue<int> q;
q.push(1);
val[1][0]=0x3f3f3f3f;
while (!q.empty()){
int x = q.front();
q.pop();
for (node y : e[x]){
int i=y.v;
if (deep[i]<deep[x]){
continue;
}
q.push(i);
deep[i] = deep[x]+1;
val[i][0]=y.w;
jump[i][0]=x;
for (int j=1;j<=22;j++){
jump[i][j]=jump[jump[i][j-1]][j-1];
val[i][j]=min(val[i][j-1],val[jump[i][j-1]][j-1]);
}
}
}
}
int lca(int a,int b){
if (fa[a]!=fa[b]) return -1;
int ans=0x3f3f3f3f3f3f3f3f;
if(deep[a]<deep[b]) swap(a,b);
for (int i=20;i>=0;i--){
if (deep[jump[a][i]]>=deep[b]){
ans=min(ans,val[a][i]);
a=jump[a][i];
}
}
if(a==b) return ans;
for (int i=20;i>=0;i--){
if (jump[a][i]!=jump[b][i]){
ans=min(ans,min(val[a][i],val[b][i]));
a=jump[a][i];
b=jump[b][i];
}
}
ans=min(ans,min(val[a][0],val[b][0]));
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
}
memset(val,0x3f,sizeof(val));
kruskal();
dfs();
int q;
scanf("%d",&q);
for(int i=1; i<=q; i++){
int x,y;
scanf("%d%d",&x,&y);
cout << lca(x,y);
}
return 0;
}
在这个数据有输入问题
5 4
1 2 1
1 3 1
2 3 1
4 5 5
1
4 5