PTA 1004 Counting Leaves (30 分)

版权声明:如果转载,请注明出处。 https://blog.csdn.net/S_999999/article/details/88066718

1004 Counting Leaves (30 分)

A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.

Input Specification:

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.

The input ends with N being 0. That case must NOT be processed.

Output Specification:

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 01level, 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
#include<iostream>
#include<cstring> 
#include<queue> 
using namespace std;
int  tree[109][109];  
int  root;
int  N;
void BFS(  ){
	
	 queue < int  > q1;
	 q1.push( root ) ;
	 int cur ,flag = 0 ;
	 while( 1  ){
	 	 
	 	 int cnt=0;
	 	 queue < int  > q2;
	 	 while( !q1.empty() ){ 
	 	 
	     cur = q1.front();
	 	 q1.pop();
	 	 int f = 0  ; 
	 	 for( int i =1;i<=N;i++){
	 	      if( tree[cur][i] != 0 ){
	 	           f = 1; 
				   q2.push(i);
				} 	
		   } 
		 if( f == 0 ){
		     cnt++;
		  }  
	    }
	    	
		    if( flag == 0 ){
		    	flag = 1; 
			} 
		    else printf(" ");
		    printf("%d",cnt);
		 if( q2.empty() ){ 
		     printf("\n");
		     break; 
		 }
		    
	     while( !q2.empty() ){
	   	 int t = q2.front();
	   	 q2.pop();
	   	 q1.push(t);
	   } 
	   
	 } 
}
// 用层序遍历,肯定就出来了。
// 怎么做 ? 
int main(void){
	
	int  m;
	while( scanf("%d",&N)!=EOF &&N ){
	 	scanf("%d",&m);
	 	memset( tree , 0 ,sizeof( tree) );
		char str[3];
		for( int i=1;i<=m;i++){
	     	scanf("%s",str);
		    int id = ( str[0] - '0' ) * 10 + str[1] - '0';
			root = id;
			int k;	
			scanf("%d",&k);
		    for( int j=1;j<=k;j++){
		    	 scanf("%s",str);
		    	 id = ( str[0] - '0') *10 + str[1] -'0';
		         tree[root][id] = 1;    	 
			}  
		}

		root = 1;
        BFS( );		
		
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/S_999999/article/details/88066718