PAT-A | 1004 | Counting Leaves

10 篇文章 0 订阅
3 篇文章 0 订阅
该博客讨论了PAT-A的1004题目,涉及树的数据结构和计算没有子节点的成员。博主分享了他们在解决这个问题时遇到的误解,并提到了另一个题目1094给予的启示。博主提供了正确和错误的代码示例。
摘要由CSDN通过智能技术生成

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
这题和PAT-A 1094几乎一样,只有一点细微的差别。

最初做这道题,我像当然的以为输入会按顺序来,结果写完后答案全错!也放哪里没管了,然后做了1094题,做对了(别人设计的结构体给了我启发)。回过头来这道题就很简单了,不再赘述,具体还是看1094题的解题思路。

正确代码如下:

#include <iostream>
#include <queue>

using namespace std;

struct node {
	int level;
	int parent;
	int son;//number of son
};
typedef node *tree;

int main()
{

	int N, M;
	int pid, K, cid; //parent id, K, child id
	tree T;
	int *gen; // nodes of every generation
	queue<int> Q;
	int f;//front of queue

	cin >> N >> M;

	T = new node[N + 1];
	gen = new int[N + 1];
	for (int i = 0; i != N + 1; ++i) {
		T[i].son = 0;
	}

	//step 1. process input
	for (int i = 0; i != M; ++i) {
		cin >> pid >> K;
		T[pid].son = K;//
		for (int j = 0; j != K; ++j) {
			cin >> cid;
			T[cid].parent = pid;
			T[cid].level = 0; //initialize
		}
	}

	//step 2. calculate every node's level
	T[1].level = 1;//root
	Q.push(1);//root
	while (!Q.empty()) {
		f = Q.front(); Q.pop();
		for (int i = 1; i != N + 1; ++i) {
			if (T[i].parent == f) {
				T[i].level = T[f].level + 1;
				Q.push(i);
			}
		}
	}

	//debug
	//for (int i = 1; i != N + 1; ++i) {
	//	cout << i << " " << T[i].parent << " " << T[i].level << endl;
	//}


	//step 3. calculate the number of un-son-nodes of each level

	//initialize gen[]
	for (int i = 1; i != N + 1; ++i) {
		gen[i] = 0;
	}

	int maxLevel = 1;
	for (int i = 1; i != N + 1; ++i) {
		if (T[i].son == 0) {
			++gen[T[i].level];
		}
		if (T[i].level > maxLevel) {
			maxLevel = T[i].level;
		}
	}

	//debug
	//for (int i = 1; i <= maxLevel; ++i) {
	//	cout << gen[i] << " ";
	//}

	//step 4. output
	for (int i = 1; i != maxLevel; ++i) {
		cout << gen[i] << " ";
	}
	cout << gen[maxLevel] << endl;

	delete[]T;
	delete[]gen;
}


自己写的不合理的代码:


 PAT-A | 1004 | Counting Leaves
 2015/09/09
 author: kaituoXu
//
//#include <iostream>
//#include <queue>
//
//using namespace std;
//
//const int MAXNODE = 100;
//
//int main()
//{
//	int N, M;
//	queue<int> Q;
//	int nodes_of_every_level[MAXNODE];
//	int no_leaves_nodes_of_every_level[MAXNODE];// index start from 1
//	int first_of_every_level[MAXNODE];
//	int end_of_every_level[MAXNODE];
//
//	cin >> N >> M;
//	
//	int new_level_flag = 0, ID, K, son, f, i = 1;
//	Q.push(1);//root's ID = 01
//	son = 1;
//	nodes_of_every_level[1] = 1;//remember to intialize
//	no_leaves_nodes_of_every_level[1] = 0;
//	first_of_every_level[1] = 1;
//	end_of_every_level[1] = 1;
//	i = 1;
//	nodes_of_every_level[2] = 0;
//	while (!Q.empty()) {
//		if (--M >= 0) {
//			cin >> ID;
//			cin >> K;
//			nodes_of_every_level[i + 1] += K;
//			while (K--) {
//				cin >> son;
//				Q.push(son);
//			}		
//		}
//		if (--N >= 0) {
//			f = Q.front(); Q.pop();
//			if (--nodes_of_every_level[i] == 0) {//move to next level
//				++i;
//				no_leaves_nodes_of_every_level[i] = 0;
//				nodes_of_every_level[i + 1] = 0;
//			}
//			if (f != ID) {
//				++no_leaves_nodes_of_every_level[i];
//			}
//		}
//	}
//
//	int j;
//	for (j = 1; j < i - 1; ++j) {
//		cout << no_leaves_nodes_of_every_level[j] << " ";
//	}
//	cout << no_leaves_nodes_of_every_level[j] << endl;
//
//
//}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值