1004. Counting Leaves (30)

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 答案正确 30 1004 C++ (g++ 4.7.2) 1 308 datrilla

测试点

测试点 结果 用时(ms) 内存(kB) 得分/满分
0 答案正确 1 308 10/10
1 答案正确 1 308 8/8
2 答案正确 1 180 3/3
3 答案正确 1 308 3/3
4 答案正确 1 308 3/3
5 答案正确 1 180 3/3
#include
#include
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;
}

你可能感兴趣的:(queue,BFS,C++,数组邻接表)