zoukankan      html  css  js  c++  java
  • PAT (Advanced Level) Practice 1094 The Largest Generation (25分) (BFS改进)

    1.题目

    A family hierarchy is usually presented by a pedigree tree where all the nodes on the same level belong to the same generation. Your task is to find the generation with the largest population.

    Input Specification:

    Each input file contains one test case. Each case starts with two positive integers N (<100) which is the total number of family members in the tree (and hence assume that all the members are numbered from 01 to N), and M (<N) which is the number of family members who have children. Then M lines follow, each contains the information of a family member in the following format:

    ID K ID[1] ID[2] ... ID[K]
    

    where ID is a two-digit number representing a family member, K (>0) is the number of his/her children, followed by a sequence of two-digit ID's of his/her children. For the sake of simplicity, let us fix the root ID to be 01. All the numbers in a line are separated by a space.

    Output Specification:

    For each test case, print in one line the largest population number and the level of the corresponding generation. It is assumed that such a generation is unique, and the root level is defined to be 1.

    Sample Input:

    23 13
    21 1 23
    01 4 03 02 04 05
    03 3 06 07 08
    06 2 12 13
    13 1 21
    08 2 15 16
    02 2 09 10
    11 2 19 20
    17 1 22
    05 1 11
    07 1 14
    09 1 17
    10 1 18
    

    Sample Output:

    9 4

    2.题目分析

    思路是使用BFS,将在一层的节点统一放在一个vector中,计算个数并记录,之后进入下一层,当所有节点都访问过一遍后退出。

    3.代码

    #include<iostream>
    #include<vector>
    #include<queue>
    using namespace std;
    vector<int>list[110];
    int amount[110];//每层的节点个数
    int counts = 2;//amount的遍历变量,从2开始,第一层设为1(根节点)
    int total = 0;//遍历过的总节点数
    void DFS(int root,int n)
    {
    	queue<int>out;
    	out.push(root);
    	amount[1] = 1;//第一层1个节点
    	while (1)
    	{
    		vector<int>t;//先放在vector中,记录完个数后放在queue中
    		while (!out.empty())
    		{
    			int temp = out.front(); out.pop();
    			for (int i = 0; i < list[temp].size(); i++)
    			{
    				t.push_back(list[temp][i]);
    			}
    		}
    		amount[counts++] = t.size();
    		for (int i = 0; i < t.size(); i++)
    		{
    			out.push(t[i]); total++;
    		}
    		t.clear();
    		if (total == n - 1)break;//除了根节点剩下n-1个
    	}
    }
    int main()
    {
    	int n, m, k,a,b;
    	scanf("%d %d", &n, &m);
    	for (int i = 1; i <= m; i++)
    	{
    		scanf("%d", &a);
    		scanf("%d", &k);
    		for (int j = 1; j <= k; j++)
    		{
    			scanf("%d", &b);
    			list[a].push_back(b);
    		}
    	}
    	DFS(1, n);
    	int max = -1, maxi;
    	for (int i = 1; i <= n; i++)
    	{
    		if (max < amount[i]) { max = amount[i]; maxi = i; }
    	}
    	printf("%d %d", max, maxi);
    }
  • 相关阅读:
    eclipse下c/cpp " undefined reference to " or "launch failed binary not found"问题
    blockdev 设置文件预读大小
    宝宝语录
    CentOS修改主机名(hostname)
    subprocess报No such file or directory
    用ldap方式访问AD域的的错误解释
    英特尔的VTd技术是什么?
    This virtual machine requires the VMware keyboard support driver which is not installed
    Linux内核的文件预读详细详解
    UNP总结 Chapter 26~29 线程、IP选项、原始套接字、数据链路访问
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/12788837.html
Copyright © 2011-2022 走看看