题目描述

小 Y 是一个心灵手巧的 OIer,她有许多二叉树模型。

小 Y 的二叉树模型中,每个结点都具有一个编号,小 Y 把她最喜欢的一个二叉树模型挂在了墙上,树根在最上面,左右子树分别在树根的左下方与右下方,且他们也都满足这样的悬挂规则。为了让这个模型更加美观,小 Y 选择了一种让这棵二叉树的中序遍历序列最小的悬挂方法。所谓中序遍历最小,就是指中序遍历的结点编号序列的字典序最小。

一天,这个模型不小心被掉在了地上,幸运的是,所有结点和边都没摔坏,但是她想不起这个模型原来是怎么悬挂的了,也就是说:她想不起来树根节点的编号了。

小 Y 最近忙于准备清华集训,所以没太多时间处理别的事情,她只好找到同样心灵手巧的你帮忙复原她的二叉树模型。

输入输出格式

输入格式:

从文件 binary.in 中读入数据。

第一行为一个正整数 n ,表示点的个数。

后接 n 行,每行若干个整数:

第 i + 1 行的第一个整数为 ki ,表示编号为 i 的结点的度数,后接 ki 个整数 ai; j ,表示编号为 i 的结点与编号为 ai; j 的结点之间有一条边。

同一行输入的相邻两个元素之间,用恰好一个空格隔开。

输出格式:

输出到文件 binary.out 中。

输出共一行, n 个整数,表示字典序最小的中序遍历。

题意:给一颗二叉树,你可以随意选择根节点和随意改变儿子顺序,求字典序最小的中序遍历;

题解:
①不断构造;

②假定选好了根节点。mn[v]表示,v的子树中开头的最小值,(根除外)一个结点的度数小于等于2,一个节点可以开头。这样从根不断向下找mn小的做左儿子贪心可以构造出序列;

③现在找根节点,首先最左面的节点一定是固定的,为度数小于等于2的最小值;从这个点u不断往上找,预处理以u为根的所有mn[],然后u对有一个儿子的情况,那么mn较小的应该是u的右儿子,mn较大的应该是u的父亲,只有一个儿子v,mn[v]小于v,那么在真正的结构里v应该是u的右儿子,否则v是u的父亲;不断递归u向上找即可;

④最后再dfs一次输出答案;

 #include<cstdio>
#include<iostream>
using namespace std;
const int N=;
int n,m,d[N],rt,st,o,hd[N],ls[N],rs[N],son[N][],mn[N];
struct Edge{int v,nt;}E[*N];
char gc(){
static char *p1,*p2,s[];
if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}
int rd(){
int x=; char c=gc();
while(c<''||c>'') c=gc();
while(c>=''&&c<='') x=x*+c-'',c=gc();
return x;
}
void adde(int u,int v){E[o]=(Edge){v,hd[u]};hd[u]=o++;}//
void dfsA(int u,int fa){
int cnt=;
for(int i=hd[u],v;i!=-;i=E[i].nt){
if((v=E[i].v)==fa) continue;
son[u][cnt++]=v;
dfsA(v,u);
mn[u] = min(mn[v],mn[u]);
}
}//
void find(int u){
if(d[u]==&&u!=st) {rt=u;return;}
else if(u!=st&&d[u]==||d[u]==&&u==st){
if(son[u][]<mn[son[u][]]) find(son[u][]);
else {rt=u; return;}
}
else{
if(mn[son[u][]]>mn[son[u][]]) find(son[u][]);
else find(son[u][]);
}
}//
int dfsB(int u,int fa){
if(d[u]==&&u!=rt) return u;
int tmp=n+; if(u!=rt&&d[u]==||u==rt&&d[u]==) tmp=u;
for(int i=hd[u],v,now;i!=-;i=E[i].nt){
if((v=E[i].v)==fa) continue;
if((now=dfsB(v,u))<tmp) rs[u]=ls[u],ls[u]=v,tmp=now;
else rs[u]=v;
}
return tmp;
}//
void dfsC(int u){
if(ls[u]) dfsC(ls[u]);
printf("%d ",u);
if(rs[u]) dfsC(rs[u]);
}
int main()
{ freopen("mzoj1120.in","r",stdin);
freopen("mzoj1120.out","w",stdout);
n=rd();
for(int i=;i<=n;i++){
hd[i]=-;d[i]=rd();
for(int j=;j<=d[i];j++) adde(i,rd());
if(d[i]<=) {mn[i]=i; if(!st)st=i;} else mn[i]=n+;
}
//d[st]++;
dfsA(st,);
find(st);
dfsB(rt,);
dfsC(rt);
return ;
}//by tkys_Austin;

【luoguP4006 清华集训2017】小Y和二叉树的更多相关文章

  1. [清华集训2017]小 Y 和地铁(神奇思路,搜索,剪枝,树状数组)

    世界上最不缺的就是好题. 首先考虑暴搜.(还有什么题是从这东西推到正解的……) 首先单独一个换乘站明显没用,只用考虑一对对的换乘站. 那么有八种情况:(从题解偷图)         然后大力枚举每个换 ...

  2. 【清华集训】小Y和地铁

    图已挂,前往luogu 题目: 小 $\rm Y$ 是一个爱好旅行的 $\rm OIer$.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁.她发现每条地铁线路可以看成平面上的一条 ...

  3. 清华集训2017D2T1 小 Y 和地铁(metro)

    题目:https://www.luogu.org/problem/show?pid=P4005 题意:一条线段,给定n个点(n<=44)其中每个点可能对应另外一个点.如果一个点有对应点,那么就要 ...

  4. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  5. [LOJ#2324]「清华集训 2017」小Y和二叉树

    [LOJ#2324]「清华集训 2017」小Y和二叉树 试题描述 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙 ...

  6. 【UOJ#340】【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划)

    [UOJ#340][清华集训2017]小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划) 题面 UOJ 洛谷 题解 考虑如何暴力\(dp\). 设\(f[i][a][b][c]\)表示当前到了第\(i\) ...

  7. loj #2325. 「清华集训 2017」小Y和恐怖的奴隶主

    #2325. 「清华集训 2017」小Y和恐怖的奴隶主 内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较   题目描述 "A fight? Co ...

  8. [LOJ#2323]「清华集训 2017」小Y和地铁

    [LOJ#2323]「清华集训 2017」小Y和地铁 试题描述 小Y是一个爱好旅行的OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的 ...

  9. Loj #2321. 「清华集训 2017」无限之环

    Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...

随机推荐

  1. Beta预备会议

    1. 讨论组长是否重选的议题和结论. 我们小组决定组长更换为林洋洋同学,他Web开发经验比较丰富,对任务的分配会更加明确,由于上一阶段中存在进度偏慢的问题,我们希望在Beta阶段通过更好的分工安排来保 ...

  2. 1013团队Beta冲刺日志集合帖

    Beta预备 Beta冲刺day1 Beta冲刺day2 Beta冲刺day3 Beta冲刺day4 Beta冲刺day5 Beta冲刺day6 Beta冲刺day7 用户使用调查报告 Beta冲刺总 ...

  3. verilog学习笔记(2)_一个小module及其tb

    module-ex_cnt module ex_cnt( input wire sclk, input wire rst_n, output wire[9:0] cnt ); reg [9:0] cn ...

  4. STL常用整理

    S T L Sting: << 判断拼音序 size length 字符串长度 str[n] 代表字符串中的一个字符 可用作左值 string::size_type 用于表示字符串长度计量 ...

  5. 第四十四条:为所有导出的API元素编写文档注释

    简而言之,要为API编写文档,文档注释是最好,最有效的途径.对于所有可导出的API元素来说,使用文档注释应该被看作是强制性的.要 采用一致的风格来遵循标准的约定.记住,在文档注释内部出现任何的HTML ...

  6. 不看就亏了:DELL EqualLogic PS6100详解及数据恢办法

    DELL EqualLogic PS6100采用虚拟ISCSI SAN阵列,为远程或分支办公室.部门和中小企业存储部署带来企业级功能.智能化.自动化和可靠性,支持VMware.Solaris.Linu ...

  7. 14-TypeScript简单工厂模式

    在TypeScript中,要调用功能,通常在调用方通过实例化被调用方对象来调用相关方法,但这种实现在调用方和被调用方形成了强耦合的关系. 另外如果被调用方有种实现,在调用方需要根据场景去实例化不同的类 ...

  8. C# 大数组赋值给小数组,小数组赋值给大数组

    ]; ]; " }; arraymax = arraystr;//变成和arraystr一样 arraymin = arraystr;//变成和arraystr一样

  9. linux下面根据不同的日期创建不同文件,一般用户数据库的备份的shell编程

    [root@www scripts]# vi sh03.sh #!/bin/bash # Program: #  Program creates three files, which named by ...

  10. DDD实战进阶第一波(二):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架一)

    要实现软件设计.软件开发在一个统一的思想.统一的节奏下进行,就应该有一个轻量级的框架对开发过程与代码编写做一定的约束. 虽然DDD是一个软件开发的方法,而不是具体的技术或框架,但拥有一个轻量级的框架仍 ...