93pts WA on #4
查看原帖
93pts WA on #4
984450
zhoujinhong楼主2024/8/13 19:54
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define minn(a,b) a<b?a:b
#define maxx(a,b) a>b?a:b
const int N=100010,M=300010,K=21;
int n,m,fa[N],tot,vis[M],mn,ans,dep[N],dp[N][K],mx1[N][K],mx2[N][K];
struct node{
	int u,v,w,id;
}a[M],b[N];
struct pos{
	int to,w;
};
vector<pos>ve[N];
bool cmp(node x,node y){
	return x.w<y.w;
}
void init(){
	for(int i=1;i<=n;i++) fa[i]=i; 
	return;
}
int find(int x){
	return x==fa[x]?x:fa[x]=find(fa[x]);
}
void kruskal(){
	init(); 
	sort(a+1,a+m+1,cmp);
	for(int i=1;i<=m;i++){
		int fu=find(a[i].u),fv=find(a[i].v);
		if(fu==fv) continue;
		fa[fv]=fu;
		vis[a[i].id]=1;
		b[++tot]=a[i];
		ans+=a[i].w;
	}
	return;
}
void pre_dfs(int now,int fa,int val){
	dep[now]=dep[fa]+1;
	dp[now][0]=fa;
	mx1[now][0]=val;
	for(int i=1;i<=20;i++){
		dp[now][i]=dp[dp[now][i-1]][i-1];
		mx1[now][i]=maxx(mx1[now][i-1],mx1[dp[now][i-1]][i-1]);
		if(mx1[now][i-1]!=mx1[dp[now][i-1]][i-1]) mx2[now][i]=minn(mx1[now][i-1],mx1[dp[now][i-1]][i-1]);	
		mx2[now][i]=maxx(mx2[now][i],maxx(mx2[now][i-1],mx2[dp[now][i-1]][i-1]));
	}
	for(int i=0;i<ve[now].size();i++){
		int tmp1=ve[now][i].to,tmp2=ve[now][i].w;
		if(tmp1!=fa){
			pre_dfs(tmp1,now,tmp2);
		}
	}
	return;
}
void find_mx(int &ans1,int &ans2,int i,int j){
	if(mx1[i][j]>ans1){
		ans1=mx1[i][j];
		if(mx2[i][j]>ans2){
			ans2=mx2[i][j];
		}
	}
	else{
		if(mx1[i][j]>ans2){
			ans2=mx1[i][j];
		}
		else{
			if(mx2[i][j]>ans2){
				ans2=mx2[i][j];
			}
		}
	} 
	return;
}
int lca(int x,int y,int z){
	int tmp1=-1,tmp2=-1;
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=20;i>=0;i--){
		if(dep[dp[x][i]]>=dep[y]){
			find_mx(tmp1,tmp2,x,i);
			x=dp[x][i];
		}
	} 
	if(x==y){
		if(tmp1<z && tmp1!=-1) return z-tmp1;
		else if(tmp2<z && tmp2!=-1) return z-tmp2;
		else return -1;  
	}
	for(int i=20;i>=0;i--){
		if(dp[x][i]!=dp[y][i]){
			find_mx(tmp1,tmp2,x,i);
			find_mx(tmp1,tmp2,y,i);
			x=dp[x][i];
			y=dp[y][i];
		}
	}
	find_mx(tmp1,tmp2,x,0);
	find_mx(tmp1,tmp2,y,0);
	if(tmp1<z && tmp1!=-1) return z-tmp1;
	else if(tmp2<z && tmp2!=-1) return z-tmp2;
	else return -1; 
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>a[i].u>>a[i].v>>a[i].w;
		a[i].id=i;
	} 
	kruskal();
	for(int i=1;i<=tot;i++){
		ve[b[i].u].push_back({b[i].v,b[i].w});
		ve[b[i].v].push_back({b[i].u,b[i].w});
	}
	pre_dfs(1,0,0);
	mn=LONG_LONG_MAX;
	for(int i=1;i<=m;i++){
		if(!vis[a[i].id]){
			int tmp=lca(a[i].u,a[i].v,a[i].w);
			if(tmp!=-1){
				mn=minn(mn,tmp);
			}
		}
	}
	cout<<ans+mn;
	return 0;
}  
2024/8/13 19:54
加载中...