树学

文章目录

    • 题目描述
    • 题解1:
    • 代码:
    • 题解2:
    • 代码:

传送

时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format:> %lld

题目描述

牛妹有一张连通图,由n个点和n-1条边构成,也就是说这是一棵树,牛妹可以任意选择一个点为根,根的深度deproot为0,对于任意一个非根的点,我们将他到根节点路径上的第一个点称作他的父节点,例如1为根,1-4的;路径为1-3-5-4时,4的父节点是5,并且满足对任意非根节点,depi=depfa i+1,整棵树的价值W=在这里插入图片描述 ,即所有点的深度和

牛妹希望这棵树的W最小,请你告诉她,选择哪个点可以使W最小
输入描述:
第一行,一个数,n
接下来n-1行,每行两个数x,y,代表x-y是树上的一条边
输出描述:
一行,一个数,最小的W
示例1
输入

4
1 2
1 3
1 4

输出

3

备注:
对于30%30%的数据,1<= n<=1000
对于100%100%的数据,1<=n <=106

题解1:

树形dp+换根
用到的几个函数:
dep[i]:节点i的深度
ant[i]:i的子树的个数(含本身)
f[x]:以x为根的每个节点深度的和
在这里插入图片描述
图一为以u为根节点
图二为以v为根节点
从u转到v 之后,图二中黄色区域(u和子树1和子树2)根节点都加1(因为成为别人的子节点),绿色区域(v和根节点2)根节点减1(因为成为别人的根节点)
那转换成公式是什么样的?
f[v]=(f[u]-ant[v])+(n-ant[v]);
怎么理解呢?
第一个括号里,是将图二的绿色区域根节点减一,因为黄色区域一共ant[v]个节点,这个区域内每个节点都减1,所以整个区域f[u]要减ant[v].
第二个括号就是黄色区域每个节点都加一,那整个区域就加这个区域的节点数,这个区域的节点数=整个区域-绿色区域,所以就是n-ant[v]
我们从1开始dfs,求出每个节点的深度,即dep[]
然后再dfs求出每个点子树数量,再dfs换成其他根,利用公式求出f来

代码:

#include<bits/stdc++.h>
#define forr(n) for(int i=1;i<=n;i++)
typedef long long ll;
using namespace std;
const int maxn=1e6+3;
struct node{int u,v,w,next;
}edge[maxn<<1];//链式前项星 
ll head[maxn<<1];//无向边,所以乘2
ll dep[maxn];//节点的深度 
ll ant[maxn];//节点x的子树数量(包含本身) 
ll f[maxn];//以i为根的时候每个点深度的和 
ll cnt=0;
ll minn=1e7;ll n;
void add(ll u,ll v)
{edge[++cnt].v=v;edge[cnt].next=head[u];head[u]=cnt;}
inline void init(ll n)
{forr(n)f[1]+=dep[i];//在dfs1求完每个点深度后,接着求出以1为根的时候每个点深度的和  forr(n)ant[i]=1;//每个节点的子树一开始都是本身 
}	
ll v=0;
void dfs1(ll now,ll fa)
{for(ll i=head[now];i;i=edge[i].next){v=edge[i].v;if(v==fa)continue;dep[v]=dep[now]+1;dfs1(v,now);}
}//以1为根节点开始,计算出每个节点的深度 void dfs2(ll now,ll fa)
{for(ll i=head[now];i;i=edge[i].next){v=edge[i].v;if(v==fa)continue;dfs2(v,now);ant[now]+=ant[v]; }
}//求出x节点的子树数量 
void dfs3(ll now,ll fa)
{for(ll i=head[now];i;i=edge[i].next){v=edge[i].v;if(v==fa)continue;f[v]=f[now]-ant[v]+(n-ant[v]); dfs3(v,now);}
}
//从1开始换成其他根,并求出其他根的f值 
int main()
{cin>>n;for(int i=1;i<n;i++){int u,v;cin>>u>>v;add(u,v);add(v,u);}	dfs1(1,0);init(n);//初始化 dfs2(1,0);dfs3(1,0);forr(n){minn=min(minn,f[i]);} cout<<minn;return 0;}

仔细看会发现dfs1与dfs2结构相似,完全可以和在一起写
或者用vector写更简洁

题解2:

我看有很多大佬都用重心的性质来做
树的重心有一个这样的性质:在树中所有点到某点的距离和 当中,到树的重心的距离和是最小的,如果有多个重心,那他们距离和一样。
树中所有点到重心的距离和最小,不就是我们要求的那个值吗。
先用dfs树形dp求出重心,再求出重心与每个点的距离进行累加求和

代码:

#include<bits/stdc++.h> 
using namespace std;typedef long long ll;
const int maxn=1e6+3;
int ant[maxn],root[maxn];
int n,cnt;
ll res;
ll point=maxn;vector<int>edge[maxn];
void dfs1(int v,int p)
{ant[v]=0;int maxx=0;for(int i=0;i<edge[v].size();i++){int u=edge[v][i];if(u!=p){dfs1(u,v);ant[v]+=(ant[u]+1);maxx=max(ant[u],maxx);}}maxx=max(n-ant[v]-1,maxx);if(maxx<point){cnt=0;root[++cnt]=v;point=maxx;}else if(maxx==point)root[++cnt]=v;
}
void dfs2(int v,int p,int dep)
{res+=dep;for(int i=0;i<edge[v].size();i++){int u=edge[v][i];if(u!=p)dfs2(u,v,dep+1);}
}
int main()
{scanf("%d",&n);int u,v;for(int i=1;i<n;i++){cin>>u>>v;edge[u].push_back(v);edge[v].push_back(u);}dfs1(1,0);dfs2(root[1],0,0);printf("%lld\n",res);return 0;
}

有关树的重心其他性质,有空专门讲讲

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jzoj5701-[gdoi2018day2]谈笑风生【莫比乌斯反演,二分,最短路】

正题 题目大意 nnn个点&#xff0c;每个点有一个wiw_iwi​&#xff0c;mmm条边&#xff0c;对于一条边(x,y)(x,y)(x,y)&#xff0c;边权为∑i1wx∑j1wy[gcd(i,j)1](ij)\sum_{i1}^{w_x}\sum_{j1}^{w_y}[gcd(i,j)1](ij)i1∑wx​​j1∑wy​​[gcd(i,j)1](ij) 选择一个最小的PPP使得…

csp-2019 复赛游记

文章目录Day0Day\ 0Day 0Day1Day\ 1Day 1Day2Day\ 2Day 2总结:csp−J:csp-J:csp−J:csp−s:csp-s:csp−s:遥远的梦想&#xff1a;Day0Day\ 0Day 0 早上&#xff0c;在运动会上乱搞一波&#xff0c;然后在10点左右到了机房&#xff0c;然后发现巨佬几枚&#xff0c;远看似在认证…

Rainbond v3.7.0:实现企业级PaaS的稳定性

Rainbond v3.7.0&#xff1a;实现企业级PaaS的稳定性Rainbond在v3.7.0版本中释出了大量平台稳定性更新&#xff0c;并在应用管理功能、安全性和系统安装三方面进行了部分优化。作为IT基础系统平台&#xff0c;Rainbond从低耦合的架构设计、高可用的部署方式、自恢复与容错的设计…

简单多边形三角化(暴力)

简单多边形三角化(暴力) 说在前面 网上流传着各种神奇的多边形三角剖分算法&#xff0c;但是讲道理&#xff0c;实现难度太高了。。。也没有搜到其他人的实现。这里写个最暴力的做法。。随机数据验证没问题&#xff0c;欢迎 hack 实现 一个简单多边形的耳朵定义为&#xff1a;如…

牛客网【每日一题】4月13号 Accumulation Degree

文章目录题目描述样例分析&#xff1a;题意&#xff1a;题解&#xff1a;代码&#xff1a;本题目传送题目树学是这个题的简易版&#xff0c;也涉及换根问题&#xff0c;可以先看看这个 树学 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768…

【二分】Distinct

Distinct 题目大意&#xff1a; 有n个军队&#xff08;有自己在x轴上的坐标&#xff09;&#xff0c;每个军队有一定的人&#xff0c;要一个坐标只有一个人&#xff0c;移动路程最大的士兵最少移动多长 原题&#xff1a; 题目描述 Daniel 正在玩一个战棋游戏。 现在 Danie…

P2839-[国家集训队]middle【主席树,二分】

正题 题目链接:https://www.luogu.com.cn/problem/P2839 题目大意 nnn个数字&#xff0c;mmm次询问给出(a,b,c,d)(a,b,c,d)(a,b,c,d)表示左端点在[a,b][a,b][a,b]中&#xff0c;右端点在[c,d][c,d][c,d]的子区间中中位数最大的值。 解题思路 显然我们需要二分一下答案midmidm…

微软把UWP定位成业务线应用程序开发平台

微软把UWP定位成传统业务线&#xff08;LOB&#xff09;应用程序开发平台&#xff0c;以使用Windows Template Studio实现快速应用程序开发为重点。但是&#xff0c;为了把LOB开发人员吸引到UWP平台&#xff0c;他们在做的事情不止这些。最初发布时&#xff0c;通用Windows平台…

牛客网【每日一题】 合集

文章目录2020年3月25日 NC50439 tokitsukaze and Soldier 牛客练习赛50-C2020年3月26日 NC13230 合并回文子串 美团2017年CodeM大赛-初赛A轮2020年3月27日 NC15553 数学考试 2018年长沙理工大学程序设计竞赛2020年3月30日 NC50528 滑动窗口 《信息学奥赛一本通》Part5.52020年3…

NBA总冠军

NBA总冠军NBA总冠军NBA总冠军 题目描述 又要考试了&#xff0c;LJW决定放松一下&#xff0c;就打开电视&#xff0c;看见篮球赛&#xff0c;他立即想到了每年的NBA总冠军队伍。由于复习紧张&#xff0c;他只记起了一部分&#xff0c;记忆的内容是正确的&#xff0c;可能不是按…

P6773-[NOI2020]命运【线段树合并,树形dp】

正题 题目链接:https://www.luogu.com.cn/problem/P6773 题目大意 nnn个点的一棵树&#xff0c;边权可以是000或111。mmm个条件(x,y)(x,y)(x,y)表示要求x,yx,yx,y之间要有边权值为111&#xff08;保证xxx是yyy的祖先&#xff09;&#xff0c;求方案数。 解题思路 考虑容斥&am…

读 《CSharp Coding Guidelines》有感

C# 编程指南前不久在 Github 上看见了一位大牛创建一个仓库&#xff1a;CSharpCodingGuidelines&#xff0c;打开之后看了一下 readme.md 相关描述&#xff0c;感觉应该很不错&#xff0c;于是就 clone 到本地拜读一下&#xff0c;这里列一些自己的笔记&#xff0c;方便日后回顾…

牛客网 【每日一题】4月10日 二分图染色(弱化版)

精讲 组合、容斥 文章目录题目&#xff1a;题意&&题解&#xff1a;&#xff1a;代码&#xff1a;题目传送题目&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 524288K&#xff0c;其他语言1048576K 64bit IO Format: %lld …

数字游戏(水博客ing / csp-J T1 / luogu 5660)

数字游戏 luogu 5660 题目大意&#xff1a; 给你一个长度为8的01串&#xff0c;分别表示你某一场比赛是否AKAKAK了&#xff0c;问你AKAKAK了几场比赛 输入样例#1 00010100输出样例#1 2输入样例#2 11111111输出样例#2 8样例解释#1 该 01 字符串中有 2 个字符 1。 样例…

P2231-[HNOI2002]跳蚤【容斥】

正题 题目链接:https://www.luogu.com.cn/problem/P2231 题目大意 求一个由[1,m][1,m][1,m]的整数组成的长度为nnn的序列使得他们的gcdgcdgcd和mmm互质。 解题思路 考虑容斥减去不合法的答案。那就是要求序列的gcdgcdgcd和mmm不互质的个数&#xff0c;那么我们依旧需要容斥计…

微软Windows Community Toolkit一览

为了满足业务线开发人员的需求&#xff0c;微软推出了Windows Community Toolkit。这个快速变化的库充当了新的UWP控件和功能的测试基础。在创建UWP之初&#xff0c;其重点目标是智能手机和平板电脑。这意味着大部分开发预算都花费在控件上&#xff0c;确保这些控件能够在有限的…

牛客网【每日一题】4月14日题目精讲 Xorto

文章目录题目描述题解&#xff1a;代码&#xff1a;扩展传送时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format:%lld 题目描述 给定一个长度为n的整数数组&#xff0c;问有多少对互不重叠的非空区…

YbtOJ#20081-[NOIP2020模拟赛B组Day8]树上排列【组合数,树形dp】

正题 题面链接:https://www.ybtoj.com.cn/contest/62/problem/3 题目大意 nnn个点的一棵树&#xff0c;每个边的边会表示一个大小关系&#xff08;如px>pyp_x>p_ypx​>py​或px<pyp_x<p_ypx​<py​&#xff09;。求有多少个排列满足所有条件。 解题思路 考…

如何简单的在 ASP.NET Core 中集成 JWT 认证?

前情提要&#xff1a;ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统文章超长预警&#xff08;1万字以上&#xff09;&#xff0c;不想看全部实现过程的同学可以直接跳转到末尾查看成果或者一键安装相关的 nuget 包自上一篇介绍如何在 ASP.NET Core 中集成 JWT 的博文发布…

【二分】【暴力】蛋糕(gmoj 3918)

蛋糕 gmoj 3918 题目大意&#xff1a; 有一个蛋糕&#xff0c;分成n∗mn*mn∗m个单位&#xff0c;现在横竖各切三刀&#xff0c;使其分成16个矩阵&#xff0c;使价值最小的矩阵价值最大 输出样例 5 5 95998 21945 23451 99798 74083输入样例 3数据范围 40%的数据&#x…