思路:
先建立一个邻接表来保存这颗树 -> 然后BFS这棵树 -> 记录每一层的结点数和层数
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <string.h>
#define MAXN 10010
using namespace std;
struct Node {
int num;
int level;
Node(int _level) : num(0), level(_level) {};
};
vector<Node> result;
vector<int> G[MAXN];
int inq[MAXN], level = 1;
bool cmp(Node a, Node b)
{
return a.num > b.num;
}
void BFS(int root)
{
memset(inq, -1, sizeof(inq));
queue<int> q;
q.push(root);
inq[root] = 1;
while (!q.empty()) {
int size = q.size();
Node temp(++level);
while (size--) {
int now = q.front();
q.pop();
for (int i = 0; i < G[now].size(); i++) {
int v = G[now][i];
if (inq[v] == -1) {
q.push(v);
temp.num++;
inq[v] = 1;
}
}
}
result.push_back(temp);
}
}
int main()
{
int N, M; cin >> N >> M;
if (N == 1) {
printf("1 1");
return 0;
}
while (M--) {
int id, k, temp;
cin >> id >> k;
for (int i = 0; i < k; i++) {
cin >> temp;
G[id].push_back(temp);
}
}
//
BFS(1);
sort(result.begin(), result.end(), cmp);
printf("%d %d", result[0].num, result[0].level);
}
不好的习惯:
懒得去判断只有根节点的情况,所以直接把N == 1的情况特判一下,然后退出程序hhhhhh考试用用还可以,不是一个好习惯