RT,看了看数据,好像是-1没判到?输出了7,实际上要输出-1.
有奆佬帮忙看看吗qwq
#include<bits/stdc++.h>
using namespace std;
int n,m,q;
struct node{
int u,v,w;
}a[100005];
int to[200005],nx[200005],st[200005],zhi[200005],tot,z[200005];
void add(int u,int v,int w){
to[++tot]=v;
zhi[tot]=w;
nx[tot]=st[u];
st[u]=tot;
}
bool cmp(node a,node b){
return a.w>b.w;
}
int fa[100005];
int find(int p){
if(fa[p]==p) return p;
else return fa[p]=find(fa[p]);
}
int shen[100005],dp[100005][21],dfn[100005];
void dfs(int now,int fa) {
dp[now][0]=fa;
dfn[now]=dfn[fa]+1;
for(int i=1;i<=shen[dfn[now]];i++){
dp[now][i]=dp[dp[now][i-1]][i-1];
}
for(int i=st[now];i;i=nx[i]){
if(to[i]!=fa){
z[to[i]]=zhi[i];
dfs(to[i],now);
}
}
}
int LCAohLCA(int u,int v){
if(find(u)!=find(v)) return -1;
if(dfn[u]<dfn[v]){
swap(u,v);
}
while(dfn[u]>dfn[v]){
u=dp[u][shen[dfn[u]-dfn[v]]-1];
}
if(u==v) {
return u;
}
for(int i=shen[dfn[u]]-1;i>=0;i--){
if(dp[u][i]!=dp[v][i]){
u=dp[u][i];
v=dp[v][i];
}
}
return dp[u][0];
}
int tiao(int u,int f){
int ans=2147483647;
while(u!=f){
ans=min(ans,z[u]);
u=dp[u][0];
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
shen[i]=shen[i-1]+(1<<shen[i-1]==i);
}
for(int i=1;i<=n;i++) fa[i]=i;
int u,v,w;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
}
sort(a+1,a+m+1,cmp);
int cnt=0,now=1;
while(1){
int u=find(a[now].u),v=find(a[now].v);
if(u!=v){
fa[u]=v;
cnt++;
add(a[now].u,a[now].v,a[now].w);
add(a[now].v,a[now].u,a[now].w);
if(cnt==n-1) break;
}
now++;
}
dfs(1,1);
scanf("%d",&q);
for(int i=1;i<=q;i++){
scanf("%d%d",&u,&v);
int L=LCAohLCA(u,v);
if(L==-1){
cout<<-1<<endl;
continue;
}
int maxx=2147483647;
maxx=min(maxx,tiao(u,L));//O(n)
maxx=min(maxx,tiao(v,L));
printf("%d\n",maxx);
}
}