rt,因为下载数据机会没了所以不会改了。
#include<iostream>
#include<vector>
#include<algorithm>
#define RP i
using namespace std;
int fa[10005];
int find(int x){
return (fa[x]==x)?x:(fa[x]=find(fa[x]));
}
struct edge2{
int v,w;
};
vector<edge2>t[10005];
void merge(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx!=fy){
fa[fx]=fy;
}
}
struct edge{
int u,v,w;
}a[50005];
bool cmp(edge a,edge b){
return a.w>b.w;
}
int dep[10005];
int f[10005][10];
int g[10005][10];
void tree(int x,int d){
dep[x]=d;
for(int i=0;i<t[x].size();RP++){
if(!f[t[x][i].v][1]){
f[t[x][i].v][1]=x;
g[t[x][i].v][1]=t[x][i].w;
tree(t[x][i].v,d+1);
}
}
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;RP++){
fa[i]=i;
f[i][0]=i;
}
for(int i=1;i<=m;RP++){
scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
}
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;RP++){
if(find(a[i].u)!=find(a[i].v)){
merge(a[i].u,a[i].v);
t[a[i].u].push_back({a[i].v,a[i].w});
t[a[i].v].push_back({a[i].u,a[i].w});
}
}
for(int i=1;i<=n;RP++){
if(!f[i][1]){
f[i][1]=-1;
tree(i,0);
f[i][1]=0;
}
}
for(int i=2;i<=n;RP++){
for(int j=2;j<=9;j++){
f[i][j]=f[f[i][j-1]][j-1];
}
}
for(int i=2;i<=n;RP++){
for(int j=2;j<=9;j++){
g[i][j]=min(g[i][j-1],g[f[i][j-1]][j-1]);
}
}
int q;
scanf("%d",&q);
while(q--){
int x,y,ans=0x3fffffff;
scanf("%d%d",&x,&y);
if (dep[x]<dep[y]){
swap(x,y);
}
for (int j=9;j>=0;j--){
if(dep[x]<=dep[y]){
break;
}
if(f[x][j]){
ans=min(ans,g[x][j]);
x=f[x][j];
}
}
if(x==y){
printf("%d\n",ans);
continue;
}
for(int j=9;j>0;j--){
if(f[x][j]!=f[y][j]&&f[x][j]&&f[y][j]){
ans=min(ans,min(g[x][j],g[y][j]));
x=f[x][j];
y=f[y][j];
if(f[x][j]!=f[y][j]&&f[x][j]&&f[y][j]){
ans=min(ans,min(g[x][j],g[y][j]));
x=f[x][j];
y=f[y][j];
}
}
}
if(ans<100000000){
printf("%d\n",ans);
}
else if(f[x][1]==f[y][1]&&f[x][1]!=0){
printf("%d\n",min(g[x][1],g[y][1]));
}
else{
printf("-1\n");
}
}
return 0;
}