49分求助(悬关)
查看原帖
49分求助(悬关)
380406
allqpsi楼主2023/11/30 20:07
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
	int x,y;
};
struct node2{
	int x,y,w;
};
node2 lin[600005],un[600005];
int n,m,a,b,c,ul=0,fa[600005],ml,x,ex=0,y,w,ans=0,l=0,ll,di[600005],ff[600005][22],ffmax[600005][32],f2max[600005][32],lg[600005],anss=99999999,maxx,max2;
vector<node>vi[600005];
int find(int x){
	if(fa[x]==x){
		return x;
	}
	return fa[x]=find(fa[x]);
}
void merge(int x,int y){
	fa[find(x)]=find(y);
}
bool cmp(node2 a,node2 b){
	return a.w<b.w;
}
void dfs(int x,int fat,int lasw){
	ff[x][0]=fat;
	ffmax[x][0]=lasw;
	di[x]=di[fat]+1;
	for(int i=1;i<=lg[di[x]];i++){
		ff[x][i]=ff[ff[x][i-1]][i-1];
		if(ffmax[x][i-1]>ffmax[ff[x][i-1]][i-1]){
			ffmax[x][i]=ffmax[x][i-1];
			f2max[x][i]=max(ffmax[ff[x][i-1]][i-1],max(f2max[x][i-1],f2max[ff[x][i-1]][i-1]));
		}
		else{
			ffmax[x][i]=ffmax[ff[x][i-1]][i-1];
			if(ffmax[x][i-1]==ffmax[x][i]){
				f2max[x][i]=max(f2max[x][i-1],f2max[ff[x][i-1]][i-1]);
			}
			else{
				f2max[x][i]=max(ffmax[x][i-1],max(f2max[x][i-1],f2max[ff[x][i-1]][i-1]));
			}
		}
	}
	for(int i=0;i<vi[x].size();i++){
		int v=vi[x][i].x,w=vi[x][i].y;
		if(v!=fat){
			dfs(v,x,w);
		}
	}
}
void LCA(int x,int y){
	maxx=0;
	max2=0;
	if(di[x]<di[y]){
		swap(x,y);
	}
	while(di[x]>di[y]){
	//	cout<<x<<' '<<lg[di[x]-di[y]]-1<<' '<<ffmax[x][lg[di[x]-di[y]]-1]<<' '<<f2max[x][lg[di[x]-di[y]]-1]<<endl;
		if(ffmax[x][lg[di[x]-di[y]]-1]>maxx){
			max2=maxx;
			maxx=ffmax[x][lg[di[x]-di[y]]-1];
	//		cout<<maxx<<' '<<max2<<endl;
		}
		else if(f2max[x][lg[di[x]-di[y]]-1]!=maxx){
			max2=max(max2,f2max[x][lg[di[x]-di[y]]-1]);
	//		cout<<max2<<endl;
		}
		x=ff[x][lg[di[x]-di[y]]-1];
	}
	if(x==y){
		return;
	}
	for(int k=lg[di[x]]-1;k>=0;k--){
		if(ff[x][k]!=ff[y][k]){
			x=ff[x][k];
			y=ff[y][k];
		}
	//	cout<<x<<' '<<k<<' '<<ffmax[x][k]<<' '<<f2max[x][k]<<endl;
		if(ffmax[x][k]>maxx){
			max2=maxx;
			maxx=ffmax[x][k];
	//		cout<<maxx<<' '<<max2<<endl;
		}
		if(f2max[x][k]!=maxx){
			max2=max(max2,f2max[x][k]);
	//		cout<<max2<<endl;
		}
		if(ffmax[y][k]>maxx){
			max2=maxx;
			maxx=ffmax[y][k];
	//		cout<<maxx<<' '<<max2<<endl;
		}
		if(f2max[y][k]!=maxx){
			max2=max(max2,f2max[y][k]);
	//		cout<<max2<<endl;
		}
	}
}
signed main(){
	memset(ff,127,sizeof(ff));
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		fa[i]=i;
	}
	for(int i=1;i<=m;i++){
		cin>>a>>b>>c;
		if(a==b){
			continue;
		}
		ml++;
		lin[ml].x=a;
		lin[ml].y=b;
		lin[ml].w=c;
	}
	m=ml;
	sort(lin+1,lin+1+m,cmp);
	for(int i=1;i<=m*2;i++){
		x=lin[i].x;
		y=lin[i].y;
		w=lin[i].w;
	//	cout<<x<<' '<<y<<' '<<w<<endl;
		if(find(x)==find(y)){
			ul++;
			un[ul]=lin[i];
			continue;
		}
		vi[x].push_back(node{y,w});
		vi[y].push_back(node{x,w});
	//	cout<<x<<' '<<y<<endl;
		ans+=w;
		l++;
		merge(x,y);
		if(l==n-1){
			ll=i+1;
			break;
		}
	}
	for(int i=1;i<=n;i++){
		lg[i]=lg[i-1]+(1<<lg[i-1]==i);
	}
//	cout<<ans<<endl;
	dfs(1,0,0);
	for(int j=ll;j<=m;j++){
		LCA(lin[j].x,lin[j].y);
	//	cout<<endl;
	//	cout<<lin[j].x<<' '<<lin[j].y<<' '<<lin[j].w<<' '<<maxx<<' '<<max2<<endl;
		if(maxx==lin[j].w){
			anss=min(anss,ans+lin[j].w-max2);
		}
		else{
			anss=min(anss,ans+lin[j].w-maxx);
		}
	}
	for(int j=1;j<=ul;j++){
		LCA(un[j].x,un[j].y);
	//	cout<<endl;
	//	cout<<un[j].x<<' '<<un[j].y<<' '<<un[j].w<<' '<<maxx<<' '<<max2<<endl;
		if(maxx==un[j].w){
			anss=min(anss,ans+un[j].w-max2);
		}
		else{
			anss=min(anss,ans+un[j].w-maxx);
		}
	}
	cout<<anss;
}
2023/11/30 20:07
加载中...