77pts求调
查看原帖
77pts求调
487397
Lagrange_i_f楼主2024/4/21 10:11
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=7e5+10;
struct edge{
	int x,y,w;
	bool operator<(const edge p)const{
		return w<p.w; 
	}
}R[N];
int n,m; 
int f[N];
void init(){
	for(int i=1;i<=n;i++)f[i]=i; 
}
int find(int x){
	if(f[x]==x)return x;
	return f[x]=find(f[x]);
}
bool in[N];
int head[N],vct[N],nxt[N],edge[N],idx;
void add(int x,int y,int w){
	vct[++idx]=y;edge[idx]=w;
	nxt[idx]=head[x];head[x]=idx;
}
int maxi[N][30],maxx[N][30],fa[N][30],dep[N];
void dfs(int u,int fs){
	for(int i=head[u];i;i=nxt[i]){
		int v=vct[i];
		if(v==fs)continue;
		fa[v][0]=u;maxi[v][0]=edge[i];
		dfs(v,u);
	}
}
void init1(){
	for(int k=1;k<=29;k++){
		for(int i=1;i<=n;i++){
			fa[i][k]=fa[fa[i][k-1]][k-1];
			maxi[i][k]=max(maxi[i][k-1],maxi[fa[i][k-1]][k-1]);
			maxx[i][k]=max(maxx[i][k-1],maxx[fa[i][k-1]][k-1]);
			if(maxi[i][k-1]!=maxi[fa[i][k-1]][k-1]) maxx[i][k]=max(maxx[i][k],min(maxi[i][k-1],maxi[fa[i][k-1]][k-1]));
		}
	}
}
int maxS(int x,int y){
	if(x>y)return x;
	else return y;
}
int minS(int x,int y){
	if(x<y)return x;
	else return y;
}
unsigned long long ans=1e15;
unsigned long long sum=0;
void work(int x,int y,int id){
	int max1=-0x7f7f7f7f;
	if(dep[x]>dep[y])swap(x,y);
	for(int i=29;i>=0;i--){
		if(dep[fa[y][i]]>=dep[x]){
			if(R[id].w==maxi[y][i])max1=max(maxx[y][i],max1);
			else max1=max(maxi[y][i],max1);
			y=fa[y][i];
		}
	}
	if(x==y){
	}else{
		for(int i=29;i>=0;i--){
			if(fa[x][i]!=fa[y][i]){
				if(R[id].w==maxi[y][i])max1=max(maxx[y][i],max1);
				else max1=max(maxi[y][i],max1);
				if(R[id].w==maxi[x][i])max1=max(maxx[x][i],max1);
				else max1=max(maxi[x][i],max1);
				y=fa[y][i];
				x=fa[x][i];
			} 
		}
		if(R[id].w==maxi[y][0])max1=max(maxx[y][0],max1);
		else max1=max(maxi[y][0],max1);
		if(R[id].w==maxi[x][0])max1=max(maxx[x][0],max1);
		else max1=max(maxi[x][0],max1);
		y=fa[y][0];
		x=fa[x][0];
	}
	ans=minS(R[id].w-max1+sum,ans);
}
signed main(){
	memset(maxi,-0x7f7f7f7f,sizeof maxi);
	memset(maxx,-0x7f7f7f7f,sizeof maxx);
	cin>>n>>m;
	for(int i=1;i<=m;i++)cin>>R[i].x>>R[i].y>>R[i].w;
	sort(R+1,R+1+m);
	init();
	for(int i=1;i<=m;i++){
		int sum1=find(R[i].x),sum2=find(R[i].y);
		if(sum1==sum2)continue;
		f[sum1]=sum2;
		in[i]=1;
		sum+=R[i].w;
		add(R[i].x,R[i].y,R[i].w);add(R[i].y,R[i].x,R[i].w);
	} 
//	cout<<sum;
	dfs(1,0);
	init1();
//	for(int i=1;i<=n;i++){
//		for(int j=1;j<=19;j++)cout<<maxi[i][j]<<'*'<<maxx[i][j]<<' ';
//		cout<<'\n';
//	}
	for(int i=1;i<=m;i++){
		if(!in[i]&&R[i].x!=R[i].y){
			work(R[i].x,R[i].y,i);
		}
	}
	cout<<ans;
	return 0;
}
2024/4/21 10:11
加载中...