42pts玄关求调
查看原帖
42pts玄关求调
404334
Steve1209楼主2024/4/20 07:41

rt

#include<bits/stdc++.h>
using namespace std;
int n,m;
long long root[100010],dep[100010],fa[100010][20],dmax[100010][20],dmaxc[100010][20];
bool used[600060];
long long dis;
long long edis[600060];
int find(int x){
	if(x!=root[x])root[x]=find(root[x]);
	return root[x];
}
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
struct lst{
	int f=-1,x,y,w;
	bool operator<(const lst &x)const
	{
		return x.w>w;
	}
}e[600060],tr[600060];
queue<int> o;
int h[200020],cnt=1;
void add(int xx,int yy,int ww){
	tr[cnt].f=h[xx];
	tr[cnt].x=xx;
	tr[cnt].y=yy;
	tr[cnt].w=ww;
	h[xx]=cnt++;
}
long long lcs(int a,int b,int w1){
	long long mx=0,cmax=0,shu[100010],cnts=0;
	while(dep[a]!=dep[b]){
		int k;
		for(k=16;k>=0;k--){
			if(dep[a]-(1<<k)>=dep[b])break;
		}
		a=fa[a][k];
		shu[++cnts]=dmax[a][k];
		shu[++cnts]=dmaxc[a][k];
	}
	while(a!=b){
		int k=16;
		while(fa[a][k]==fa[b][k]&&k>0)k--;
		a=fa[a][k];
		b=fa[b][k];
		shu[++cnts]=dmax[a][k];
		shu[++cnts]=dmax[b][k];
		shu[++cnts]=dmaxc[a][k];
		shu[++cnts]=dmaxc[b][k];
	}
	for(int i=1;i<=cnts;i++){
		mx=max(mx,shu[i]);
		if(shu[i]!=mx)cmax=max(cmax,shu[i]);
	}
	if(mx!=w1)return mx;
	else return cmax;
}
void dfs(int p){
	o.push(p);
	for(int i=1;i<=100000;i++)dep[i]=1<<17;
	dep[p]=0;
	while(!o.empty()){
		int i=h[o.front()];
		o.pop();
		for(;i!=-1;i=tr[i].f){
			lst q=tr[i];
			//cout<<endl<<tr[i].x<<' '<<dep[q.x]<<' '<<dep[q.y]<<endl;
			if(dep[q.y]<dep[q.x])continue;
			o.push(q.y);
			dep[q.y]=dep[q.x]+1;
			fa[q.y][0]=q.x;
			for(int k=1;k<=16;k++){
				fa[q.y][k]=fa[fa[q.y][k-1]][k-1];
			}
			dmax[q.y][0]=q.w;
			dmaxc[q.y][0]=0;
			for(int k=1;k<=16;k++){
				dmax[q.y][k]=max(dmax[q.y][k-1],dmax[fa[q.y][k-1]][k-1]);
				if(dmax[q.y][k-1]==dmax[fa[q.y][k-1]][k-1])dmaxc[q.y][k]=max(dmaxc[q.y][k-1],dmaxc[fa[q.y][k-1]][k-1]);
				else{
					dmaxc[q.y][k]=max(dmaxc[q.y][k-1],max(dmaxc[fa[q.y][k-1]][k-1],min(dmax[q.y][k-1],dmax[fa[q.y][k-1]][k-1])));
				}
			}
		}
	}
	return ;
}
int main(){
	cin>>n>>m;
	int cnt2=0;
	for(int i=1;i<=m;i++){
		int a1,b1,c1;
		a1=read();
		b1=read();
		c1=read();
		if(a1==b1){
			cnt2++;
			continue;
		}
		e[i].x=a1;
		e[i].y=b1;
		e[i].w=c1;
	}
	m-=cnt2;
	sort(e+1,e+m+1);
	for(int i=1;i<=n;i++){
		root[i]=i;
	}
	for(int i=1;i<=m;i++){
		if(root[find(e[i].x)]==root[find(e[i].y)])continue;
		else{
			root[find(e[i].y)]=root[find(e[i].x)];
			dis+=e[i].w;
			used[i]=1;
		}
	}
	memset(h,-1,sizeof(h));
	for(int i=1;i<=m;i++){
		if(!used[i])continue;
		add(e[i].x,e[i].y,e[i].w);
		add(e[i].y,e[i].x,e[i].w);
	}
	dfs(1);
	long long ans=1<<30;
	for(int i=1;i<=m;i++){
		if(used[i])continue;
		if(dep[e[i].x]>=dep[e[i].y]){
			ans=min(ans,dis+e[i].w-lcs(e[i].x,e[i].y,e[i].w));
		}
		else{
			ans=min(ans,dis+e[i].w-lcs(e[i].y,e[i].x,e[i].w));
		}
	}
	cout<<ans;
}
2024/4/20 07:41
加载中...