HDU3290

美少女战士女孩都喜欢吃多种水果,如香蕉、葡萄、苹果等。
一天,当他们在果园里散步时,他们发现了一棵神奇的苹果树。神奇的苹果树有许多节点,但只有一根。每个音符都有自己的标签。它从1开始标记。第一天,只有每个叶节点(没有子节点)有苹果。任何其他节点都没有苹果。每个叶节点拥有的苹果数量只是这个节点的标签。当一个节点的所有直接子节点都有苹果时,该节点将在第二天长出一些苹果。如果一个节点有K个直接子节点,该节点第二天生长的苹果数就是第(K+1)/2个较小节点的苹果数。Xth较小的节点意味着有X–1个节点的苹果数量小于该节点的苹果数量。
现在你的任务是计算苹果的根数。

 

 

投入

有多个测试用例。
每种情况都包含一个正整数N,这意味着该树有N个节点,标记为1,2,...N(0 < N <= 20000)。
以下N行按照标签的顺序描述了所有节点的子节点。每个测试用例中的第(X + 1)行以数字p (0 <= p

 

 

输出

打印根最终长出的苹果数量。

 

 

样本值输入

 

7 2 2 3 2 5 4 2 6 7 0 0 0 0 12 3 2 3 4 0 2 5 6 3 7 8 9 3 10 11 12 0 0 0 0 0 0 0

 

 

抽样输出

 

4 6

具体思路:从上往下先递归,更新子节点返回之后在更新这个节点,类似于先序遍历。

具体讲解在代码注释上

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 20050
using namespace std;
int vis[MAX];
int head[MAX];
int value[MAX];
struct edge
{
    int sta;
    int end;
    int next;         //代表同一个父节点自己本身下一个兄弟节点
}e[MAX];
int num=1;
int cmp(void const *a,void const *b)
{
	return *(int *)a-*(int *)b;
}
void addedge(int fa,int son)
{
    e[num].sta=fa;
    e[num].end=son;
    e[num].next=head[fa];  //相当于是新加一条边,相当于压栈
    head[fa]=num++;         //更新头节点
}
int dfs(int node)
{
    value[node]=node;    //如果节点是叶节点则等于本身,如果不是则后面更新
    int i,j=0;
    for(i=head[node];i!=-1;i=e[i].next){
        dfs(e[i].end);                  //首先先深度递归到最底层更新苹果数量
    }
    //深度递归结束,到此更新value
    int p[MAX];
    for(i=head[node];i!=-1;i=e[i].next){
        p[j++]=value[e[i].end];
    }
    if(j>0){
     qsort(p,j,sizeof(p[0]),cmp);
     value[node]=p[(j+1)/2-1];
    }
    return  value[node];
}
int main()
{
    int n;
    int x,y;
    int i,j;
    while(scanf("%d",&n)!=EOF){
        num=0;
        memset(vis,0,sizeof(vis));
        memset(head,-1,sizeof(head));
        for(i=1;i<=n;i++){
            scanf("%d",&x);
            for(j=1;j<=x;j++){
                scanf("%d",&y);
                vis[y]=1;
                addedge(i,y);
            }
        }
        for(i=n;i>=1;i--){     //只有一个根几点,那么当它没有父几点是,它就是根几点。
            if(vis[i]==0){
                printf("%d\n",dfs(i));
            }
        }
    }
}

 

Guess you like

Origin blog.csdn.net/xxf_is_girl_gad/article/details/89228412