原题
题目大意及思路
- 找到给定的树中节点最多的层,并输出其节点数和层数。
- 这里我主要采用邻接表存储每个结点的孩子节点,用DFS来遍历整棵树,并用一个数组存储下每层的孩子数量。在程序的最后找到结点最多的层数。
代码
#include<iostream>
#include<vector>
using namespace std;
vector<int> layer(100);
vector<int> child[109];
void DFS(int index,int depth){
layer[depth]++;
for(int i=0;i<child[index].size();i++) DFS(child[index][i],depth+1);
return;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++){
int index,k;
cin>>index>>k;
child[index].resize(k);
for(int j=0;j<k;j++) cin>>child[index][j];
}
DFS(1,1);
int anslayer=1,ansnum=1;
for(int i=1;i<100;i++){
if(ansnum<layer[i]){
ansnum=layer[i];
anslayer=i;
}
}
printf("%d %d\n",ansnum,anslayer);
return 0;
}
运行截图
收获
其实寻找最大层数还有另一种写法:在DFS的过程中更新目前节点最多的层数值。更改代码如下:
void DFS(int index,int depth){
layer[depth]++;
if(layer[depth]>ansnum){
ansnum=layer[depth];
anslayer=depth;
}
for(int i=0;i<child[index].size();i++) DFS(child[index][i],depth+1);
return;
}
样例也是全部通过的。但我经过思考后,并不推荐这个写法:在上一学期中通过对计算机硬件系统的学习,我对计算机内部运行机制有了更多了解。DFS函数会在这个程序中调用很多次,如果在每一次的调用中都进行“不必要的”更新,会产生更多的开销,这是可以通过在程序结尾一次查找来避免的,所以还是推荐之前的做法。