#include<bits/stdc++.h>
using namespace std;
const int N=1e4+100,inf=1e5+2000;
struct node
{
int u,v,w;
}t[N*5];
struct edge
{
int u,v,w;
}e[N*5];
int h[N],cnt,st[N][20],w[N][20],dep[N];
int n,m,q,par[N];
bool cmp(node a,node b)
{
return a.w>b.w;
}
void add(int u,int v,int w)
{
cnt++;
e[cnt].u=h[u];
e[cnt].w=w;
e[cnt].v=v;
h[u]=cnt;
}
int find(int x)
{
if(par[x]==x)
return par[x];
return find(par[x]);
}
void merge(int x,int y)
{
int xx=find(x);
int yy=find(y);
if(xx!=yy)
par[x]=yy;
}
void kru()
{
for(int i=1;i<=n;i++)
par[i]=i;
sort(t+1,t+m+1,cmp);
for(int i=1;i<=m;i++)
{
if(find(t[i].u)==find(t[i].v))
continue;
add(t[i].u,t[i].v,t[i].w);
add(t[i].v,t[i].u,t[i].w);
merge(t[i].u,t[i].v);
}
}
void dfs(int x,int fa,int val)
{
dep[x]=dep[fa]+1;
st[x][0]=fa;
w[x][0]=val;
for(int i=1;1<<i<=dep[x];i++)
{
st[x][i]=st[st[x][i-1]][i-1];
w[x][i]=min(w[x][i-1],w[st[x][i-1]][i-1]);
}
for(int i=h[x];i;i=e[i].u)
{
int v=e[i].v;
if(v!=fa)
dfs(v,x,e[i].w);
}
}
int lca(int a,int b)
{
int ans=inf;
if(dep[a]<dep[b])
swap(a,b);
while(dep[a]>dep[b])
{
int k=log2(dep[a]-dep[b]);
cout<<k<<" "<<a<<" "<<dep[a]<<" "<<b<<" "<<dep[b]<<"\n";
a=st[a][k];
ans=min(ans,w[a][k]);
cout<<ans<<" "<<w[a][k]<<"\n";
}
if(a==b)
return ans;
for(int i=1;1<<i<=dep[a]+1;i++)
{
if(st[a][i]!=st[b][i])
{
cout<<2<<" "<<a<<" "<<dep[a]<<" "<<b<<" "<<dep[b]<<"\n";
a=st[a][i],b=st[b][i];
ans=min(ans,min(w[a][i],w[b][i]));
}
}
return min(ans,min(w[a][0],w[b][0]));
}
int main()
{
memset(w,inf,sizeof(w));
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>t[i].u>>t[i].v>>t[i].w;
kru();
for(int i=1;i<=n;i++)
{
if(par[i]==i)
dfs(i,i,inf);
}
cin>>q;
cout<<w[3][1]<<" "<<w[1][3]<<"\n";
while(q--)
{
int x,y;
cin>>x>>y;
if(find(x)!=find(y))
cout<<"-1"<<"\n";
else
cout<<lca(x,y)<<"\n";
}
}
为什么我w数组都是1886417008