蒟蒻代码:
#include <bits/stdc++.h>
using namespace std;
int n,m,q,t,fa[100005],d[100005];
bool vis[100005];
struct node{int l,r,d;}in[500005];
struct line{int f,d;}p[100005][20];
vector<line>a[100005];
//Kruskal+倍增 d数组为深度 p数组为倍增 vis数组为是否被搜索到
void dfs(int x,int f,int di)
{
vis[x]=1;
d[x]=d[f]+1;
p[x][0]=line{f,di};
for(int i=1;(i<<i)<=d[x];i++)
{
p[x][i].f=p[p[x][i-1].f][i-1].f;
p[x][i].d=min(p[x][i-1].d,p[p[x][i-1].f][i-1].d);
}
for(int i=0;i<a[x].size();i++)if(a[x][i].f!=f)
dfs(a[x][i].f,x,a[x][i].d);
}
int lca(int l,int r)
{
int mi=0x7f7f7f7f;
if(d[l]<d[r])swap(l,r);
for(int i=t;i>=0;i--)if(d[p[l][i].f]>=d[r])
mi=min(mi,p[l][i].d),l=p[l][i].f;
if(l==r)return mi;
for(int i=t;i>=0;i--)if(p[l][i].f!=p[r][i].f)
mi=min(mi,min(p[l][i].d,p[r][i].d)),l=p[l][i].f,r=p[r][i].f;
return min(mi,min(p[l][0].d,p[r][0].d));
}
int find(int x)
{
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
bool cmp(node x,node y){return x.d>y.d;}
int main()
{
cin>>n>>m;
t=log2(n)+1;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++)cin>>in[i].l>>in[i].r>>in[i].d;
sort(in+1,in+m+1,cmp);
for(int i=1,l,r;i<=m;i++)
{
l=find(in[i].l),r=find(in[i].r);
if(l!=r)
{
fa[l]=r;
a[l].push_back(line{r,in[i].d});
a[r].push_back(line{l,in[i].d});
}
}
for(int i=1;i<=n;i++)if(!vis[i])dfs(i,0,100001);
cin>>q;
for(int i=1,l,r;i<=q;i++)
{
cin>>l>>r;
if(find(l)!=find(r))cout<<-1<<'\n';
else cout<<lca(l,r)<<'\n';
}
return 0;
}
大佬们帮帮吧QwQ 调了一下午