题目
题目解析
不多说。。和之前的那道数叶子的题目一模一样,我那个已经有很详细的解析了--counting leaves
轻量翻译(这题应该较为简单看懂)
题目描述
一个家庭等级制度一般由一个家谱来代表,里面在同一等级的结点代表同一时代的人。你的任务是找出人最多的时代。
解题代码
基本变量
int N, M; bool root[MaxN][MaxN]; //第一维编号代表父结点编号,第二维代表它的孩子编号 queue<int>Q; //用于bfs pair<int, int>res{1, 1}; //用于存储答案:最大的人数以及它对应的层级
Input函数
void Input() { ios::sync_with_stdio(false); cin >> N >> M; int c = M; while (c--) { //开始输入M行关系 char num[4]; int t; cin >> num >> t; //输入有孩子的编号和孩子的个数 int p = atoi(num); while (t--) { char num2[4]; //输入孩子的编号 cin >> num2; int q = atoi(num2); root[p][q] = 1; } } }
check函数
void check(int node) {//搜索该父节点的孩子,并入队 for (int i = 1; i <= N; i++) { if (root[node][i]) Q.push(i); } }
print函数
void print() { //分清层次bfs遍历打印结果,实际上每层的数量就是每次队列的大小 Q.push(1); int step = 1; while (!Q.empty()) { int sz = Q.size(); if (sz > res.first) { res.first = sz; res.second = step; } for (int i = sz; i > 0; i--) { int node = Q.front(); Q.pop(); check(node); } step++; } cout << res.first << ' ' << res.second; }
整合代码得答案
#include<bits/stdc++.h> using namespace std; #define MaxN 102 int N, M; bool root[MaxN][MaxN]; //第一维编号代表父结点编号,第二维代表它的孩子编号 queue<int>Q; //用于bfs pair<int, int>res{1, 1}; //用于存储答案:最大的人数以及它对应的层级 void Input() { ios::sync_with_stdio(false); cin >> N >> M; int c = M; while (c--) { //开始输入M行关系 char num[4]; int t; cin >> num >> t; //输入有孩子的编号和孩子的个数 int p = atoi(num); while (t--) { char num2[4]; //输入孩子的编号 cin >> num2; int q = atoi(num2); root[p][q] = 1; } } } void check(int node) {//搜索该父节点的孩子,并入队 for (int i = 1; i <= N; i++) { if (root[node][i]) Q.push(i); } } void print() { //分清层次bfs遍历打印结果,实际上每层的数量就是每次队列的大小 Q.push(1); int step = 1; while (!Q.empty()) { int sz = Q.size(); if (sz > res.first) { res.first = sz; res.second = step; } for (int i = sz; i > 0; i--) { int node = Q.front(); Q.pop(); check(node); } step++; } cout << res.first << ' ' << res.second; } int main() { Input(); print(); return 0; }