救救我,我可不想明天被老师批评啊
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,anss,ans=1e18;
struct node{
int x,y,z;
} a[300010];
bool cmp(node a,node b){
return a.z<b.z;
}
vector<pair<int,int> > v[100010];
bool vis[300010],vv[300010];
int fat[100010],fa[100010][20],maxs[100010][20],h[100010];
int find(int x){
if(fat[x]==x) return x;
return fat[x]=find(fat[x]);
}
void Krus(){
int s=0;
for(int i=1;i<=n;i++) fat[i]=i;
for(int i=1;i<=m;i++){
int x=find(a[i].x),y=find(a[i].y);
if(x!=y){
vis[i]=1;
fat[x]=y;
s++;
anss+=a[i].z;
v[a[i].x].push_back(make_pair(a[i].y,a[i].z));
v[a[i].y].push_back(make_pair(a[i].x,a[i].z));
}
if(s==n-1) break;
}
}
void dfs(int now,int s){
h[now]=s;
for(int i=0;i<v[now].size();i++){
int t=v[now][i].first;
if(!vv[t]){
fa[t][0]=now;
maxs[t][0]=v[now][i].second;
vv[t]=1;
dfs(t,s+1);
}
}
}
void init(){
for(int i=1;i<20;i++){
for(int j=1;j<=n;j++) fa[j][i]=fa[fa[j][i-1]][i-1];
}
for(int i=1;i<20;i++){
for(int j=1;j<=n;j++) maxs[j][i]=max(maxs[j][i-1],maxs[fa[j][i-1]][i-1]);
}
}
int f(int a,int b){
if(h[a]<h[b]) swap(a,b);
int s=0;
while(h[a]>h[b]){
int l=log2(h[a]-h[b]);
s=max(s,maxs[a][l]);
a=fa[a][l];
}
for(int i=log2(h[a]);i>=0;i--){
if(fa[a][i]!=fa[b][i]){
s=max(s,max(maxs[a][i],maxs[b][i]));
a=fa[a][i];
b=fa[b][i];
}
}
return max(s,max(maxs[a][0],maxs[b][0]));
}
signed main(){
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++) scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].z);
sort(a+1,a+m+1,cmp);
Krus();
vv[1]=1;
dfs(1,0);
init();
for(int i=1;i<=m;i++){
if(!vis[i]) ans=min(ans,anss-f(a[i].x,a[i].y)+a[i].z);
}
printf("%lld",ans);
return 0;
}