IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2019徐州-Kill the tree-(树的重心+重心性质) -> 正文阅读

[数据结构与算法]2019徐州-Kill the tree-(树的重心+重心性质)

M

题意:
就是给你一个树,然后根节点为1,现在让你把每个子树的重心都输出。如果一个子树有两个重心,按升序输出。

思考:
我只会求一个树的重心,每个子树的重心怎么求呢,刚开始我还以为可以转化啥的,但是发现是不可行的,看了题解之后呢。其实重心有个性质,一个树的重心是他重儿子(节点个数最多的儿子)的重心和他的路径上面,但是到底是哪一个点呢?当从重儿子的重心不断往上走的过程中如果(cnt[now]-cnt[x])*2>cnt[now]证明now还有一个子树更大,所以还要往上走。走到最后如果(cnt[now]-cnt[x])*2==cnt[now]说名当前这个点是重心,但是这个点的父亲也是重心,画图一看就明白了,他俩的最大联通子块都是cnt[now]/2。所以此时now有了第二个重心记录下来就行了。
其实有一道题和这个几乎一样:Kay and Snowflake。这个题就是给你m次查询, 每次问你这个节点的子树的重心是什么。

代码:

int T,n,m,k;
int dep[N],acc[N],cnt[N],son[N];
int ans1[N],ans2[N];

vector<int > e[N];

void get(int now,int p)
{
	acc[now] = p;
	dep[now] = dep[p]+1;
	cnt[now] = 1;
	for(auto spot:e[now])
	{
		if(spot==p) continue;
		get(spot,now);
		cnt[now] += cnt[spot];
		if(cnt[son[now]]<cnt[spot]) son[now] = spot;
	}
	if(son[now]) //如果有重儿子
	{
		int x = ans1[son[now]]; //重儿子的重心
		while(x!=now&&(cnt[now]-cnt[x])*2>cnt[now]) x = acc[x]; //还不够,往上走
		ans1[now] = x; //重心
		if((cnt[now]-cnt[x])*2==cnt[now]) ans2[now] = acc[x]; //另一个重心
	}
	else ans1[now] = now; //如果没有重儿子意味着自己是根节点,那么重心就是他自己.
}

signed main()
{
	IOS;
	cin>>n;
	for(int i=1;i<=n-1;i++)
	{
		int a,b;
		cin>>a>>b;
		e[a].pb(b);
		e[b].pb(a);
	}
	get(1,0);
	for(int i=1;i<=n;i++)
	{
		if(!ans2[i]) cout<<ans1[i]<<"\n";
		else cout<<min(ans1[i],ans2[i])<<" "<<max(ans1[i],ans2[i])<<"\n";
	}
	return 0;
}

总结:
多多思考,结合画图理解理解。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:47:47  更:2022-03-12 17:49:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:47:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码