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 Input2 1 01 1 02Sample Output0 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<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; }