[ZJOI2012]灾难

本文介绍了如何在食物网中计算生物的灾难值,即某生物灭绝后受影响的生物数量。通过构建支配树,利用拓扑排序和最近公共祖先(LCA)算法解决这一问题。文章以实例详细解释了建树过程,并提供了代码实现。
摘要由CSDN通过智能技术生成

题目大意

给定一张食物网,对于每一种生物,求其灾难值。灾难值的定义为

如果它突然灭绝,那么会跟着一起灭绝的生物的种数。

Solution

很多 d a l a o dalao dalao说是支配树。

呃?不知道支配树??

没事,我也不知道,但是这题看完之后自然就知道了。


如果给你的不是一个 D A G DAG DAG,而是一棵树,那么怎么做?

这不简单?每个节点的答案就是子树大小 − 1 -1 1,因为要减去自己。

那我们就把图变成一棵树。


我们以样例为例。

首先草是一切生物的食物来源,所以其等级最高,就会被建在我们新建的树的根节点。
所以我们是怎么找到草的呢?不知道。但是如果反向建边呢?在这里插入图片描述

很明显,就是入度为 0 0 0的点。

然后考虑下一个节点,比如说考虑节点 2 2 2,显然,在重构的树中,节点 2 2 2应该是 1 1 1的儿子。这是一个前驱的情况,那么比如说节点 4 4 4这样有 2 , 3 2,3 2,3两个前驱的呢?显然不可能是 2 , 3 2,3 2,3的儿子,根据建树的目的,可以想到, 4 4 4应该是 1 1 1的儿子,因为只有 1 1 1灭绝了,才有可能使 4 4 4灭绝,而 1 1 1是怎么找到的呢?在 4 4 4之前,显然

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值