luogu2279_[HNOI2003]消防局的设立 贪心

本文介绍了一种不使用树形DP的算法,通过深度排序优化消防局的布局,确保每个节点到最近消防局的距离不超过2。核心思路在于更新节点到消防局的距离,并在必要时新建消防局。

传送门

不需要树形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 }

 

转载于:https://www.cnblogs.com/Fo0o0ol/p/10091343.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值