寄掉的次小生成树
查看原帖
寄掉的次小生成树
494601
gcx12012楼主2023/4/25 16:37
#include<bits/stdc++.h>
#include<cmath>
#define ll long long
#define N 100010

using namespace std;
ll fa[N],f[N][21],g[N][21][2],dep[N];
ll n,m,sum=0,minn=1000000000000000000;
struct node{
	ll u,v,w;
}e[N*3];
int bj[N*3];
vector<int >G[N];

ll read(){
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
bool cmp(node x,node y){
	return x.w<y.w;
}
int gf(int x){
	if(fa[x]==x) return x;
	return fa[x]=gf(fa[x]);
}
int get_lca(int u,int v){
	if(dep[u]<dep[v]) swap(u,v);
	for(int i=20;i>=0;i--){
		if(dep[f[u][i]]>=dep[v]) u=f[u][i];
	}
	if(u==v) return u;
	for(int i=20;i>=0;i--){
		if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
	}
	return f[u][0];
}
void dfs(int u,int fr){
	dep[u]=dep[f[u][0]]+1;
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(v==fr) continue;
		dfs(v,u);
	}
}

int main()
{
    //freopen("candy.in","r",stdin);
    //freopen("candy.out","w",stdout);
    n=read(),m=read();
    for(int i=1;i<=m;i++){
    	ll u=read(),v=read(),w=read();
    	if(u==v) continue;
    	if(u>v) swap(u,v);
    	e[i].u=u,e[i].v=v,e[i].w=w;
	}
	for(int i=1;i<=n;i++) fa[i]=i;
	sort(e+1,e+m+1,cmp);
	for(int i=1;i<=m;i++){
		int u=gf(e[i].u),v=gf(e[i].v);
		if(u!=v){
			fa[v]=u;
			f[e[i].v][0]=e[i].u;
			g[e[i].v][0][0]=e[i].w;
			bj[i]=1;
			sum+=e[i].w;
			G[e[i].u].push_back(e[i].v);
			G[e[i].v].push_back(e[i].u);
		}
	}
	//for(int i=1;i<=n;i++) cout<<f[i][0]<<' ';
	//cout<<endl;
	dfs(1,0);
	for(int i=n;i>=1;i--){
		for(int j=1;j<=20;j++){
			f[i][j]=f[f[i][j-1]][j-1];
			ll a[4]={g[i][j-1][0],g[i][j-1][1],g[f[i][j-1]][j-1][0],g[f[i][j-1]][j-1][1]};
			ll zd=0,cd=-1;
			if(a[0]>zd) cd=zd,zd=a[0];
			else if(a[0]>cd) cd=a[0];
			if(a[1]>zd) cd=zd,zd=a[1];
			else if(a[1]>cd) cd=a[1];
			if(a[2]>zd) cd=zd,zd=a[2];
			else if(a[2]>cd) cd=a[2];
			if(a[3]>zd) cd=zd,zd=a[3];
			else if(a[3]>cd) cd=a[3];
			g[i][j][0]=zd;
			g[i][j][1]=cd;
		}
	}
	for(int i=1;i<=m;i++){
		if(!bj[i]){
			int u=e[i].u,v=e[i].v,w=e[i].w;
			int fu=get_lca(u,v);
			//cout<<fu<<endl;
			ll zd=0,cd=-1;
			for(int j=20;j>=0;j--){
				if(dep[f[u][j]]>=dep[fu]){
					ll z1=g[u][j][0],z2=g[u][j][1];
					if(z2>zd) cd=zd,zd=z2;
					else if(z2>cd) cd=z2;
					if(z1>zd) cd=zd,zd=z1;
					else if(z1>cd) cd=z1;
					u=f[u][j];
				}
			}
			for(int j=20;j>=0;j--){
				if(dep[f[v][j]]>=dep[fu]){
					ll z1=g[v][j][0],z2=g[v][j][1];
					if(z2>zd) cd=zd,zd=z2;
					else if(z2>cd) cd=z2;
					if(z1>zd) cd=zd,zd=z1;
					else if(z1>cd) cd=z1;
					v=f[v][j];
				}
			}
			//cout<<zd<<' '<<cd<<endl;
			if(w==zd) minn=min(minn,w-cd);
			else minn=min(minn,w-zd);
		}
	}
	cout<<sum+minn;
    return 0;
}
/*
8 10
3 6 31415926
6 5 1
5 4 27182818
3 4 1
1 3 11
1 2 7
2 3 13
7 5 23333
8 5 55555
7 8 37
*/
2023/4/25 16:37
加载中...