比赛 |
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;
}