求每一层的叶子节点数
注意点:
1.到底有几层?所以用了maxDepth来保存最深的层数
便于后续来输出每层的层数
2.如何保存每层的层数
HashTable[]散列表来存储,下标是层数,元素是叶子个数
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int n,m,maxDepth=0;
int hashTable[110]={
0};
vector<int> Node[110];
void dfs(int index,int depth){
if(Node[index].size()==0){
//孩子节点
hashTable[depth]++;
if(depth>maxDepth){
maxDepth=depth;
}
}else{
for(int i=0;i<Node[index].size();i++){
dfs(Node[index][i],depth+1);
}
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++){
int id_father,num_child,id_child;
cin>>id_father>>num_child;
for(int j=0;j<num_child;j++){
cin>>id_child;
Node[id_father].push_back(id_child);//建树
}
}
dfs(1,1);
for(int i=1;i<=maxDepth;i++){
if(i==1)
cout<<hashTable[i];
else
cout<<" "<<hashTable[i];
}
return 0;
}
draw inspiration from the following questions:
1094 The Largest Generation (25分)
最多节点数、层编号
//总节点的个数,有孩子的节点的个数
//23 13
//ID K ID[1] ID[2]....节点编号 孩子个数 孩子编号1 孩子编号2.....孩子编号n
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
int n,m;
int hashTable[110]={
0};//散列表-----记录每一层的节点个数,下标是第几层,元素是个数
vector<int> Node[110];
void dfs(int index,int depth){
if(Node[index].size()==0){
//根节点
hashTable[depth]++;
return;
}else{
hashTable[depth]++;
for(int i=0;i<Node[index].size();i++){
dfs(Node[index][i],depth+1);//遍历所有孩子节点,进行递归
}
}
}
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++){
int id_parent,num_child;
cin>>id_parent>>num_child;
for(int j=0;j<num_child;j++){
int id_child;
cin>>id_child;
//它给出了有孩子的节点情况,叶子节点信息没给出
//所以不用记录叶子节点,不做操作,给出的做,那叶子节点不也突出了吗?
Node[id_parent].push_back(id_child);//建树
}
}
dfs(1,1);//根节点编号是1,层数是1
int maxdepth=0,maxValue=0;
for(int i=1;i<110;i++){
if(hashTable[i]>maxValue){
maxValue=hashTable[i];
maxdepth=i;
}
}
printf("%d %d",maxValue,maxdepth);
return 0;
}
1090 Highest Price in Supply Chain (25分)
最大价值的叶子节点个数
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
int n,root,maxDepth=0,num;
double p,r;
vector<int> child[100010];
void dfs(int index,int depth){
if(child[index].size()==0){
//没有孩子,到达根节点了
if(depth>maxDepth){
maxDepth=depth;
num=1;
}else if(depth==maxDepth){
num++;
}
return;
}
for(int i=0;i<child[index].size();i++){
dfs(child[index][i],depth+1);//递归访问节点index的子节点
}
}
int main()
{
scanf("%d %lf %lf",&n,&p,&r);
for(int i=0;i<n;i++){
int tmp;
scanf("%d",&tmp);
if(tmp==-1){
root=i;
}else{
child[tmp].push_back(i);
}
}
dfs(root,0);
printf("%.2f %d",p*pow(1+0.01*r,maxDepth),num);//根节点为第0层
return 0;
}