比赛 2025暑期集训第8场 评测结果 AAAAAAAAAA
题目名称 次小生成树 最终得分 100
用户昵称 李金泽 运行时间 0.437 s
代码语言 C++ 内存使用 15.12 MiB
提交时间 2025-08-13 09:50:57
显示代码纯文本
#include<cstdio>
#include<algorithm>
#define N 100005
#define M 300005
#define ll long long
using namespace std;
ll n,m,h[N],cnt,d[N],f[N][20],ma[N][20],se[N][20],fa[N],x,y,z;
ll sum,ans=1e18;
struct ed{ll u,v,w;bool f;bool operator<(ed y){return w<y.w;}}E[M];
struct edge{ll v,n,w;}e[M<<1];
void ad(ll u,ll v,ll w){e[++cnt]={v,h[u],w};h[u]=cnt;}
ll max(ll x,ll y){return x>y?x:y;}
ll min(ll x,ll y){return x<y?x:y;}
void sec(ll x,ll y,ll a,ll b,ll &m,ll &s)
{
	if(x==a)s=max(y,b);
	else if(x<a)s=max(x,b);
	else s=max(y,a);
	m=max(x,a);
}
ll fd(ll x){return x^fa[x]?fa[x]=fd(fa[x]):x;}
void mg(ll x,ll y){fa[fd(x)]=fd(y);}
void swap(ll &x,ll &y){ll t=x;x=y;y=t;}
void dfs(ll u,ll fa)
{
	d[u]=d[fa]+1;
	for(ll i=h[u];i;i=e[i].n)
	{
		ll v=e[i].v;
		if(d[v]||u==v)continue;
		f[v][0]=u;
		ma[v][0]=e[i].w;
		se[v][0]=-1e9;
		dfs(v,u);
	}
}
void init()
{
	for(ll k=1;k<20;k++)
		for(ll i=1;i<=n;i++)
		{
			f[i][k]=f[f[i][k-1]][k-1];
			ll j=f[i][k-1];
			sec(ma[i][k-1],se[i][k-1],ma[j][k-1],se[j][k-1],ma[i][k],se[i][k]);
		}
}
void get(ll x,ll y,ll &m,ll &s)
{
	m=0,s=-1e9;
	if(d[x]<d[y])swap(x,y);
	for(ll k=19;~k;k--)
		if(d[f[x][k]]>=d[y])
			sec(m,s,ma[x][k],se[x][k],m,s),x=f[x][k];
	if(x==y)return;
	for(ll k=19;~k;k--)
		if(f[x][k]^f[y][k])
		{
			sec(m,s,ma[x][k],se[x][k],m,s);
			sec(m,s,ma[y][k],se[y][k],m,s);
			x=f[x][k],y=f[y][k];
		}
	sec(m,s,ma[x][0],se[x][0],m,s);
	sec(m,s,ma[y][0],se[y][0],m,s);
	return;
}
ll read(){
	ll sum=0;bool f=0;char c=getchar();
	for(;c<48||c>57;c=getchar())if(c==45)f=1;
	for(;c>=48&&c<=57;c=getchar())sum=sum*10+(c&15);
	return f?-sum:sum; 
}
int main(){
	freopen("secmst.in","r",stdin);freopen("secmst.out","w",stdout);
	n=read(),m=read();
	for(ll i=1;i<=n;i++)fa[i]=i;
	for(ll i=1;i<=m;i++)
	{
		x=read(),y=read(),z=read();
		E[i]={x,y,z,0};
	}
	sort(E+1,E+m+1);
	for(ll i=1;i<=m;i++)
	{
		ll u=E[i].u,v=E[i].v,w=E[i].w;
		if(fd(u)==fd(v))continue;
		mg(u,v);
		sum+=w;
		E[i].f=1;
	}
	for(ll i=1;i<=m;i++)
		if(E[i].f)
			ad(E[i].u,E[i].v,E[i].w),ad(E[i].v,E[i].u,E[i].w);
	dfs(1,0);init();
	for(ll i=1;i<=m;i++)
		if(!E[i].f&&E[i].u^E[i].v)
		{
			get(E[i].u,E[i].v,x,y);
			if(x==E[i].w)x=y;
			ans=min(ans,sum+E[i].w-x);
		}
	printf("%lld",ans);
	return 0;
}