#include<bits/stdc++.h>
using namespace std;
int n,mm,cnt=0;
struct edge
{
int s,t,c;
} ed[300010];
struct e
{
int to,cost;
};
vector <e> v[100010];
int dep[100010],fa[100010],f[100010][22],m[100010][22];
bool p[100010];
int find(int p)
{
if(fa[p]==p) return p;
return fa[p]=find(fa[p]);
}
int dfs(int p,int ff,int fd)
{
dep[p]=dep[ff]+1;
f[p][0]=ff;
m[p][0]=fd;
for(int i=1;i<=18;i++)
{
f[p][i]=f[f[p][i-1]][i-1];
m[p][i]=max(m[p][i-1],m[f[p][i-1]][i-1]);
}
for(int i=0;i<v[p].size();i++)
if(v[p][i].to!=ff)
dfs(v[p][i].to,p,v[p][i].cost);
}
int lca(int p1,int p2)
{
int ans=0;
if(dep[p1]<dep[p2]) swap(p1,p2);
for(int i=20;i>=0;i--)
if(dep[f[p1][i]]<=dep[p2])
{
ans=max(ans,m[p1][i]);
p1=f[p1][i];
}
if(p1==p2) return ans;
for(int i=20;i>=0;i--)
{
if(f[p1][i]!=f[p2][i])
{
p1=f[p1][i],p2=f[p2][i];
ans=max(ans,max(m[p1][i],m[p2][i]));
}
}
ans= max(ans,max(m[p1][0],m[p2][0]));
return ans;
}
bool cmp(edge a,edge b)
{
return a.c < b.c;
}
int main()
{
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
cin>>n>>mm;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=mm;i++)
{
int a,b,o;
scanf("%d%d%d",&a,&b,&o);
ed[i].s=a;
ed[i].t=b;
ed[i].c=o;
v[a].push_back((e){b,o});
v[b].push_back((e){a,o});
}
int base=0;
int u;
sort(ed+1,ed+n+1,cmp);
for(int i=1;i<=mm;i++)
{
int p1=ed[i].s;
int p2=ed[i].t;
p1=find(p1);
p2=find(p2);
if(p1!=p2)
{
u=ed[i].s;
cnt++;
base+=ed[i].c;
p[i]=1;
if(rand()&1)
fa[p1]=p2;
else
fa[p2]=p1;
}
if(cnt==n-1)
break;
}
cout<<base;
dfs(u,0,0);
int ans=9999999;
for(int i=1;i<=mm;i++)
{
if(!p[i])
{
int a=ed[i].s;
int b=ed[i].t;
ans=min(ans,ed[i].c-lca(a,b));
}
}
cout<<base+ans;
return 0;
}
第31行为什么调试显示错误啊,直接不懂