思路简述:
这道题似乎没法下载数据,我这个蒟蒻造不出有效的 Hack,请各位大佬或指明错误,或给个 Hack,感谢!
#include <bits/stdc++.h>
using namespace std;
int n;
struct node {
int id;
int fa;
vector<int> ch;
int dep;
bool hy;
} r[2200];
int id2r[2200];
int hcnt;
bool cmp_dep(node a, node b) {
return a.dep > b.dep;
}
void dfs_dep(int p) {
r[p].dep = r[r[p].fa].dep + 1;
for (auto k: r[p].ch) {
dfs_dep(k);
}
}
int main() {
cin >> n;
int p;
for (int i = 1; i <= n - 1; i++) {
cin >> p;
r[i + 1].fa = p;
r[p].ch.push_back(i + 1);
}
int root = -1;
for (int i = 1; i <= n; i++) {
r[i].id = i;
if (r[i].fa == 0) {
root = i;
}
}
r[root].fa = root;
dfs_dep(root);
sort(r + 1, r + n + 1, cmp_dep);
for (int i = 1; i <= n; i++) {
id2r[r[i].id] = i;
}
for (int i = 1; i <= n; i++) {
if (
!r[i].hy &&
!r[id2r[r[i].fa]].hy &&
!r[id2r[r[id2r[r[i].fa]].fa]].hy
) {
bool uc = false;
for (auto k: r[id2r[r[i].fa]].ch) {
if (id2r[k] != i) {
if (r[id2r[k]].hy) {
uc = true;
}
}
}
for (auto k: r[i].ch) {
for (auto l: r[id2r[k]].ch) {
if (r[id2r[l]].hy) {
uc = true;
break;
}
}
}
if (!uc) {
hcnt++;
r[id2r[r[id2r[r[i].fa]].fa]].hy = true;
}
}
}
cout << hcnt << endl;
return 0;
}