题目
题目大意
给定一棵树。n是总结点数,m是父节点的个数,接下来m行,每行给出父节点所对应的子节点的数目和子节点。要求输出各层的最大节点数,和有最大节点的层。有最大节点的层只有一个。
思路
可以用dfs,也可用bfs,这里我用的是bfs。用一个l数组存放各层的节点数目,用二维数组存储树。bfs中的队列的节点需要和层数绑定,子节点的层数 = 父节点的层数 + 1。结束bfs后,for循环找到l数组中的最大节点数,和其所对应的层数。
代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int n, m;
vector<vector<int>> v;
int maxn = 0, maxl = 0;
vector<int> l; // 每层的个数
struct node{
int id;
int level;
}; // 队列的数据结构
void bfs(node root){
queue<node> q;
q.push(root);
while (!q.empty()){
node now = q.front();
l[now.level]++;
q.pop();
for (int i = 0; i < (int)v[now.id].size(); i++){
node next = {v[now.id][i], now.level + 1};
q.push(next);
}
}
}
int main(){
cin >> n >> m;
v.resize(n + 1);
l.resize(n + 1);
for (int i = 0; i < m; i++){
int id, k;
cin >> id >> k;
v[id].resize(k);
for (int j = 0; j < (int)v[id].size(); j++){
cin >> v[id][j];
}
} // 构建树
node root = {1, 1};
bfs(root);
for (int i = 1; i <= n; i++){
if (maxn < l[i]){
maxn = l[i];
maxl = i;
}
}
cout << maxn << " " << maxl << endl;
return 0;
}