读完题后感觉是比较常见的树的dfs问题。但是看完输入格式之后有点懵,这种奇怪的输入格式虽然也能用邻接表或邻接矩阵存储,但是很别扭。
看了评论区大神的解答后才知道链式前向星这种数据结构,这道题过于适合使用链式前向星来解答,很难不怀疑出题者是按照链式前向星来输入的。
主要难点就在链式前向星的使用上。关于最大数量判断,许多类似的题中也有涉及,可自行推倒。
#include <iostream>
#include <string.h>
#define MAXN 50
using namespace std;
struct node{
int to;
int next;
}edge[MAXN];
int len[MAXN];
int head[MAXN];
int cnt = 0;
void addEdge(int start, int end){
edge[cnt].to = end;
edge[cnt].next = head[start];
head[start] = cnt++;
}
void getLen(int n){
for(int i = head[n];~i;i = edge[i].next){
len[edge[i].to] = len[n] + 1;
getLen(edge[i].to);
}
}
int main(){
memset(head, 0xff, sizeof(head));
memset(len, 0, sizeof(len));
int N, L;
cin >> N >> L;
for(int i = 0;i < N - 1;i++){
int start;
int end;
cin >> start;
addEdge(start, i + 1);
}
getLen(0);
int maxLen = 0;
int maxId;
for(int i = 0;i < N;i++){
if(len[i] > maxLen){
maxLen = len[i];
maxId = i;
}
}
if(maxLen > L){
cout << L + 1;
}
else{
if(N > maxLen + (L - maxLen) / 2 + 1){
cout << maxLen + (L - maxLen) / 2 + 1;
}
else{
cout << N;
}
}
}