首页 > 其他分享 >树的重心

树的重心

时间:2023-02-21 20:33:57浏览次数:32  
标签:tmp head sx 重心 int vis size

定义:


1.找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心。

2.以这个点为根,那么所有的子树(不算整个树自身)的大小都不超过整个树大小的一半。


性质:


1.树中所有点到某一点距离之和中,到重心的距离和最短。


2.把两个树通过一条边相连得到一个新的树,那么新的树的重心在连接原来两个树的重心的路径上。

3.把一个树添加或删除一个叶子,那么它的重心最多只移动一条边的距离。


DP的记忆化搜索来求解。

const int maxn=500005;
int tot=0,n;
int ans,size;
int sx[maxn],head[maxn];
int vis[maxn];
struct edge
{
int to,next;
} eg[maxn];
void add(int u,int v)
{
eg[tot].to=v;
eg[tot].next=head[u];
head[u]=tot++;
}
void init()
{
tot=0;
memset(head,-1,sizeof(head));
memset(vis,0,sizeof(vis));
}
void dfs(int u)
{
vis[u]=1;
sx[u]=1;
int tmp=0;
for(int i=head[u]; i!=-1; i=eg[i].next)
{
int v=eg[i].to;
if(!vis[v])
{
dfs(v);
sx[u]+=sx[v];
tmp=max(tmp,sx[v]);
}
}
tmp=max(tmp,n-sx[u]);
if(size>tmp||size==tmp&&ans>u)
{
ans=u;
size=tmp;
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
init();
int u,v;
scanf("%d",&n);
for(int i=1; i<n; i++)
{
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
size=INF;
dfs(1);
printf("%d %d\n",ans,size);
}
}

标签:tmp,head,sx,重心,int,vis,size
From: https://blog.51cto.com/u_14682436/6077044

相关文章

  • POJ 1655 Balancing Act 树的重心
    BalancingActTimeLimit: 1000MS MemoryLimit: 65536KTotalSubmissions: 16866 Accepted: 7130DescriptionConsideratreeTwithN(1<=N<=20,000)nodesnu......
  • 【题解】P5666 [CSP-S2019] 树的重心
    感觉对重心的理解更直观了一点。题意求一棵树上删去每一条边后两侧子树重心的编号和。\(n\leq3\times10^5\)思路神奇的清真数论。首先这里有一步很妙的操作:把整......
  • Codeforces 1654 G Snowy Mountain 题解 (重心分治)
    题目链接假设现在起点已经确定,我们观察从这个起点开始能走的最长路径长什么样。把这条最长路径中所有的非平地路径拿出来,它们肯定连成一线,因为不允许上坡;而一条路径重复走......
  • 接手旺铺转让要立足的重心,助你成功接手
     同样是接手一个旺铺转让进行开店,为什么别人的旺铺可以迅速发展起来,自己接手的旺铺却始终发展不起来呢?关键在于自己接手时有没有立足一些重心,今天铺先生为大家讲述接手旺......
  • 干洗店铺选址值得围绕什么重心?这几个重心缺一不可
     想必大家都知道开一家干洗店之前,干洗店铺选址是一个至关重要的步骤,如果没有做好这一步就进行开店,那么就会迎莱开店失败的结局。为了避免这种情况,我们在选址时要围绕一些......
  • 树的重心和直径
    树的重心1.以重心为树根时,所有子树的大小不超过全树大小的一半。2.树中所有点到某个点的距离和中,重心的距离和是最小的,如果有两个重心,那么到它们的距离和一样。3.把两棵......
  • 树的重心
    定义对于树上的每一个点,计算其所有子树中最大的子树节点数,这个值最小的点就是这棵树的重心。性质以树的重心为根时,所有子树的大小都不超过整棵树大小的一半。树中......
  • 图论基础:欧拉路,拓扑排序,树的直径与重心
    欧拉路首先结论:一个图存在欧拉路则每个点的入度等于出度或者一个点的入度比出度大一(终点),一个点的入度比出度小一(起点),其他点入度等于出度。然后是朴实无华的爆算。void......
  • 树的重心
    给定一颗树,树中包含n个结点(编号1∼n)和n−1条无向边。请你找到树的重心,并输出将重心删除后,剩余各个连通块中点数的最大值。重心定义:重心是指树中的一个结点,如果将这......