PAT 甲级 1004 Counting Leaves【n叉树层次遍历】

还是代码写的少,有点手生,写了好久。。。。

题目很明了,求一个家族树上每一代人有多少没有孩子的,就是求树的每一层上有多少没有子结点的,层次遍历计数就好了。

//1004

//数组a用来存数据,第一个维度指结点编号,第二个维度中a[i][0]表示结点i是否有孩子
//a[i][1]为k,a[i][2]以及以后表示i结点的所有孩子编号
int a[100][205];

int main(){

    int n,m,nod,k;
    while(scanf("%d%d",&n,&m)!=EOF&&n){
        for(int p=0;p<m;p++){
            scanf("%d %d",&nod,&k);
            a[nod][0] = 1;
            a[nod][1] = k;
            for(int i=2;i<=a[nod][1]+1;i++) scanf("%d",&a[nod][i]);
        }

        queue<int> q;
        vector<int> ans;
        bool onlyroot = false;
        int cnt = 0 ,all = 0;
        q.push(1);
        if(!a[1][0]) {onlyroot = true;ans.push_back(1);}//如果只有一个根节点

        while(1){
            if(onlyroot) break; //如果只有一个根节点
            if(all>=n) break;//所有点都算过了

            //所有这一层出队,下一层入队
            int len = q.size();
            all+=len;
            while(len--)
            {
                int t = q.front();q.pop();
                if(!a[t][0]) cnt++;
                for(int i=0;i<a[t][1];i++)
                {
                    q.push(a[t][i+2]);
                }

            }
            ans.push_back(cnt);
            cnt = 0;
        }

        for(int i=0;i<ans.size();i++)
        {
            printf("%d",ans[i]);
            if(i<ans.size()-1) printf(" ");
        }
        printf("\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值