考查点:BFS或DFS,求树的最大节点层
思路:BFS代码长点,DFS较短,BFS只需设置个变量last来记录每一层的最后一个节点;DFS只需两个参数,一个节点一个层数,每次调用都要更新当前层的节点数,可以用哈希数组保存层数的节点值
提交情况:一开始输入时候%d写错成%k调了半天,之后因为找根节点时候没把0排除,第一次提交没考虑只有一个根节点的情况之后ac
BFS的代码:
#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#define FOR(i, x, y) for(int i = x; i < y; i++)
#define rFOR(i, x, y) for(int i = x; i > = y; i--)
#define MAXN 110
#define oo 0x3f3f3f3f
using namespace std;
int n;
int h[MAXN];
vector<int> child[MAXN];
int ans;
int alevel;
void BFS(int root){
queue<int> q;
int level=1;
int cnt=1;
int first=0,last=root;
q.push(root);
while(!q.empty()){
int t=q.front();
q.pop();
FOR(i,0,child[t].size())
{
q.push(child[t][i]);
}
if(t==last){
cnt=q.size();
last=q.back();
level++;
}
if(cnt>ans){
ans=cnt;alevel=level;
}
}
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif // LOCAL
int lv,id,k,x;
scanf("%d%d",&n,&lv);
FOR(i,0,lv)
{
scanf("%d%d",&id,&k);
FOR(j,0,k)
{
scanf("%d",&x);
child[id].push_back(x);
h[x]=1;
}
}
int root;
FOR(i,1,n+1){
if(h[i]==0) {
root=i;break;
}
}
BFS(root);
if(n!=1){
printf("%d %d",ans,alevel);
}else printf("1 1");
return 0;
}
DFS的代码:
#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#define FOR(i, x, y) for(int i = x; i < y; i++)
#define rFOR(i, x, y) for(int i = x; i > = y; i--)
#define MAXN 110
#define oo 0x3f3f3f3f
using namespace std;
vector<int> child[MAXN];
int ha[MAXN];
void DFS(int index,int level){
ha[level]++;
FOR(j,0,child[index].size())
{
DFS(child[index][j],level+1);
}
}
int main()
{
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif // LOCAL
int n,m,parent,k,ch;
scanf("%d%d",&n,&m);
FOR(i,0,m)
{
scanf("%d%d",&parent,&k);
FOR(j,0,k)
{
scanf("%d",&ch);
child[parent].push_back(ch);
}
}
DFS(1,1);
int maxLevel=-1,maxValue=0;
FOR(i,1,MAXN)
{
if(ha[i]>maxValue){
maxValue=ha[i];
maxLevel=i;
}
}
printf("%d %d\n",maxValue,maxLevel);
return 0;
}