杭电OJ_hdu3290_Themagicappletree是什么魔法苹果树的编程题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计950个文字,预计阅读时间需要4分钟。
题目大意:给出一个有N个节点的树,每个节点有一个label。1. 计算每个叶子节点的label对应的苹果数量,等于叶子节点的label。2. 对于某个父节点,其有K个子节点,直到它的K个子节点都生出了苹果,父节点才开始生长苹果。
题目大意:给出一个有N(0题目大意:给出一个有N(0 1.叶子节点生长出的苹果数量等于叶子节点的label。 2.某父亲节点有K个儿子节点,直到它的K个儿子节点都生长出苹果,父亲节点才开始生长苹果。父亲节点长出的苹果数量等于它的 所有儿子中苹果数量第(k+1)/2小的 儿子节点的苹果数量。 求根节点生长出的苹果数量。 举个栗子:如下图所示,label为4,5,6,7的节点是叶节点,根据规则一,叶节点生长的苹果数量为他们的编号,那么他们生长出的苹果数量分别为4,5,6,7个。接下来,节点2,3的所有子节点有已经生长出苹果了,根据规则二,轮到节点2,3生长苹果了。节点2有2个子节点,根据计算:(2+1)/2 = 1,节点2的苹果数量等于它的所有儿子节点苹果数量中第1小的儿子节点苹果数量,也就是等于节点4的苹果数量。同样的,节点3的苹果数量为6。最后计算节点1的苹果数量即可。
1、用邻接表来存储这颗树。
2、用visit数组记录每个节点的入度,也就是方面后面找到根节点,根节点的入度为0。
3、根据题目规则,设计DFS搜索来求每个节点的苹果数量。
4、用优先队列来维护第(K+1)/2小的子节点苹果数量。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 9 const int N = 20010;10 11 /** 子节点结构 **/12 typedef struct LeafNode13 {14 int label; ///节点标号15 int next; ///下个子节点地址16 }LeafNode;17 18 /** 父节点结构 **/19 typedef struct Node20 {21 int label; ///节点标号22 int smaller; ///记录第几小的儿子23 int next; ///儿子节点地址24 }Node;25 26 Node tree[N]; ///邻接表存储苹果树27 int visit[N]; ///记录节点的入度28 LeafNode leaf[N];///静态数组存储叶节点29 int leafIndex; ///记录静态数组下一个可以分配的地址30 int n; ///节点数量31 32 /** dfs搜索root节点的苹果数量 **/33 int dfs( int root )34 {35 ///root节点为叶节点,直接返回苹果数量,即label36 if ( -1 == tree[root].next )37 return tree[root].label;38 39 ///root节点为父节点,计算该节点所有子节点的苹果数量,然后在返回40 int p = tree[root].next;41 priority_queue杭电OJ_hdu3290_The magic apple tree
本文共计950个文字,预计阅读时间需要4分钟。
题目大意:给出一个有N个节点的树,每个节点有一个label。1. 计算每个叶子节点的label对应的苹果数量,等于叶子节点的label。2. 对于某个父节点,其有K个子节点,直到它的K个子节点都生出了苹果,父节点才开始生长苹果。
题目大意:给出一个有N(0题目大意:给出一个有N(0 1.叶子节点生长出的苹果数量等于叶子节点的label。 2.某父亲节点有K个儿子节点,直到它的K个儿子节点都生长出苹果,父亲节点才开始生长苹果。父亲节点长出的苹果数量等于它的 所有儿子中苹果数量第(k+1)/2小的 儿子节点的苹果数量。 求根节点生长出的苹果数量。 举个栗子:如下图所示,label为4,5,6,7的节点是叶节点,根据规则一,叶节点生长的苹果数量为他们的编号,那么他们生长出的苹果数量分别为4,5,6,7个。接下来,节点2,3的所有子节点有已经生长出苹果了,根据规则二,轮到节点2,3生长苹果了。节点2有2个子节点,根据计算:(2+1)/2 = 1,节点2的苹果数量等于它的所有儿子节点苹果数量中第1小的儿子节点苹果数量,也就是等于节点4的苹果数量。同样的,节点3的苹果数量为6。最后计算节点1的苹果数量即可。
1、用邻接表来存储这颗树。
2、用visit数组记录每个节点的入度,也就是方面后面找到根节点,根节点的入度为0。
3、根据题目规则,设计DFS搜索来求每个节点的苹果数量。
4、用优先队列来维护第(K+1)/2小的子节点苹果数量。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 9 const int N = 20010;10 11 /** 子节点结构 **/12 typedef struct LeafNode13 {14 int label; ///节点标号15 int next; ///下个子节点地址16 }LeafNode;17 18 /** 父节点结构 **/19 typedef struct Node20 {21 int label; ///节点标号22 int smaller; ///记录第几小的儿子23 int next; ///儿子节点地址24 }Node;25 26 Node tree[N]; ///邻接表存储苹果树27 int visit[N]; ///记录节点的入度28 LeafNode leaf[N];///静态数组存储叶节点29 int leafIndex; ///记录静态数组下一个可以分配的地址30 int n; ///节点数量31 32 /** dfs搜索root节点的苹果数量 **/33 int dfs( int root )34 {35 ///root节点为叶节点,直接返回苹果数量,即label36 if ( -1 == tree[root].next )37 return tree[root].label;38 39 ///root节点为父节点,计算该节点所有子节点的苹果数量,然后在返回40 int p = tree[root].next;41 priority_queue杭电OJ_hdu3290_The magic apple tree

