1004. Counting Leaves

Posted chanwunsam

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1004. Counting Leaves相关的知识,希望对你有一定的参考价值。

题目信息:

技术分享图片

题目的意思是找出树中每一层的叶节点个数。
个人觉得难点在寻找每一层有哪些结点,或者说每一个结点在哪一层。题主的做法是用一个队列来帮助我们记录每一个叶节点的层数。
需要注意的是,输入的数据可能是乱序的,也就是头一列可能不是叶节点的,这个也是一个难点。

/* 题目:1004    */
/* 作者:ChanWunsam  */
/* 时间:2017.12.19  */
#include <cstdio>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;

struct TNode{
  int childNum;
  int height;
  int *child;
};
struct TNode FMTree[101];

int main()
{
  int N, M, ID, childNum, childID, i, j, queue[101], front, rear, cnt[100], H, MaxH;
  cin>>N>>M;
  
  /* 初始化家庭树 */
  for(i=0; i<=N; i++)
  {
    FMTree[i].childNum=0;
    FMTree[i].height=0;
    cnt[i]=0;
  }
  
  /* 输入数据 */
  for(i=0; i<M; i++)
  {
    cin>>ID;
    cin>>childNum;
    FMTree[ID].childNum=childNum;
    //cout<<"ID:"<<ID<<" "<<FMTree[ID].height<<endl;
    
    FMTree[ID].child=(int *)malloc(childNum * sizeof(int));
    for(j=0; j<childNum; j++)
    {
      cin>>childID;
      FMTree[ID].child[j]=childID;
    }
  }
  
  /* 建立树层 */
  front=rear=0;
  queue[rear++]=1;      /* 根节点,很重要 */
  while(rear-front)
  {
    ID=queue[front++];
    for(i=0; i<FMTree[ID].childNum; i++)
    {
      j=FMTree[ID].child[i];
      queue[rear++]=j;
      FMTree[j].height=FMTree[ID].height+1; 
    }
  }
  
  /* 寻找无子树结点 */
  H=MaxH=0;
  for(i=1; i<=N; i++)
  {
    H=FMTree[i].height;
    if(!FMTree[i].childNum)
      cnt[H]++;
    if(H>MaxH)
      MaxH=H;
  }
  
  /* 输出值 */
  cout<<cnt[0];
  for(i=1; i<=MaxH; i++)
    cout<<" "<<cnt[i];
  
    return 0;
}

虽然时间复杂度依旧被暴捶,但是好在这算是题主真正意义上独立解决的一个问题(不过中间卡在了乱序的那个地方去寻找思路了),而且思路也和大佬们差不多。还是有点小满足的。

技术分享图片


上星期欠的债算是补了一部分了。。。。



以上是关于1004. Counting Leaves的主要内容,如果未能解决你的问题,请参考以下文章

A1004 Counting Leaves (30分)

1004 Counting Leaves (30)(30 分)

1004 Counting Leaves (30分)

1004 Counting Leaves (30 分)

1004. Counting Leaves (30)

1004. Counting Leaves (30)