方法1

根据六度空间这道题改变而成,具体请参照六度空间题解
注意:
当n为1时需要特殊处理,后面的方法2和方法3不需要。

#include<cstdio>
#include<queue>
#include<cstring>
#include<vector>
using namespace std;
const int maxn = 105;
int n,total=0,layer=0;
vector<int> T[maxn];

void BFS(int x){
	queue<int> q;
	q.push(x);
	int end=1,start=1,last=x,tail,Layer=1;
	while(!q.empty()){
		int temp = q.front();
		q.pop();
		for(int i=0;i<T[temp].size();i++){
			{
				q.push(T[temp][i]);
				tail = T[temp][i];
				end++;
			}
		}
		if(temp == last){
			last = tail;
			Layer++;
			if(end-start > total){
				total = end-start;
				layer = Layer;
			}
			start=end;
		}	
	}
}

int main(){
	int m,u,v,dad,k,son;
	scanf("%d%d",&n,&m);
	while(m--){   //建树 
		scanf("%d%d",&dad,&k);
		for(int i=0;i<k;i++){
			scanf("%d",&son);
			T[dad].push_back(son);
		}
	}
	if(n==1){
		printf("1 1\n");
		return 0;
	}
	BFS(1);
	printf("%d %d\n",total,layer);
	return 0;
}

方法2

使用DFS深度优先搜索
树使用简洁的静态写法

#include<cstdio>
#include<queue>
#include<cstring>
#include<vector>
using namespace std;
const int maxn = 105;
int n;
vector<int> T[maxn];
int hashT[maxn];


void DFS(int index, int level){
	hashT[level]++;  //该层的数量加1
	for(int i=0;i<T[index].size();i++){
		DFS(T[index][i], level + 1);
	} 
}

int main(){
	int m,u,v,dad,k,son;
	scanf("%d%d",&n,&m);
	while(m--){   //建树 
		scanf("%d%d",&dad,&k);
		for(int i=0;i<k;i++){
			scanf("%d",&son);
			T[dad].push_back(son);
		}
	}
	memset(hashT,0,sizeof(hashT));
	DFS(1,1);
	int maxValue=-1,layer;
	for(int i=1;i<maxn;i++){
		if(hashT[i] > maxValue){
			maxValue = hashT[i];
			layer = i;
		}
	}
	printf("%d %d\n",maxValue,layer);
	return 0;
}

方法3

使用BFS广度优先搜索
树使用另一种静态写法

#include<cstdio>
#include<queue>
#include<cstring>
#include<vector>
using namespace std;
const int maxn = 105;
int n;
int hashT[maxn];

struct node{
	int layer;
	vector<int> child;
}T[maxn];


void BFS(int index,int level){
	hashT[level]++;  //该层的数量加1
	T[index].layer=level;
	queue<int> q;
	q.push(index);
	while(!q.empty()){
		int temp = q.front();
		q.pop();
		for(int i=0;i<T[temp].child.size();i++){
			int child=T[temp].child[i];
			T[child].layer = T[temp].layer + 1;
			hashT[T[child].layer]++;
			q.push(child);
		}
	}
}

int main(){
	int m,u,v,dad,k,son;
	scanf("%d%d",&n,&m);
	while(m--){   //建树 
		scanf("%d%d",&dad,&k);
		for(int i=0;i<k;i++){
			scanf("%d",&son);
			T[dad].child.push_back(son);
		}
	}
	memset(hashT,0,sizeof(hashT));
	BFS(1,1);
	int maxValue=-1,layer;
	for(int i=1;i<maxn;i++){
		if(hashT[i] > maxValue){
			maxValue = hashT[i];
			layer = i;
		}
	}
	printf("%d %d\n",maxValue,layer);
	return 0;
}