1004. Counting Leaves (30)

10 篇文章 0 订阅
1 篇文章 0 订阅

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

  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

DFS解法

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int n,m;
int* result;
int max_h;
struct Node{/*孩子兄弟表示法*/
    int firstChild=-1;
    vector<int> brother;
};
void dfs(Node* tree,int id,int deep){
    max_h=deep>max_h?deep:max_h;
    //判断当前的id是不是叶子节点
    if(tree[id].firstChild==-1)
        result[deep]++;
    for(int i=0;i<tree[id].brother.size();i++){
        dfs(tree,tree[id].brother[i],deep);
    }
    if(tree[id].firstChild!=-1)
        dfs(tree,tree[id].firstChild,deep+1);
}
int main()
{
    //freopen("in.txt","r",stdin);
    cin>>n>>m;
    Node* tree=new Node[100+10];
    result=new int[n]{0};
    for(int i=0;i<m;i++){
        int id,k,id_1;
        cin>>id>>k;
        cin>>id_1;
        tree[id].firstChild=id_1;
        for(int j=1;j<k;j++){
            int b;
            cin>>b;
            tree[id_1].brother.emplace_back(b);
        }
    }
    dfs(tree,1,0);
    for(int i=0;i<max_h;i++){
        cout<<result[i]<<" ";
    }
    cout<<result[max_h];
    return 0;
}

采用孩子兄弟来存储,也可以用邻接表存储。要注意,树的高度要用变量存储,不能直接认为是m

BFS解法

#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
int n,m;
int* result;
int max_h;
int* h;//记录节点所在的层次
struct Node{/*孩子兄弟表示法*/
    int firstChild=-1;
    vector<int> brother;
};
/*void dfs(Node* tree,int id,int deep){
    max_h=deep>max_h?deep:max_h;
    //判断当前的id是不是叶子节点
    if(tree[id].firstChild==-1)
        result[deep]++;
    for(int i=0;i<tree[id].brother.size();i++){
        dfs(tree,tree[id].brother[i],deep);
    }
    if(tree[id].firstChild!=-1)
        dfs(tree,tree[id].firstChild,deep+1);
}*/
void bfs(Node* tree){
    max_h=0;
    queue<int> q;
    q.push(1);
    while(!q.empty()){
        int id=q.front();
        q.pop();
        max_h=h[id]>max_h?h[id]:max_h;
        if(tree[id].firstChild==-1){//是叶子节点
            result[h[id]]++;
            continue;
        }
        //更新当前节点所有孩子节点的层次
        h[tree[id].firstChild]=h[id]+1;
        q.push(tree[id].firstChild);
        for(int i:tree[tree[id].firstChild].brother){
            h[i]=h[id]+1;
            q.push(i);
        }
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    cin>>n>>m;
    Node* tree=new Node[100+10];
    result=new int[n]{0};
    h=new int[n+1]{0};
    for(int i=0;i<m;i++){
        int id,k,id_1;
        cin>>id>>k;
        cin>>id_1;
        tree[id].firstChild=id_1;
        for(int j=1;j<k;j++){
            int b;
            cin>>b;
            tree[id_1].brother.emplace_back(b);
        }
    }
    //dfs(tree,1,0);
    bfs(tree);
    for(int i=0;i<max_h;i++){
        cout<<result[i]<<" ";
    }
    cout<<result[max_h];
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前台: (1)注册登录模块:按照学校的相关规定进行注册和登录。 (2)招聘信息查看:高校毕业生们可以网站首页上查看所有的招聘信息,除此之外还可以输入公司名称或岗位名称进行搜索。 (3)用人单位模块:此模块为宣传用人单位的主要功能模块,具体包括用人单位简介、岗位需求及职责及公司介绍等功能。 (4)就业指导:学生朋友们在就业前可以通过此模块获取指导。 (5)新闻信息:为了让用户们可以了解到最新的新闻动态,本系统可以通过新闻信息查看功能阅读近期的新闻动态。 (6)在线论坛:毕业季的同学们可以通过此模块相互交流。 后台: (1)系统用户管理模块:可以查看系统内的管理员信息并进行维护。 (2)学生管理模块:通过此功能可以添加学生用户,还可以对学生信息进行修改和删除。 (3)用人单位管理模块:管理员用户通过此模块可以管理用人单位的信息,还可以对用人单位信息进行查看和维护。 (4)招聘管理模块:管理员通过此功能发布和维护系统内的照片信息。 (5)就业指导管理模块:通过此模块可以编辑和发布就业指导信息,从而更好的帮助就业季的同学们。 (6)论坛管理:通过论坛管理可以查看论坛中的主题帖及里面的回复信息,除此之外还可以对论坛中的信息进行维护和管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值