PAT甲级练习1004. Counting Leaves (30)

    xiaoxiao2021-03-26  20

    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 一开始的想法是用一个数组来表示每个节点的层级,再用一个数组来统计各层级的叶子数。具体代码如下所示。

    但是只能通过四个节点,仔细想了想当中的问题,发现如果给出的父子节点信息不是从上往下顺次给出的是会有问题。

    import java.util.Scanner; public class Main { public static void main(String[] args) { int[] level = new int[100]; int[] leaf_cnt = new int[100]; int father_node = 01; int child_num = 0; int child_node = 0; Scanner s = new Scanner(System.in); int n = s.nextInt();//the number of nodes in a tree int m = s.nextInt();//the number of non-leaf nodes leaf_cnt[0] = 1; for(int i=0; i<m; i++){ father_node = s.nextInt(); child_num = s.nextInt(); for(int j=0; j<child_num; j++){ child_node = s.nextInt(); level[child_node] = level[father_node] + 1; leaf_cnt[level[child_node]]++; } leaf_cnt[level[father_node]]--; } System.out.printf("%d", leaf_cnt[0]); for(int i=99; i>0; i--){ if(leaf_cnt[i] !=0){ for(int j=1; j<i+1; j++){ System.out.printf(" %d", leaf_cnt[j]); } return; } } } } 后来还是换了种方法。开始考虑使用BFS,但是考虑到判断最后的结尾是一个问题。最后还是使用DFS来做,使用动态数组保存节点信息和子节点信息,然后使用一个层次的数组来保存对应层次的叶子数。

    import java.util.ArrayList; import java.util.Scanner; public class Main { private static ArrayList<ArrayList<Integer>> nodes = new ArrayList<ArrayList<Integer>> (); private static int[] leaf_cnt = new int[100]; public static void dfs(int start, int level){ if(nodes.get(start).isEmpty()){ leaf_cnt[level]++; } for(int i=0; i<nodes.get(start).size(); i++){ dfs(nodes.get(start).get(i), level+1); } } public static void main(String[] args) { for(int i=0;i<100;i++){ ArrayList<Integer> node = new ArrayList<Integer>(); nodes.add(node); } Scanner s = new Scanner(System.in); int n = s.nextInt();//the number of nodes in a tree int m = s.nextInt();//the number of non-leaf nodes int father_node = 0; int child_num = 0; int child_node = 0; for(int i=0; i<m; i++){ father_node = s.nextInt(); child_num = s.nextInt(); for(int j=0; j<child_num; j++){ child_node = s.nextInt(); nodes.get(father_node).add(child_node); } } dfs(1, 0); System.out.printf("%d", leaf_cnt[0]); for(int i=99; i>0; i--){ if(leaf_cnt[i] !=0){ for(int j=1; j<i+1; j++){ System.out.printf(" %d", leaf_cnt[j]); } return; } } } }

    转载请注明原文地址: https://ju.6miu.com/read-661159.html

    最新回复(0)