题解,求关注
2024-07-10 14:16:05
发布于:浙江
15阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
struct datay
{
	long long x,y,z;
}l[300005];
long long n,m,d[300005],f[300005][21],deep[300005],t[300005][21],val=0,t1[300005][21],val1;
bool v[300005];
vector<long long> a[300005],r[300005];
long long dijah(long long x)
{
	if(d[x]!=x)d[x]=dijah(d[x]);
	return d[x];
}
void dfs(long long x,long long y)
{
	deep[x]=deep[y]+1;
	f[x][0]=y;
	for(int i=0;i<a[x].size();i++)
	{
		if(a[x][i]==y)continue;
		t[a[x][i]][0]=r[x][i];
		dfs(a[x][i],x);
	}
	return;
}
bool cmp(datay q,datay w)
{
	return q.z<w.z;
}
long long LCA(long long x,long long y)
{
	val=0;
	val1=0;
	if(deep[x]<deep[y])swap(x,y);
	for(int i=20;i>=0;i--)
	{
		if(deep[f[x][i]]>=deep[y])
		{
			if(val1<=t1[x][i])
			{
				if(t1[x][i]>val)val1=t1[x][i];
				else if(t[x][i]>val)val1=val;
				else if(t[x][i]!=val)val1=t[x][i];
				else val1=max(t1[x][i],val1);
			}
			else if(t1[x][i]<val1&&t[x][i]>=val1)val1=t[x][i]==val?val1:min(val,t[x][0]);
			val=max(val,t[x][i]),x=f[x][i];
		}
	} 
	if(x==y)return x;
	for(int i=20;i>=0;i--)
	{
		if(f[x][i]!=f[y][i])
		{
			if(val1<=t1[x][i])
			{
				if(t1[x][i]>val)val1=t1[x][i];
				else if(t[x][i]>val)val1=val;
				else if(t[x][i]!=val)val1=t[x][i];
				else val1=max(t1[x][i],val1);
			}
			else if(t1[x][i]<val1&&t[x][i]>=val1)val1=t[x][i]==val?val1:min(val,t[x][0]);
			val=max(val,t[x][i]);
			if(val1<=t1[y][i])
			{
				if(t1[y][i]>val)val1=t1[y][i];
				else if(t[y][i]>val)val1=val;
				else if(t[y][i]!=val)val1=t[y][i];
				else val1=max(t1[y][i],val1);
			}
			else if(t1[y][i]<val1&&t[y][i]>=val1)val1=t[y][0]==val?val1:min(val,t[y][0]);
			val=max(val,t[y][i]);
			x=f[x][i];
			y=f[y][i];
		}
	}
	if(val>t[x][0])val1=t[x][0];
	val=max(val,t[x][0]);
	if(val>t[y][0])val1=t[y][0];
	val=max(val,t[y][0]);
	return f[x][0];
}
int main()
{
	long long x,y,s=0,minn=1e15+5;
	memset(v,false,sizeof(v));
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%lld%lld%lld",&l[i].x,&l[i].y,&l[i].z);
	}
	for(int i=1;i<=m;i++)d[i]=i;
	sort(l+1,l+m+1,cmp);
	for(int i=1;i<=m;i++)
	{
		x=dijah(l[i].x),y=dijah(l[i].y);
		if(x!=y)
		{
			a[l[i].x].push_back(l[i].y);
			a[l[i].y].push_back(l[i].x);
			r[l[i].x].push_back(l[i].z);
			r[l[i].y].push_back(l[i].z);
			d[y]=x;
			s+=l[i].z;
			v[i]=true;
		}
	}
	dfs(1,0);
	for(int i=1;i<=20;i++)
	{
		for(int j=1;j<=n;j++)
		{
			f[j][i]=f[f[j][i-1]][i-1];
			t[j][i]=max(t[j][i-1],t[f[j][i-1]][i-1]);
			if(t[j][i-1]!=t[f[j][i-1]][i-1])t1[j][i]=min(t[j][i-1],t[f[j][i-1]][i-1]);
			else
			{
				t1[j][i]=max(t1[j][i-1],t1[f[j][i-1]][i-1]);
			}
		}
	}
	for(int i=1;i<=m;i++)
	{
		if(v[i]||l[i].x==l[i].y)continue;
		LCA(l[i].x,l[i].y);
		if(val!=l[i].z)minn=min(minn,s-val+l[i].z);
		if(val1!=l[i].z)minn=min(minn,s-val1+l[i].z);
	}
	printf("%lld",minn);
	
  return 0;
}
这里空空如也




有帮助,赞一个