50pts代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,s,fa[100005],l[300005],lg[100005],dp1[100005][25],dp2[100005][25],pa[100005][25],d1[100005],d2[100005],miw=1e18;
struct bq{
int x,y,w;
}a[300005];
struct tb{
int v,w;
};
vector<tb>v[100005];
int F(int x){
if(fa[x]==x)return x;
return F(fa[x]);
}
int js(int x){
return d2[x]-d2[pa[x][0]];
}
int j(int x,int d){
for(int i=0;i<20;i++)if((d>>i)&1)x=pa[x][i];
return x;
}
int q1(int a,int b){
int k1=lg[d1[a]],k2=lg[d1[b]];
return max(max(dp1[a][k1],dp1[j(a,d1[a]-(1<<k1))][k1]),max(dp1[b][k2],dp1[j(b,d1[b]-(1<<k2))][k2]));
}
int q2(int a,int b){
int k1=lg[d1[a]],k2=lg[d1[b]];
int p=min(max(dp1[a][k1],dp1[j(a,d1[a]-(1<<k1))][k1]),max(dp1[b][k2],dp1[j(b,d1[b]-(1<<k2))][k2]));
if(p==q1(a,b))p=max(max(dp2[a][k1],dp2[j(a,d1[a]-(1<<k1))][k1]),max(dp2[b][k2],dp2[j(b,d1[b]-(1<<k2))][k2]));
return p;
}
int LCA(int x,int y){
if(d1[x]>d1[y])swap(x,y);
y=j(y,d1[y]-d1[x]);
if(x==y)return x;
for(int i=19;i>=0;i--){
if(pa[x][i]!=pa[y][i]){
x=pa[x][i];
y=pa[y][i];
}
}
return pa[x][0];
}
bool cmp(bq a,bq b){
return a.w<b.w;
}
void d(){
for(int i=2;i<=n;i++)lg[i]=lg[i/2]+1;
return;
}
void p1(){
memset(dp1,0,sizeof(dp1));
memset(dp2,0x3f,sizeof(dp2));
for(int i=1;i<=n;i++)dp1[i][0]=js(i);
for(int k=0;k<20;k++){
for(int i=1;i+(2<<k)-1<=n;i++){
dp1[i][k+1]=max(dp1[i][k],dp1[j(i,(1<<k))][k]);
dp2[i][k+1]=min(dp1[i][k],dp1[j(i,(1<<k))][k]);
if(dp1[i][k+1]==dp2[i][k-1])dp2[i][k-1]=max(dp2[i][k],dp2[j(i,(1<<k))][k]);
}
}
}
void p2(){
for(int k=1;k<20;k++){
for(int x=1;x<=n;x++){
pa[x][k]=pa[pa[x][k-1]][k-1];
}
}
}
void zxscs(){
int h=0;
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++){
if(F(a[i].x)!=F(a[i].y)){
fa[F(a[i].x)]=F(a[i].y);
v[a[i].x].push_back({a[i].y,a[i].w});
v[a[i].y].push_back({a[i].x,a[i].w});
s+=a[i].w;
h++;
l[i]=1;
}
if(h==n-1)break;
}
return;
}
void dfs(int x,int f,int p1,int p2){
d1[x]=p1;
d2[x]=p2;
pa[x][0]=f;
for(auto i:v[x])if(i.v!=f)dfs(i.v,x,p1+1,p2+i.w);
return;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++)cin>>a[i].x>>a[i].y>>a[i].w;
sort(a+1,a+m+1,cmp);
d();
zxscs();
dfs(1,0,0,0);
p1();
p2();
for(int i=1;i<=m;i++){
if(!l[i]){
int d1=q1(a[i].x,a[i].y),d2=q2(a[i].x,a[i].y);
if(a[i].w>d1)miw=min(miw,s-d1+a[i].w);
if(a[i].w==d1)miw=min(miw,s-d2+a[i].w);
}
}
cout<<miw;
return 0;
}