求调
查看原帖
求调
1124817
shufeng2007楼主2024/7/21 17:52
#include<bits/stdc++.h>
using namespace std;
const int N=1000010,M=2000010;
struct E{
	int a,b,w;
	bool used;
}edge[M];

int h[N],e[M],w[M],ne[M],idx;
int p[N];
int n,m;
int dis1[N][N],dis2[N][30];
int dep[N],f[N][30];

bool cmp(E a,E b){
	return a.w<b.w;
}

void add(int a,int b,int c){
	e[idx]=b;
	w[idx]=c;
	ne[idx]=h[a];
	h[a]=idx++;
}

int find(int x){
	if(x!=p[x]){
		p[x]=find(p[x]);	
	}
	return p[x];
}

void dfs(){//预处理 
	memset(dep,0x3f,sizeof dep);
	dep[0]=0;
	dep[1]=1;
	queue<int> q;
	q.push(1);
	while(!q.empty()){
		int p=q.front();
		q.pop();
		for(int i=h[p];i!=-1;i=ne[i]){
			int j=e[i];
			if(dep[j]>dep[p]){
				dep[j]=dep[p]+1;
				q.push(j);
				f[j][0]=p;
				dis1[j][0]=w[i];
				dis2[j][0]=-0x3f3f3f3f;
				for(int k=1;k<=30;k++){
					int anc=f[j][k-1];
					f[j][k]=f[anc][k-1];
					int distance[4]={dis1[j][k-1],dis1[anc][k-1],dis2[j][k-1],dis2[anc][k-1]};
					dis1[j][k]=-0x3f3f3f3f;
					dis2[j][k]=-0x3f3f3f3f;
					for(int u=0;u<4;u++){
						int d=distance[u];
						if(d>dis1[j][k]){
							dis2[j][k]=dis1[j][k];
							dis1[j][k]=d;
						}
						else if(d<dis1[j][k]&&d>dis2[j][k]){
							dis2[j][k]=d;
						}
					}
				}
			}
		}
	}	
}

long long lca(int a,int b,int w){
	int dis[2*N];
	int cnt=0;
	if(dep[a]<dep[b]){
		swap(a,b);
	}
	for(int k=10;k<=0;k--){
		if(dep[f[a][k]]>=dep[b]){
			a=f[a][k];
			dis[cnt++]=dis1[a][k];
			dis[cnt++]=dis2[a][k];
		}
	}
	if(a!=b){
		for(int k=10;k<=0;k--){
			if(f[a][k]!=f[b][k]){
				dis[cnt++]=dis1[a][k];
				dis[cnt++]=dis2[b][k];
				dis[cnt++]=dis2[a][k];
				dis[cnt++]=dis2[b][k];
				a=f[a][k];
				b=f[b][k];
			}
		}
	}
	dis[cnt++]=dis1[a][0];
	dis[cnt++]=dis1[b][0];
	int max1=-0x3f3f3f3f;
	int max2=-0x3f3f3ff3;
	for(int i=0;i<cnt;i++){
		if(dis[i]>max1){
			max2=max1;
			max1=dis[i];
		}
		else if(dis[i]<max1 && dis[i]>max2){
			max2=dis[i];
		}
	}
	if(w>max1){
		return w=max1;
	}
	return w-max2;
}

int main(){
	int n,m;
	cin>>n>>m;
	memset(h,-1,sizeof h);
	for(int i=1;i<=m;i++){
		cin>>edge[i].a>>edge[i].b>>edge[i].w;
	}
	sort(edge+1,edge+m+1,cmp);
	for(int i=1;i<=n;i++) p[i]=i;
	long long sum=0;
	for(int i=1;i<=m;i++){
		int a=edge[i].a,b=edge[i].b,c=edge[i].w;
		int pa=find(a),pb=find(b);
		if(pa!=pb){
			p[pa]=pb;
			sum+=c;
			edge[i].used=1;
			add(a,b,c);
			add(b,a,c);
		}
	}
	dfs();
	long long res=1e18;
	for(int i=1;i<=m;i++){
		if(edge[i].used==0){
			int a=edge[i].a,b=edge[i].b,c=edge[i].w;
			res=min(res,sum+lca(a,b,c));
		}
	}
	cout<<res<<endl;
	return 0;
}
2024/7/21 17:52
加载中...