大佬,我需要你!!!
查看原帖
大佬,我需要你!!!
1048929
zza_luogu楼主2024/8/6 21:10

50pts代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,s,fa[100005],l[300005],lg[100005],dp1[100005][25],dp2[100005][25],pa[100005][25],d1[100005],d2[100005],miw=1e18;
struct bq{
	int x,y,w;
}a[300005];
struct tb{
	int v,w;
};
vector<tb>v[100005];
int F(int x){
	if(fa[x]==x)return x;
	return F(fa[x]);
}
int js(int x){
	return d2[x]-d2[pa[x][0]];
}
int j(int x,int d){
	for(int i=0;i<20;i++)if((d>>i)&1)x=pa[x][i];
	return x;
}
int q1(int a,int b){
	int k1=lg[d1[a]],k2=lg[d1[b]];
	return max(max(dp1[a][k1],dp1[j(a,d1[a]-(1<<k1))][k1]),max(dp1[b][k2],dp1[j(b,d1[b]-(1<<k2))][k2]));
}
int q2(int a,int b){
	int k1=lg[d1[a]],k2=lg[d1[b]];
	int p=min(max(dp1[a][k1],dp1[j(a,d1[a]-(1<<k1))][k1]),max(dp1[b][k2],dp1[j(b,d1[b]-(1<<k2))][k2]));
	if(p==q1(a,b))p=max(max(dp2[a][k1],dp2[j(a,d1[a]-(1<<k1))][k1]),max(dp2[b][k2],dp2[j(b,d1[b]-(1<<k2))][k2]));
	return p;
}
int LCA(int x,int y){
	if(d1[x]>d1[y])swap(x,y);
	y=j(y,d1[y]-d1[x]);
	if(x==y)return x;
	for(int i=19;i>=0;i--){
		if(pa[x][i]!=pa[y][i]){
			x=pa[x][i];
			y=pa[y][i];
		}
	}
	return pa[x][0];
}
bool cmp(bq a,bq b){
	return a.w<b.w;
}
void d(){
	for(int i=2;i<=n;i++)lg[i]=lg[i/2]+1;
	return;
}
void p1(){
	memset(dp1,0,sizeof(dp1));
	memset(dp2,0x3f,sizeof(dp2));
	for(int i=1;i<=n;i++)dp1[i][0]=js(i);
	for(int k=0;k<20;k++){
		for(int i=1;i+(2<<k)-1<=n;i++){
			dp1[i][k+1]=max(dp1[i][k],dp1[j(i,(1<<k))][k]);
			dp2[i][k+1]=min(dp1[i][k],dp1[j(i,(1<<k))][k]);
			if(dp1[i][k+1]==dp2[i][k-1])dp2[i][k-1]=max(dp2[i][k],dp2[j(i,(1<<k))][k]);
		}
	}
}
void p2(){
	for(int k=1;k<20;k++){
		for(int x=1;x<=n;x++){
			pa[x][k]=pa[pa[x][k-1]][k-1];
		}
	}
}
void zxscs(){
	int h=0;
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=m;i++){
		if(F(a[i].x)!=F(a[i].y)){
			fa[F(a[i].x)]=F(a[i].y);
			v[a[i].x].push_back({a[i].y,a[i].w});
			v[a[i].y].push_back({a[i].x,a[i].w});
			s+=a[i].w;
			h++;
			l[i]=1;
		}
		if(h==n-1)break;
	}
	return;
}
void dfs(int x,int f,int p1,int p2){
	d1[x]=p1;
	d2[x]=p2;
	pa[x][0]=f;
	for(auto i:v[x])if(i.v!=f)dfs(i.v,x,p1+1,p2+i.w);
	return;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++)cin>>a[i].x>>a[i].y>>a[i].w;
	sort(a+1,a+m+1,cmp);
	d();
	zxscs();
	dfs(1,0,0,0);
	p1();
	p2();
	for(int i=1;i<=m;i++){
		if(!l[i]){
			int d1=q1(a[i].x,a[i].y),d2=q2(a[i].x,a[i].y);
			if(a[i].w>d1)miw=min(miw,s-d1+a[i].w);
			if(a[i].w==d1)miw=min(miw,s-d2+a[i].w);
		}
	}
	cout<<miw;
	return 0;
}
2024/8/6 21:10
加载中...