PAT 1004.Counting Leaves (30)(C++)

题目描述在这里插入图片描述**加粗样式**

此题是输出每层有多少个叶子节点,可以采用DFS和BFS两种方法进行(由于长时间不练习相关题目。这么简单的题也不能很快做出来,菜

此题是搜索基础题,需要多多练习,多多回顾

DFS

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

vector<vector<int>>tree(100);
int leaveNumOflLevel[100],maxlevel=-1;
int N,M;
void DFS(int v,int level){
    
    
	maxlevel=max(level,maxlevel);
	if(tree[v].empty()){
    
    
		leaveNumOflLevel[level]++;
	}
	for(int i:tree[v]){
    
    
		DFS(i,level+1);
	}
}
int main(){
    
    
	cin>>N>>M;
	while(M--){
    
    
		int id,k;
		cin>>id>>k;
		while(k--){
    
    
			int iid;
			cin>>iid;
			tree[id].push_back(iid);
		}
	}
	DFS(1,0);
	for(int i=0;i<=maxlevel;i++)
	{
    
    
		if(i==0)
		cout<<leaveNumOflLevel[i];
		else
		cout<<" "<<leaveNumOflLevel[i];
	}
	return 0;
}

BFS

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;

vector<vector<int>>tree(100);
int leaveNumOflLevel[100],level[100],maxlevel=-1;
int N,M;
void BFS(){
    
    
	queue<int>q;
	q.push(1);
	while(!q.empty()){
    
    
		int v=q.front();
		q.pop();
		maxlevel=max(level[v],maxlevel);
	if(tree[v].empty()){
    
    
		leaveNumOflLevel[level[v]]++;
	}
	for(int i:tree[v]){
    
    
	level[i]=level[v]+1;
	q.push(i);
	}
	}
	
}
int main(){
    
    
	cin>>N>>M;
	while(M--){
    
    
		int id,k;
		cin>>id>>k;
		while(k--){
    
    
			int iid;
			cin>>iid;
			tree[id].push_back(iid);
		}
	}
	BFS();
	for(int i=0;i<=maxlevel;i++)
	{
    
    
		if(i==0)
		cout<<leaveNumOflLevel[i];
		else
		cout<<" "<<leaveNumOflLevel[i];
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qaqaqa666/article/details/112554144
今日推荐