#include<bits/stdc++.h>
using namespace std;
struct node
{
int p1,p2,d;
}ed[50005];//存p1与p2 之间 长度为d的边,即无向
struct edge
{
int to,cost;
};
int n,m,c,f[10005],depth[10005],fa[10005][30],fe[10005][30];//fa[i][j] 从i点向上走2^j步会走到哪里,fe[i][j] 从i点向上走2^j步经过的所有边的边权最小值
vector <edge> q[10005];
bool cmp(node a,node b)
{
return a.d > b.d;
}
int find(int n)
{
if(n == f[n])return n;
else return f[n] = find(f[n]);
}
void kruskal()
{
sort(ed + 1,ed + m + 1,cmp);
for(int i = 1;i <= n;i ++)
f[i] = i;
for(int i = 1;i <= m;i ++)
{
int p1 = ed[i].p1,p2 = ed[i].p2,l = ed[i].d;
if(find(p1) != find(p2))
{
f[find(p1)] = find(p2);
//在最大生成树上建新图
q[p1].push_back(edge{p2,l});
q[p2].push_back(edge{p1,l});
}
}
return;
}
void dfs(int p1,int f,int d)//深搜到p1点,p1父亲为f,f与p1间的边边权为d
{
depth[p1] = depth[f] + 1;
fa[p1][0] = f;
fe[p1][0] = d;
for(int i = 1;i <= 20;i ++)
{
fa[p1][i] = fa[fa[p1][i - 1]][i - 1];
fe[p1][i] = min(fe[p1][i - 1],fe[fa[p1][i - 1]][i - 1]);
}
for(int i = 0;i < q[i].size();i ++)
{
int p2 = q[p1][i].to,d = q[p1][i].cost;
if(p2 != f)dfs(p2,p1,d);
}
return;
}
int lca(int p1,int p2)
{
if(find(p1) != find(p2))return -1;
int ans = 2147483647;
if(depth[p1] < depth[p2])swap(p1,p2);//保证p1深度更大
for(int i = 20;i >= 0;i --)
if(depth[fa[p1][i]] != depth[p2])
{
ans = min(ans,fe[p1][i]);
p1 = fa[p1][i];
}
if(p1 == p2)return ans;
for(int i = 20;i >= 0;i --)
if(fa[p1][i] != fa[p2][i])
{
ans = min(ans,min(fe[p1][i],fe[p2][i]));
p1 = fa[p1][i];
p2 = fa[p2][i];
}
ans = min(ans,min(fe[p1][0],fe[p2][0]));
return ans;
}
int main()
{
cin>>n>>m;
for (int i = 1;i <= m;i ++)
cin>>ed[i].p1>>ed[i].p2>>ed[i].d;
kruskal();
dfs(1,0,0);
cin>>c;
for(int i = 1;i <= c;i ++)
{
int x,y;
cin>>x>>y;
cout<<lca(x,y)<<'\n';
}
return 0;
}
样例都过不去,除了-1全是0。求大佬帮调!!!