1004. Counting Leaves (30)

102 篇文章 0 订阅
11 篇文章 0 订阅

1004. Counting Leaves (30)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.

Input

Each input file contains one test case. Each case starts with a line containing 0 < N < 100, the number of nodes in a tree, and M (< N), the number of non-leaf nodes. Then M lines follow, each in the format:

ID K ID[1] ID[2] ... ID[K]
where ID is a two-digit number representing a given non-leaf node, K is the number of its children, followed by a sequence of two-digit ID's of its children. For the sake of simplicity, let us fix the root ID to be 01.

Output

For each test case, you are supposed to count those family members who have no child for every seniority level starting from the root. The numbers must be printed in a line, separated by a space, and there must be no extra space at the end of each line.

The sample case represents a tree with only 2 nodes, where 01 is the root and 02 is its only child. Hence on the root 01 level, there is 0 leaf node; and on the next level, there is 1 leaf node. Then we should output "0 1" in a line.

Sample Input
2 1 01 1 02
Sample Output
0 1
这题看了很久很不懂在说甚么,就百度汉化版,原来是有一棵树,然后看看每一层有几个叶子结点(即没有子结点的点),然后一个个输出。结果弄完愣是找不出哪里有误,用了别人的测试样例才发现是函数TreeBFS()中Nosign == Father[nowID].index写错成Nosign ==Child[Index].frontindex;
这一题我用到了数组邻接表和广度优先搜索还有queue(先进先出)。这一题是只有一棵树,我TreeBFS的前面用于处理找到树根,假如不只一棵数,应该也是可以的吧。

 
 

评测结果

时间结果得分题目语言用时(ms)内存(kB)用户
7月22日 22:48答案正确301004C++ (g++ 4.7.2)1308datrilla

测试点

测试点结果用时(ms)内存(kB)得分/满分
0答案正确130810/10
1答案正确13088/8
2答案正确11803/3
3答案正确13083/3
4答案正确13083/3
5答案正确11803/3
#include<iostream>
#include<queue>
using namespace std;
#define Nosign -1
struct Inde
{ 
  int index; 
  bool sign;
  int count;
};
struct noDE
{
  int C;
  int frontindex;
};
int Gmap(Inde*Father, noDE*Child, int i, int CC,int FF)
{
  Child[i].C = CC;
  Child[i].frontindex = Father[FF].index;
  Father[FF].index = i++; 
  return i;
} 
int TreeBFS(Inde*Father, noDE*Child, int N)
{
  int len = 0, Index = 0, inc = 0, id = 0,nowID=0;
  queue<int>QL;
  for (Index = 1; Index <= N; Index++)
  {
    if (!Father[Index].sign)
    {
      if (Nosign == Father[Index].index)
        Father[inc].count++;
      else
      QL.push(Index);
    }  
  }  
  while (!QL.empty())
  {
    inc++;
    len = QL.size();
    while (len--)
   {
    id = QL.front();
    Index = Father[id].index;
    while (Index != Nosign)
    { 
      nowID = Child[Index].C;
      if (Nosign == Father[nowID].index)
      {
        Father[inc].count++;
      }
      else QL.push(nowID);
      Index = Child[Index].frontindex;
    } 
    QL.pop();
   } 
  }
  return inc;
}
void Display(Inde*Father,int inc)
{
  int add; 
  for (add = 0; add < inc; add++) 
    cout << Father[add].count << " "; 
  cout << Father[add].count << endl;
}
int main()
{
  int N, M, K, index,id,i,temp,inc;
  Inde*Father; 
  noDE*Child; 
  cin >> N >> M;
  Father = (Inde*)malloc(sizeof(Inde)*(N + 1));
  Child = (noDE*)malloc(sizeof(noDE)*N);  
  for (index = 0; index <= N; index++)
  {
    Father[index].count = 0;
    Father[index].sign = false;
    Father[index].index =Nosign;  
  }
  for (index = 0,inc=0; index < M; index++)
  {
    cin >> id >> K; 
    for (i = 0; i < K; i++)
    {
      cin >> temp; 
      inc=Gmap(Father, Child, inc, temp, id);
      Father[temp].sign = true;
    }
  }      
  inc=TreeBFS(Father, Child,N);
  Display(Father, inc);
  free(Child);
  free(Father);
  system("pause");
  return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值