1004. Counting Leaves

思路:该题存储时将id对应的儿子节点存储在vector中,利用深度优先搜索对每个节点进行遍历,知道找到该id下没有儿子节点,说明该结点为叶子结点,传递参数时有一个参数level,每一次执行一次DFS,说明层数加一。Counter记录某一层叶子结点的个数。

#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#define MaxNum 101
using namespace std;
int counter[MaxNum] = {0}, M, N, id, child_id, K;
map<int, vector<int>>child;
void DFS(int id,int level) {
	if (child[id].empty()) {//如果id的儿子节点为空说明其为叶子结点
		counter[level]++;//则该层叶子结点数加1
		return;
	}
	vector<int>::iterator it;
	for (it = child[id].begin(); it != child[id].end(); it++) {//对所有结点进行深度遍历,找到其儿子的节点为叶子结点
		DFS(*it, level + 1);	
	}
}
int main()
{
	int leaf,Count;
	cin >> N>> M;
	leaf = N - M;//leaf叶子结点的个数
	while (M--) {
		cin >> id>>K;
		while (K--) {
			cin >> child_id;
			child[id].push_back(child_id);//将该id下的所有儿子节点加入
		}
	}
	DFS(1,0);
	cout << counter[0];
	Count = counter[0];
	for (int i = 1; Count < leaf;i++) {//当Count==leaf时说明所有叶子结点已经全部输出
		cout << " " << counter[i];
		Count += counter[i];
	}
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值