严格次小生成树10pts求助
查看原帖
严格次小生成树10pts求助
631550
liuziqin楼主2023/10/14 08:53
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=300005;
int father[N][21],mx[N][21],fa[N],n,m,tot,dep[N],ans,ans2=0x7fffffffffffffff;
bool vis[N];
struct data{
	int to,next,num;
}a[N];
int head[N];
void add(int u,int v,int w){
	a[++tot].to=v;
	a[tot].next=head[u];
	a[tot].num=w;
	head[u]=tot;
}
void dfs(int it,int f){
	dep[it]=dep[f]+1;
	father[it][0]=f;
	for(int i=1;i<=20;i++){
		father[it][i]=father[father[it][i-1]][i-1];
		mx[it][i]=max(mx[it][i-1],mx[father[it][i-1]][i-1]);
	}
	for(int i=head[it];i;i=a[i].next){
		int tmp=a[i].to;
		if(tmp==f)continue;
		mx[tmp][0]=a[tmp].num;
		dfs(tmp,it);
	}
}
void pre(){
	for(int i=1;i<=20;i++){
		for(int j=1;j<=n;j++){
			int next=father[j][i-1];
			father[j][i]=father[next][i-1];
			mx[j][i]=max(mx[j][i-1],mx[next][i-1]);
		}
	}
}
int find(int x){
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
struct node{
	int l,r,num;
}input[N*3];
bool cmp(node a,node b){
	return a.num<b.num;
}
void mst(){
	for(int i=1;i<=n;i++)fa[i]=i;
	sort(input+1,input+m+1,cmp);
	int cnt=0;
	for(int i=1;i<=m&&cnt<n-1;i++){
		int p=find(input[i].l),q=find(input[i].r);
		if(p==q)continue;
		vis[i]=1;
		fa[p]=q;
		ans+=input[i].num;
		add(input[i].l,input[i].r,input[i].num);
		add(input[i].r,input[i].l,input[i].num);
		cnt++;
	}
}
int lca(int x,int y){
	if(dep[x]<dep[y])swap(x,y);
	int res=0;
	for(int i=20;i>=0;i--)
	if(dep[father[x][i]]>=dep[y]){
		res=max(res,mx[x][i]);
		x=father[x][i];
	}
	if(x==y)return res;
	for(int i=20;i>=0;i--)
	if(father[x][i]!=father[y][i]){
		res=max(res,max(mx[x][i],mx[y][i]));
		x=father[x][i],y=father[y][i];
	}
	return max(res,max(mx[x][0],mx[y][0]));
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie();
	cout.tie();
	cin>>n>>m;
	for(int i=1;i<=m;i++)cin>>input[i].l>>input[i].r>>input[i].num;
	mst();
	dfs(1,0);
	pre();
	for(int i=1;i<=m;i++){
		if(vis[i])continue;
		int num=lca(input[i].l,input[i].r);
		if(input[i].num-num<=0)continue;
		ans2=min(ans2,ans+input[i].num-num);
	}
	cout<<ans2;
} 
2023/10/14 08:53
加载中...