Tree Reconstruction UVA - 10410

这题是真的。。不会。我的疑惑点主要在于两个相邻dfs数关系的多样性,因此中间我一直想枚举暴搜,发现不会写代码。然后注意到遍历一定是从小到大的,又不会利用这个性质。。总之心态彻底被搞崩了,主要还是太菜。

题目描述:https://vjudge.net/problem/UVA-10410

网上比较详细的解释:https://www.cnblogs.com/jerryRey/p/4622927.html

核心思想主要是在等效吧,在dfs序与bfs序中同时相邻的情况中,兄弟关系与父子关系是等效的,此时就可以通过从小到大的遍历顺序判断关系。

dfs和bfs定义为在序列中的位置。

设当前节点为u,下一个结点为v。关系如下:

可以看到后两种情况在bfs序相邻时重叠了。但事实上做任一种情况处理都是等效的,因为在v为u的子结点且u,v在bfs序中相邻的情况下,u前面的兄弟结点已经完成了遍历(或者说都是叶子结点,因为如果它们仍有子结点,则在u这一层遍历完时,第一个遍历的数不应是v,而应是u这一层的结点第一个子结点),且u是这一层的最后一个结点,事实上此时整棵树只有u还能继续向下一层扩展,接下来遍历得到的序列是整个序列的最后一部分,因此就算把v看作是u的第一后兄弟结点(相当于把v所对应的子树移到了上一层的最后,也就是u后面),因为v对应的子树的dfs和bfs序不会改变,整个序列也不会改变。

得到这个结论,我们发现只要在bfs(v)=bfs(u)+1时判断一下v是否大于u就可以了,如果是,则可以做兄弟结点,如果否,则一定是子结点。

另外还学到了一点,就是可以在读入时预处理出每个编号所对应的序列中的位置,直接用数组存就好了,不用再找。

代码参考所引博客中的代码。tql

原文地址:https://www.cnblogs.com/jionkitten/p/12320995.html

时间: 2024-10-27 07:02:36

Tree Reconstruction UVA - 10410的相关文章

uva 10410 - Tree Reconstruction(栈)

题目链接:uva 10410 - Tree Reconstruction 题目大意:给定一个树的BFS和DFS,求这棵树. 解题思路:用栈维护即可.对应BFS序列映射出了每个节点和根节点的距离,遍历dfs序列,对当前节点和栈顶节点比较,如果该节点距离根节点更远,则说明该节点为栈顶节点个孩子节点,则记录后将节点放入栈中.否则弹掉栈顶元素继续比较.需要注意一点,即当元素与栈顶元素的距离值大1的时候要视为相等,因为它们属于兄弟节点 #include <cstdio> #include <cst

UVA 10410 - Tree Reconstruction(树)

UVA 10410 - Tree Reconstruction 题目链接 题意:给定一个树的dfs序列和bfs序列,求出这颗树 思路:拿dfs的序列,分成若干段,每一段相当一个子树,这样就可以利用bfs的序列去将dfs的序列分段,然后利用一个队列去存放每一段,不断求出子树即可.一开始以为parse tree一定是二叉树,原来不一定啊. 代码: #include <cstdio> #include <cstring> #include <vector> #include

UVA10410 - Tree Reconstruction(队列)

题目:UVA10410 - Tree Reconstruction(队列) 题目大意:给出一棵树的BFS和DFS遍历,求这棵数,如果有多种情况输出一种就可以了. 解题思路:利用BFS将DFS串分段,分成一棵一棵子树.然后将子树用队列存储下来,因为先被分出来的子树,在下一层中也是最先被分段.注意:一定要将根节点分离出去,它不属于它的子树.这棵树不一定是二叉树. 代码: #include <cstdio> #include <queue> #include <vector>

UVa 10410 树重建

Tree Reconstruction Problem Description You have just finished a compiler design homework question where you had to find the parse tree of an expression. Unfortunately you left your assignment in the library, but luckily your friend picked it up for

【构造题 贪心】cf1041E. Tree Reconstruction

比赛时候还是太慢了……要是能做快点就能上分了 Monocarp has drawn a tree (an undirected connected acyclic graph) and then has given each vertex an index. All indices are distinct numbers from 11 to nn. For every edge ee of this tree, Monocarp has written two numbers: the ma

UVA - 10410 Tree Reconstruction

Description You have just finished a compiler design homework question where you had to find the parse tree of an expression. Unfortunately you left your assignment in the library, but luckily your friend picked it up for you. Instead of e-mailing yo

UVA - 10410 Tree Reconstruction (树重建)

题意:给定一个树的bfs和dfs序列,升序输出每个结点的子结点列表. 分析:因为建树不唯一,假定若bfs[u] = bfs[v] + 1,则u是v的兄弟结点,否则是孩子结点.用栈维护. #pragma comment(linker, "/STACK:102400000, 102400000") #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #in

UVA - 10410 Tree Reconstruction (根据dfs序和bfs序恢复一颗树)

题意: 分析: 这题一开始完全没有思路, 一直没有找出规律. 参考了http://www.cnblogs.com/Wade-/p/6358859.html 和 http://www.cnblogs.com/jerryRey/p/4622927.html 在dfs序列中,相邻的两个结点u,v之间(dfs_pos(u) + 1 =  dfs_pos(v)),有父子,兄弟,其他3种关系. 父子关系:在bfs中u,v并不是相邻, bfs_pos(v) > bfs_pos(u) , 那么u为v父亲, v为

uva 10410 TreeReconstruction

题意,给你一颗树的bfs序和dfs序,结点编号小的优先历遍,问你可能的一种树形: 输出每个结点的子结点. 注意到以下事实: (1)dfs序中一个结点的子树结点一定是连续的. (2)bfs,dfs序中的一个结点u的后续结点一定是u或u的后兄弟结点{v},或u和{v}的后代节点{s}. (3)如果有后兄弟结点,那么bfs序中u后面紧跟着的一定是第一后兄弟结点v1, (4)如果有后代结点,那么dfs序中u后面紧跟着的一定是第一个子结点s1. 记结点u的bfs序记为bfs(u),dfs序记为dfs(v)