[AGC009B] Tournament(多叉树转二叉树后的最小可能深度)
传送门
把aia_iai看成faifa_ifai,建出一棵多叉树,再把多叉树转成二叉树,转出来的每棵二叉树对应着一种比赛方式。
以n=8,a2,...,8=1,1,2,4,3,3,3n=8,a_{2,...,8}=1,1,2,4,3,3,3n=8,a2,...,8=1,1,2,4,3,3,3为例,
多叉树转出的二叉树深度=赛程二叉树的深度
考虑求多叉树转二叉树后的最小可能深度:
假设uuu的所有儿子vvv的子树都已经转化好了:
现在要把uuu的子树转成二叉树:
设dep[x]dep[x]dep[x]表示以xxx为根的子树转成二叉树后的最小可能深度。
要求dep[u]dep[u]dep[u],我们要找到一种排列uuu的所有儿子vvv的方式,使得max{dep[v1]+1,dep[v2]=2,...,dep[vk]+k}max\{dep[v_1]+1,dep[v_2]=2,...,dep[v_k]+k\}max{dep[v1]+1,dep[v2]=2,...,dep[vk]+k}最小。
显然把儿子按depdepdep从大到小排序即可。
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int N=1e5+10;
vector<int> g[N];
int n,fa[N],mxd[N];
bool cmp(int a,int b){return mxd[a]>mxd[b];
}
void dfs(int u){int tot=g[u].size();for(int i=0;i<tot;i++) dfs(g[u][i]);sort(g[u].begin(),g[u].end(),cmp);if(tot){for(int i=0;i<tot;i++){int v=g[u][i];mxd[u]=max(mxd[u],mxd[v]+i+1);}}
}
int main(){scanf("%d",&n);for(int i=2;i<=n;i++){scanf("%d",&fa[i]);g[fa[i]].push_back(i);}dfs(1);printf("%d\n",mxd[1]);return 0;
}
[AGC009B] Tournament(多叉树转二叉树后的最小可能深度)相关推荐
- 后序遍历的非递归算法python_二叉树后序遍历(递归与非递归)算法C语言实现...
二叉树后序遍历的实现思想是:从根节点出发,依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,才访问该节点元素. 图 1 二叉树 如图 1 中,对此二叉树进行后序遍历的操作过程为: 从根节点 1 ...
- 树形dp技巧,多叉树转二叉树
今天复习树形dp时发现一道比较古老的题,叫选课,是树形dp的一道基础题,也是多叉树转二叉树应用的模版题 多叉树转二叉树的应用非常广泛,因为如果一个节点的儿子太多,一个一个存下来不方便去查询,并且会增加 ...
- (数据结构)二叉树后序遍历
二叉树后序遍历 二叉树后序遍历的实现思想是: 访问当前节点的左子树 访问当前节点的右子树 访问根节点 图 1 二叉树 以上图 1 为例,后序遍历的过程如下: 从根节点 1 开始,遍历该节点的左子树(以 ...
- sdut 2137 数据结构实验之求二叉树后序遍历和层次遍历
数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descr ...
- 数据结构实验之求二叉树后序遍历和层次遍历
数据结构实验之求二叉树后序遍历和层次遍历 Description 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历. Input 输入数据有多组,第一行是一个整数t (t<100 ...
- c++ stack 遍历_五分钟C语言数据结构 之 二叉树后序遍历(非递归很重要)
五分钟C语言实现常见数据结构 今天的内容分享的是二叉树后序遍历 DP问题,欢迎关注 动态规划一篇就够了 全网最详细, 逐步理解, 万字总结 - Johngo的文章 - 知乎 https://zhuan ...
- 数据结构之 二叉树---求二叉树后序遍历和层次遍历(先建树,再遍历)
数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历. 输入 输入 ...
- 验证二叉树后序遍历序列是否符合要求
验证二叉树后序遍历序列是否符合要求 @(算法学习) 给定一个后续遍历序列,立马知道树根是最后一个序列,那么如何切分左右子树呢? 比树根小的数都在左子树,比根大的都在右子树. 再递归验证,即,对左右子树 ...
- 由序列确定二叉树:前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 代码实现(c语言)
下面三种序列可以唯一的构造唯一的一棵二叉树: 前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 #include<stdio.h> #inc ...
最新文章
- matlab中线性变压器,用MATLAB优化计算差动变压器的线性范围
- Maven——Maven概述
- 0ctf2017-babyheap调试记录fastbin-attack
- 【java】ssh the connection is not authenticated
- python特性 property_python特性property
- Android开机动画的基本流程
- 网上关于豆瓣的思考搜集
- 制作uefi的kali安装盘_制作 UD + EFI + PE + KALI 启动U盘
- Markdown必备,Lsky-pro图床配置
- Java+SSM(Spring+SpringMVC+Mybatis)个性化购物商城推荐系统 电子商务推荐系统 基于用户、项目、聚类、混合的协同过滤推荐算法WebShopRSMEx 源代码下载
- 编程实践--决策树分类算法--隐形眼镜材质分类
- Git Clone时报错解决方法
- 温柔末世,慢慢到来的末日
- php detailview,PHP开发框架Yii Framework教程(31) Zii组件-DetailView示例
- Nim 博弈游戏详解
- [精选]万能节日国庆头像小程序(可引流,开通流量主,带pc后台管理)
- Android Audio - 支持多个APK同时录音
- 小米 11 ultra旗舰版官方原版ROM系统MIUI12.5所有固件
- Linux 2.6 劫持系统调用 隐藏进程
- 朋友合作怎么迈过利益这道坎
热门文章
- python list remove 删除引用_Python——list列表操作一坑(remove)
- java io操作_Java 的IO操作(文件的读,写操作)
- 二分法查找是基于有序_201,查找顺序查找
- python调用libvirt_通过python获取kvm虚拟机的监控信息(基于libvirt API)
- leetcode 515. 在每个树行中找最大值(层序遍历06)
- 一文了解贪心算法和回溯算法在前端中的应用
- [PAT乙级]1031 查验身份证
- 蓝桥杯2015决赛-方格填数-枚举 or dfs
- 深圳本次核酸检普筛怎么将个人信息和结果对应上??
- python分布式存储文件_python如何分布式存储文件的方法