萌新倍增LCA写的不好,只有前两个点10pts,后面全都WA
求助qwq
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int ss=0,ww=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
ww=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
ss=ss*10+ch-'0';
ch=getchar();
}
return ss*ww;
}
int n,m,T;
struct QwQ{
int x;
int y;
int z;
}g[50010];
int cmp(QwQ a1,QwQ a2){
return a1.z>a2.z;
}
int uf[10010];
int get(int x){
if(x==uf[x])
return x;
return uf[x]=get(uf[x]);
}
int head[10010];
int nex[50010];
int to[50010];
int e[50010];
int cnt=0;
void add(int x,int y,int z){
cnt++;
e[cnt]=z;
to[cnt]=y;
nex[cnt]=head[x];
head[x]=cnt;
}
void kru(){
sort(g+1,g+m+1,cmp);
for(int i=1;i<=n;i++)
uf[i]=i;
for(int i=1;i<=m;i++){
int x=g[i].x;
int y=g[i].y;
int f1=get(x);
int f2=get(y);
if(f1!=f2){
uf[f2]=f1;
add(g[i].x,g[i].y,g[i].z);
add(g[i].y,g[i].x,g[i].z);
}
}
}
int dep[10010];
int f[10010][50];
int minn[10010][50];
queue<int> q;
int t;
void bfs(){
q.push(1);
while(q.size()){
int x=q.front();
q.pop();
for(int i=head[x];i;i=nex[i]){
int y=to[i];
if(dep[y]==0){
dep[y]=dep[x]+1;
q.push(y);
f[y][0]=x;
minn[y][0]=e[i];
for(int i=t;i>=1;i--){
f[y][i]=f[f[y][i-1]][i-1];
minn[y][i]=min(minn[y][i-1],minn[f[y][i-1]][i-1]);
}
}
}
}
}
int solve(int x,int y){
int res=1e8;
if(dep[x]>dep[y])
swap(x,y);
for(int i=t;i>=0;i--){
if(dep[f[y][i]]>=dep[x]){
res=min(res,minn[y][i]);
y=f[y][i];
}
}
if(x==y)
return res;
for(int i=t;i>=0;i--){
if(f[x][i]!=f[y][i]){
x=f[x][i];
y=f[y][i];
res=min(res,minn[x][i]);
res=min(res,minn[y][i]);
}
}
res=min(res,minn[x][0]);
res=min(res,minn[y][0]);
return res;
}
int main(){
n=read();
m=read();
for(int i=1;i<=m;i++){
g[i].x=read();
g[i].y=read();
g[i].z=read();
}
T=read();
t=(log(n)/log(2))+1;
kru();
dep[1]=1;
bfs();
while(T--){
int x,y;
cin>>x>>y;
if(get(x)!=get(y))
cout<<-1<<endl;
else
cout<<solve(x,y)<<endl;
}
}