样例未过,人要调傻了
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
const int inf=0x3f3f3f3f;
inline int read(){
int f=1,x=0;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return f*x;
}
int n,m;
struct edge{
int to,w;
};
struct mst{
int u,v,w;
}e[N];
vector <edge> G[N];
int f[N];
int find(int x){
if(x==f[x])return x;
return f[x]=find(f[x]);
}
bool cmp(mst A,mst B){
return A.w>B.w;
}
void kruskal(){
int tmp=0;
sort(e+1,e+m+1,cmp);
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=m;i++){
int u=e[i].u,v=e[i].v,w=e[i].w;
int fu=find(u),fv=find(v);
if(fu!=fv){
G[u].push_back(edge{v,w});
G[v].push_back(edge{u,w});
f[fv]=fu;
// cout<<u<<' '<<v<<"\n";
tmp++;
}
if(tmp==n-1)break;
}
}
int up[N][16],dis[N][16],dep[N],lg[N];
void Dfs(int x,int fa,int w){
up[x][0]=fa,dis[x][0]=w,dep[x]=dep[fa]+1;
int L=lg[dep[x]];
for(int i=1;i<=L;i++){
up[x][i]=up[up[x][i-1]][i-1];
dis[x][i]=min(dis[x][i-1],dis[up[x][i-1]][i-1]);
}
for(int i=0;i<G[x].size();i++){
int y=G[x][i].to;
if(y==fa)continue;
Dfs(y,x,G[x][i].w);
}
}
int Query(int x,int y){
int ans=inf;
if(dep[x]<dep[y])swap(x,y);
int L=lg[dep[x]];
for(int i=L;i>=0;i--){
if(dep[x]-(1<<i)>=dep[y]){
x=up[x][i];
ans=min(ans,dis[x][i]);
}
}
if(x==y)return ans;
L=lg[dep[x]];
for(int i=L;i>=0;i--){
if(up[x][i]!=up[y][i]){
ans=min(ans,dis[x][i]);
ans=min(ans,dis[y][i]);
x=up[x][i],y=up[y][i];
}
}
ans=min(ans,min(dis[x][0],dis[y][0]));
if(ans==1061109567)return -1;
return ans;
}
signed main(){
n=read(),m=read();
for(int i=1;i<=n;i++){
lg[i]=lg[i-1];
if(i==(1<<lg[i-1]))lg[i]++;
}
for(int i=1;i<=m;i++){
int u=read(),v=read(),w=read();
e[i]=mst{u,v,w};
}
memset(dis,inf,sizeof(dis));
kruskal();
Dfs(1,0,inf);
int Q=read();
while(Q--){
int x=read(),y=read();
printf("%lld\n",Query(x,y));
}
return 0;
}
谢谢!