Solution:
题目大意:输入树的节点个数N(节点编号为1~N)、非叶子节点个数M,然后输入M个非叶子节点各自的孩子节点编号, 求节点个数最多的一层(层号是从整体来看的,根节点层号为1),输出该层的节点个数及其层号。
先DFS得到树的最大层数。再遍历每一层得到每一层的结点数。最后找到最大的那一层即可。
代码如下:
//树的层次遍历 找到结点数目最多的一层
#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
int n,m;//n为总结点数,m为非叶子结点数
int max_h=-1;//树的最大高度
int l[1000];//l[i]为第i层的节点个数
struct tree{
vector<int> child;
};
vector<tree> t;
void dfs(int root,int depth){
if(t[root].child.size()==0){
max_h=max(max_h,depth);
return;
}
for(int i=0;i<t[root].child.size();i++){
dfs(t[root].child[i],depth+1);
}
}
int max_generation(int root,int level){
l[1]=1;
vector<int> vec;
vec.push_back(root);
for(int i=2;i<=level;i++){
int ans=0;
for(int j=0;j<vec.size();j++){
ans+=t[vec[j]].child.size();
}
l[i]=ans;
vector<int> temp=vec;
vec.clear();
for(int j=0;j<temp.size();j++){
if(t[temp[j]].child.size()!=0){
for(int k=0;k<t[temp[j]].child.size();k++){
vec.push_back(t[temp[j]].child[k]);
}
}
}
}
}
int main(){
cin>>n>>m;
t.resize(n+1);
int id,num,c_id;
for(int i=0;i<m;i++){
cin>>id>>num;
for(int j=0;j<num;j++){
cin>>c_id;
t[id].child.push_back(c_id);
}
}
dfs(1,0);//dfs
int level=max_h+1;
max_generation(1,level);//计算每一层的结点数
int maxl=-1,max_l;
for(int i=1;i<=level;i++){
if(l[i]>maxl){
max_l=i;
maxl=l[i];
}
}
cout<<maxl<<" "<<max_l;
}
更简单的代码:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<queue>
#include<cstring>
#include<vector>
#include<stack>
#include<map>
#define MAX 1005
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
int n,m;//n为总结点数,m为非叶子结点数
int l[MAX];//l[i]为第i层的节点个数
struct tree{
vector<int> child;
};
vector<tree> t;
void dfs(int id,int level){
l[level]++;//第level层的节点数量+1
for(int j=0;j<t[id].child.size();j++){
dfs(t[id].child[j],level+1);
}
}
int main(){
cin>>n>>m;
t.resize(n+1);
int id,num,c_id;
for(int i=0;i<m;i++){
cin>>id>>num;
for(int j=0;j<num;j++){
cin>>c_id;
t[id].child.push_back(c_id);
}
}
dfs(1,1);//dfs,根节点为1号节点,层号为1
int maxlevel=-1,maxvalue=0;
for(int i=0;i<MAX;i++){
if(l[i]>maxvalue){
maxvalue=l[i];
maxlevel=i;
}
}
cout<<maxvalue<<" "<<maxlevel;
return 0;
}