HELP 70pts
查看原帖
HELP 70pts
476574
KAWorld楼主2021/7/22 10:42
#include<bits/stdc++.h>
#define INF 2147483647
using namespace std;
struct node
{
	long long u,v,w,next;
}edge[600005],e[600005];
long long n,m,num=0,sum=0,head[100005],fa[100005],bz[100005][20],dep[100005],f_max[100005][20],s_max[100005][20],deep[100005];
int flag[300005];
bool comp(node a,node b)
{
	return a.w<b.w;
}
long long getfa(int t)
{
	if (fa[t]!=t) return fa[t]=getfa(fa[t]);
	return fa[t];
}
void add(long long from,long long to,long long cost)
{
	++num;
	e[num].u=from;
	e[num].v=to;
	e[num].w=cost;
	e[num].next=head[from];
	head[from]=num;
}
void dfs(long long t,long long f)
{
	bz[t][0]=f;
	for (int i=head[t];i!=0;i=e[i].next)
	{
		if (e[i].v==f) continue;
		dep[e[i].v]=dep[t]+1;
		f_max[e[i].v][0]=e[i].w;
		s_max[e[i].v][0]=-INF;
		dfs(e[i].v,t);
	}
}
void work()
{
	for (int i=1;i<=19;++i)
		for (int j=1;j<=n;++j)
		{
			bz[j][i]=bz[bz[j][i-1]][i-1];
			f_max[j][i]=max(f_max[j][i-1],f_max[bz[j][i-1]][i-1]);
			s_max[j][i]=max(s_max[j][i-1],s_max[bz[j][i-1]][i-1]);
			if (f_max[j][i-1]>f_max[bz[j][i-1]][i-1]) s_max[j][i]=max(s_max[j][i],f_max[bz[j][i-1]][i-1]);
			else if (f_max[j][i-1]<f_max[bz[j][i-1]][i-1]) s_max[j][i]=max(s_max[j][i],f_max[j][i-1]);
		}
}
long long lca(long long x,long long y)
{
	if (dep[x]<dep[y]) swap(x,y);
	for (int i=19;i>=0;--i)
		if (deep[bz[x][i]]>=deep[y]) x=bz[x][i];
	if (x==y) return x;
	for (int i=19;i>=0;--i)
		if (bz[x][i]!=bz[y][i])
		{
			x=bz[x][i];
			y=bz[y][i];
		}
	return bz[x][0];
}
int checkmax(int u,int v,int maxn)
{
	long long a=-INF;
	for (int i=19;i>=0;--i)
		if (dep[bz[u][i]]>=dep[v])
		{
			if (maxn!=f_max[u][i]) a=max(a,f_max[u][i]);
			else a=max(a,s_max[u][i]);
			u=bz[u][i];
		}
	return a;
}
int main()
{
	cin>>n>>m;
	for (int i=1;i<=m;++i) cin>>edge[i].u>>edge[i].v>>edge[i].w;
	for (int i=1;i<=n;++i) fa[i]=i;
	sort(edge+1,edge+m+1,comp);
	for (int i=1;i<=m;++i)
	{
		int fx=getfa(edge[i].u),fy=getfa(edge[i].v);
		if (fx!=fy)
		{
			sum+=edge[i].w;
			fa[fy]=fx;
			add(edge[i].u,edge[i].v,edge[i].w);
			add(edge[i].v,edge[i].u,edge[i].w);
			flag[i]=1;
		}
	}
	s_max[1][0]=-INF;
	deep[1]=1;
	dfs(1,0);
	work();
	long long ans=INF;
	for (int i=1;i<=m;++i)
		if (flag[i]==0)
		{
			int bothroot=lca(edge[i].u,edge[i].v);
			int lmax=checkmax(edge[i].u,bothroot,edge[i].w),rmax=checkmax(edge[i].v,bothroot,edge[i].w);
			ans=min(ans,sum-max(lmax,rmax)+edge[i].w);
		}
		
	cout<<ans;
	return 0;
}

W4,W8,W10

2021/7/22 10:42
加载中...