luogu2279_[HNOI2003]消防局的设立 贪心
不需要树形dp
关于深度排序
当前节点到最近的消防局(f[u])>2时要建新的与u的上面(v)的上面(w)
同时w的上面和上面的上面也要更新f值
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define rep(i, a, b) for (int i = a; i <= b; ++i) 4 5 const int N = 1007; 6 7 int n, a[N], id[N], dep[N], f[N]; 8 9 inline bool cmp(const int &x, const int &y) { 10 return dep[x] > dep[y]; 11 } 12 13 int main() { 14 scanf("%d", &n); 15 16 rep(i, 1, n) id[i] = i; 17 18 dep[1] = 1; 19 rep(i, 2, n) { 20 scanf("%d", &a[i]); 21 dep[i] = dep[a[i]] + 1; 22 } 23 24 sort(id + 1, id + n + 1, cmp); 25 26 memset(f, 0x3f, sizeof(f)); 27 28 int ans = 0; 29 30 rep(i, 1, n) { 31 int u = id[i], v = a[u], w = a[v]; 32 f[u] = min(f[u], min(f[v] + 1, f[w] + 2)); 33 if (f[u] > 2) { 34 f[w] = 0, ans++; 35 f[a[w]] = min(f[a[w]], 1), f[a[a[w]]] = min(f[a[a[w]]], 2); 36 } 37 } 38 39 printf("%d\n", ans); 40 41 return 0; 42 }