luogu P2726 [SHOI2005]树的双中心

传送门

强行安利->巨佬题解

如果只有一个点贡献答案,那么答案显然是这棵树的带权重心,这个是可以O(n)求的.一个O(n2)暴力是枚举两个集合之间的分界边,然后对这两个集合分别算答案,合并更新

考虑优化此过程,一个结论是一棵树内,只有sizei2>sizeroot的点才有可能成为带权重心,并且这一类点个数不超过2个 不会证啊qwq,感性理解一下吧.所以每次枚举是哪条边为分界线,然后把树分成两部分,从每个树的根开始算答案,如果sizei2sizeroot就停止

注意要扣除下面子树对上面子树的size的贡献再做

更多细节详见代码

#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double
#define eps (1e-5)

using namespace std;
const int N=50000+10;
il LL rd()
{
  LL x=0,w=1;char ch=0;
  while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
  while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
  return x*w;
}
int to[N<<1],nt[N<<1],hd[N],tot=1;
il void add(int x,int y)
{
  ++tot,to[tot]=y,nt[tot]=hd[x],hd[x]=tot;
  ++tot,to[tot]=x,nt[tot]=hd[y],hd[y]=tot;
}
int n,fa[N],sz[N],de[N],g[N],fc[N],sc[N],no,ans=1<<30;
void dfs(int x)
{
  for(int i=hd[x];i;i=nt[i])
	{
	  int y=to[i];
	  if(y==fa[x]) continue;
	  fa[y]=x,de[y]=de[x]+1,dfs(y),sz[x]+=sz[y],g[x]+=g[y]+sz[y];
	  if(sz[fc[x]]<=sz[y]) sc[x]=fc[x],fc[x]=y;
	  else if(sz[sc[x]]<sz[y]) sc[x]=y;
	}
}
void cal(int x,int nw,int size,int &an)
{
  an=min(an,nw);
  int y=sz[fc[x]]<sz[sc[x]]||fc[x]==no?sc[x]:fc[x];
  if(sz[y]*2>size) cal(y,nw-sz[y]+size-sz[y],size,an);
}
void work(int x)
{
  for(int i=hd[x];i;i=nt[i])
	{
	  int y=to[i];
	  if(y!=fa[x])
		{
		  no=y;
		  for(int xx=x;xx;xx=fa[xx]) sz[xx]-=sz[y];
		  int aa=1<<30,bb=1<<30;
		  cal(1,g[1]-g[y]-de[y]*sz[y],sz[1],aa),cal(y,g[y],sz[y],bb);
		  for(int xx=x;xx;xx=fa[xx]) sz[xx]+=sz[y];
		  ans=min(ans,aa+bb);
		  work(y);
		}
	}
}

int main()
{
  n=rd();
  for(int i=1;i<n;i++) add(rd(),rd());
  for(int i=1;i<=n;i++) sz[i]=rd();
  dfs(1),work(1);
  printf("%d\n",ans);
  return 0;
}


posted @   ✡smy✡  阅读(102)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· SQL Server统计信息更新会被阻塞或引起会话阻塞吗?
阅读排行:
· 传国玉玺易主,ai.com竟然跳转到国产AI
· 本地部署 DeepSeek:小白也能轻松搞定!
· 自己如何在本地电脑从零搭建DeepSeek!手把手教学,快来看看! (建议收藏)
· 我们是如何解决abp身上的几个痛点
· 普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)
点击右上角即可分享
微信分享提示