看起来我其余点输出的都偏大?
#include<bits/stdc++.h>
using namespace std;
class edge {
public:
int nxt,to,val;
} e[200005];
class edge1 {
public:
int u,v,w,used;
} e1[300005];
int h[100005],cnt,n,m,fa[100005],f[100005][20],mx[100005][20],mx2[100005][20],dep[100005];
long long ans0;
void add(int u,int v,int w) {
cnt++;
e[cnt].nxt=h[u];
e[cnt].to=v;
e[cnt].val=w;
h[u]=cnt;
}
bool cmp(edge1 a,edge1 b) {
return a.w<b.w;
}
int find(int x) {
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
void kru() {
sort(e1+1,e1+1+m,cmp);
for(int i=1; i<=m; i++) {
int u=find(e1[i].u),v=find(e1[i].v);
if(!(u^v))continue;
ans0+=e1[i].w;
add(e1[i].u,e1[i].v,e1[i].w);
add(e1[i].v,e1[i].u,e1[i].w);
e1[i].used=1;
fa[v]=u;
}
}
void bdfs(int u) { //BinaryDFS
dep[u]=dep[f[u][0]]=1;
for(int i=1; i<=18; i++) {
f[u][i]=f[f[u][i-1]][i-1];
if(mx[u][i-1]==mx[f[u][i-1]][i-1]) {
mx[u][i]=mx[u][i-1];
mx2[u][i]=max(mx2[f[u][i-1]][i-1],mx2[u][i-1]);
} else if(mx[u][i-1]>mx[f[u][i-1]][i-1]) {
mx[u][i]=mx[u][i-1];
mx2[u][i]=max(mx[f[u][i-1]][i-1],mx2[u][i-1]);
} else {
mx[u][i]=mx[u][i-1];
mx2[u][i]=max(mx[u][i-1],mx2[f[u][i-1]][i-1]);
}
}
for(int i=h[u]; i; i=e[i].nxt) {
int v=e[i].to,c=e[i].val;
if(v!=f[u][0]) {
f[v][0]=u;
mx[v][0]=c;
bdfs(v);
}
}
}
int LCA(int u,int v) {
if(dep[u]<dep[v])swap(u,v);
for(int i=18; i+1; i--)if(dep[u]-dep[v]>=(1<<i))u=f[u][i]; //提到相同深度
if(u==v)return u;
for(int i=18; i+1; i--)if(f[u][i]!=f[v][i])u=f[u][i],v=f[v][i]; //倍增 LCA
return f[u][0];//重点
}
long long calc(int u,int v,int w) {
int l=LCA(u,v);
int nm=0,nm2=0;
for(int i=18; i>=0; i--) {
if(dep[f[u][i]]>=dep[l]) {
if(nm==mx[u][i])nm2=max(mx2[u][i],nm2);
else if(nm>mx[u][i])nm2=max(mx[u][i],nm2);
else {
nm2=max(mx2[u][i],nm);
nm=mx[u][i];
}
u=f[u][i];
}
if(dep[f[v][i]]>=dep[l]) {
if(nm==mx[v][i])nm2=max(mx2[v][i],nm2);
else if(nm>mx[v][i])nm2=max(mx[v][i],nm2);
else {
nm2=max(mx2[v][i],nm);
nm=mx[v][i];
}
v=f[v][i];
}
}
if(w!=nm)return ans0-nm+w;
if(nm2)return ans0-nm2+w;
return LLONG_MAX;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1; i<=m; i++)cin>>e1[i].u>>e1[i].v>>e1[i].w;
for(int i=1; i<=n; i++)fa[i]=i;
kru();
bdfs(1);
long long ans=LLONG_MAX;
for(int i=1; i<=m; i++)if(!e1[i].used)ans=min(calc(e1[i].u,e1[i].v,e1[i].w),ans);
cout<<ans;
}