【题解】洛谷P2279 消防局的设立(dfs/贪心)

这道题虽然在洛谷上归类为动态规划(树形dp),然而思考后我们可以用贪心来解决这个问题。

由于我们得到的是一个树形结构,所以我们可以模拟出这么一棵树来,然后通过dfs求出树每一个叶子结点的深度(根节点深度最小为1)。注意用dfs求深度要记录下结点的父亲结点,后面有用。因为消防局可以扑灭和它所在城市距离为2的城市的火灾,所以我们贪心,将求出的最深的节点找到,然后通过fa数组寻找其爷爷结点,并将其标记下来。接着,我们利用search函数来把和该节点距离为2的所有节点都打上标记。然后再重复这个过程,直到所有的结点都被标记过为止。注意需要利用前向星链状结构存图。里面的head[x]指的是x与其他子节点连边的tot,nnext[i]指的是将这个tot跳到另一个tot上去,to[i]就是to的tot那条边得到和x相连的结点。最后为了防止只剩下1结点没有被染色,我们应当让depth[i]>=depth[pd]。还要处理有爷爷结点和没有爷爷节点的情况。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iomanip>
using namespace std;
const int maxn=1000+5;
int n;
int depth[maxn],head[maxn],to[maxn*2],nnext[maxn*2],fa[maxn];
int b[maxn],team[maxn];
int tot;
int s=0,t=0;
int ans=0;
void add(int x,int y)
{
	tot++;
	nnext[tot]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值