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 }

 

posted @ 2018-12-09 15:21  euix  阅读(112)  评论(0编辑  收藏  举报