求助最后一个点 MLE
查看原帖
求助最后一个点 MLE
637073
wujingfey楼主2024/9/23 15:49
#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
using namespace std;
const int N=2e5+7,M=3e5+7,INF=1e18+7;
int n,m,fa[N],book[N],dep[N],ans1=0,ans2=INF;
struct NODE{
	int x,y,z;
}a[M];
struct TREE{
	int val,idx;
}g[N][22];
vector<pii> e[N];
bool cmp(NODE a1,NODE a2){
	return a1.z<a2.z;
}
int find(int x){
	if(fa[x]==x) return x;
	return fa[x]=find(fa[x]);
}
void dfs(int u,int f,int k){
	dep[u]=dep[f]+1;
	g[u][0]={k,f};
	for(int i=1;i<=20;i++){
		g[u][i].idx=g[g[u][i-1].idx][i-1].idx;
		g[u][i].val=max(g[u][i-1].val,g[g[u][i-1].idx][i-1].val);
	}
	for(int i=0;i<e[u].size();i++){
		int v=e[u][i].first,w=e[u][i].second;
		if(v==f) continue;
		dfs(v,u,w);
	}
}
int LCA(int x,int y,int w){//寻找链上最大边 
	int r1=0,r2=0;//r1最大值,r2次大值 
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=20;i>=0;i--){
		if(g[x][i].idx==0) continue;
		if(dep[g[x][i].idx]>=dep[y]){
			if(g[x][i].val>r1) r2=r1,r1=g[x][i].val;
			else if(g[x][i].val>r2) r2=g[x][i].val;
			x=g[x][i].idx;
		}
	}
	if(x==y){
		if(w==r1) return w-r2;
		else return w-r1; 	
	}
	for(int i=20;i>=0;i--){
		if(g[x][i].idx==0 || g[y][i].idx==0) continue;
		if(g[x][i].idx!=g[y][i].idx){
			if(g[x][i].val>r1) r2=r1, r1=g[x][i].val; 
			else if(g[x][i].val>r2) r2=g[x][i].val;
			if(g[y][i].val>r1) r2=r1, r1=g[y][i].val;
			else if(g[x][i].val>r2) r2=g[y][i].val; 
			x=g[x][i].idx;
			y=g[y][i].idx;
		}
	}
	if(g[x][0].val>r1) r2=r1, r1=g[x][0].val;
	else if(g[x][0].val>r2) r2=g[x][0].val;
	if(g[y][0].val>r1) r2=r1, r1=g[y][0].val;
	else if(g[y][0].val>r2) r2=g[y][0].val;
	if(w==r1) return w-r2;
	else return w-r1; 
}
signed main(){
//	freopen("P4180_1.in","r",stdin);
//	freopen("P4180.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++){
		int a1,a2,a3;
		cin>>a1>>a2>>a3;
		if(a1==a2) a3=INF;
		a[i]={a1,a2,a3};
	}
	sort(a+1,a+1+m,cmp);
	for(int i=1;i<=m;i++){
		int u=a[i].x, v=a[i].y, w=a[i].z;
		if(find(u)!=find(v)){
			fa[find(u)]=find(v);
			e[u].push_back({v,w});
			e[v].push_back({u,w});
			book[i]=1,ans1+=w;
		}
	}
	dfs(1,0,0);
	for(int i=1;i<=m;i++){
		if(book[i]) continue;
		int u=a[i].x,v=a[i].y,w=a[i].z;
		ans2=min(ans2,LCA(u,v,w));
	}
	cout<<ans1+ans2;
	return 0;
}
2024/9/23 15:49
加载中...