my code:
#include <bits/stdc++.h>
using namespace std;
int son[100010], dep[100010], n, k, ans;
void dfs(int u, int fa) {
int x = son[u];
if (x > 0) {
dfs(x, u);
dep[u] = max(dep[u], dep[x] + 1);
}
if (dep[u] == k - 1 && fa > 0 && (son[fa] == x)) {
ans++;
dep[u] = -1;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> k;
for (int i = 1; i <= n; i++) {
int u;
cin >> u;
son[i] = u;
}
ans = (son[1] != 1);
dfs(1, 0);
cout << ans;
return 0;
}
题解:
#include <bits/stdc++.h>
using namespace std;
#define re register
const int maxn=1e5+5;
int n,k,ans;
int head[maxn],to[maxn],nxt[maxn],cnt;
inline void add(int u,int v){
nxt[++cnt]=head[u];
to[cnt]=v;
head[u]=cnt;
}
int a[maxn],dis[maxn];
void dfs(int u,int f){
for(re int i=head[u];i;i=nxt[i]){
int v=to[i];
dfs(v,u);
dis[u]=max(dis[u],dis[v]+1);
}
if(dis[u]==k-1&&f>1&&a[u]^1){
ans++,dis[u]=-1;
}
}
signed main() {
#ifdef LawrenceSivan
freopen("aa.in","r", stdin);
freopen("aa.out","w", stdout);
#endif
cin >> n >> k >> a[1];
ans+=a[1]!=1;
for(re int i=2;i<=n;i++){
cin >> a[i];
add(a[i],i);
}
dfs(1,0);
cout << ans;
return 0;
}