77pts求调,WA on#7#13
查看原帖
77pts求调,WA on#7#13
977901
int4399楼主2025/2/6 21:25
#include<bits/stdc++.h>
#define P pair<int,int>
#define MP make_pair
#define F first
#define S second
#define int long long
using namespace std;
const int M=6e5+1,N=1e5+1,MAXN=1e18+7;
int n,m,fa[N],ans,lca[N][30],dis[N];
int fmaxx[N][30],smaxx[N][30];
bool min_tree[M];
vector<P> p[N];
struct edge{
	int u,v,data;
	bool operator < (const edge x)const{return data<x.data;}
}e[M];
int find(int x){
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
void KAL(){
	sort(e+1,e+1+m);
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++){
		int x=find(e[i].u),y=find(e[i].v);
		if(x==y) continue;
		ans+=e[i].data;
		min_tree[i]=1;
		fa[x]=y;
	}
}
void dfs(int u){
	for(P q:p[u]){
		int v=q.F,data=q.S;
		if(dis[v]) continue;
		lca[v][0]=u;
		fmaxx[v][0]=data;
		dis[v]=dis[u]+1;
		dfs(v);
	}
} 
void init_lca(){
	int k=__lg(n);
	for(int i=1;i<=k;i++)
		for(int j=1;j<=n;j++){
			lca[j][i]=lca[lca[j][i-1]][i-1];
			fmaxx[j][i]=max(fmaxx[j][i-1],fmaxx[lca[j][i-1]][i-1]);
			if(fmaxx[j][i]!=fmaxx[j][i-1]) smaxx[j][i]=max(fmaxx[j][i-1],smaxx[j][i]);
			if(fmaxx[j][i]!=fmaxx[lca[j][i-1]][i-1]) smaxx[j][i]=max(fmaxx[lca[j][i-1]][i-1],smaxx[j][i]);
			smaxx[j][i]=max(smaxx[j][i],smaxx[j][i-1]);
			smaxx[j][i]=max(smaxx[j][i],smaxx[lca[j][i-1]][i-1]);
		}
}
int LCA_C(int x,int y){
	int k=__lg(n);
	if(dis[x]>dis[y]) swap(x,y);
	for(int i=k;i>=0;i--)
		if(dis[lca[x][i]]>=dis[y]) x=lca[x][i];
	if(x==y) return x;
	for(int i=k;i>=0;i--)
		if(lca[x][i]!=lca[y][i]&&lca[x][i]&&lca[y][i])
			x=lca[x][i],y=lca[y][i];
	return lca[x][0];
}
int check(int x,int LCA,int data){
	if(x==LCA) return MAXN;
	int k=__lg(n);
	int first_max=-MAXN,second_max=-MAXN;
	for(int i=k;i>=0;i--){
		if(dis[lca[x][i]]<dis[LCA]) continue;
		first_max=max(first_max,fmaxx[x][i]);
		if(fmaxx[x][i]<first_max) second_max=max(second_max,fmaxx[x][i]);
		second_max=max(second_max,smaxx[x][i]);
		x=lca[x][i];
		if(x==LCA) break;
	}
	if(first_max==data) return data-second_max;
	else return data-first_max;
}
signed main(){
	cin>>n>>m;
	for(int i=1,x,y,z;i<=m;i++) cin>>e[i].u>>e[i].v>>e[i].data;
	KAL();
	for(int i=1;i<=m;i++){
		int u=e[i].u,v=e[i].v,data=e[i].data;
		if(min_tree[i]){
			p[u].push_back(MP(v,data));
			p[v].push_back(MP(u,data));
		}
	}
	dis[1]=1;
	dfs(1);
	init_lca();
	int add_min=MAXN;
	for(int i=1;i<=m;i++){
		if(min_tree[i]) continue;
		int u=e[i].u,v=e[i].v,data=e[i].data;
		if(u==v) continue;
		int LCA=LCA_C(u,v);
		int p1=check(u,LCA,data),p2=check(v,LCA,data);
		add_min=min(add_min,min(p1,p2));
	}
	cout<<ans+add_min<<'\n';
	return 0;
}
2025/2/6 21:25
加载中...