阿米巴是小强的好朋友。

阿米巴和小强在草原上捉蚂蚱。小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难。

学过生物的阿米巴告诉小强,草原是一个极其稳定的生态系统。如果蚂蚱灭绝了,小鸟照样可以吃别的虫子,所以一个物种的灭绝并不一定会引发重大的灾难。

我们现在从专业一点的角度来看这个问题。我们用一种叫做食物网的有向图来描述生物之间的关系:

一个食物网有N个点,代表N种生物,如果生物x可以吃生物y,那么从y向x连一个有向边。

这个图没有环。

图中有一些点没有连出边,这些点代表的生物都是生产者,可以通过光合作用来生存; 而有连出边的点代表的都是消费者,它们必须通过吃其他生物来生存。

如果某个消费者的所有食物都灭绝了,它会跟着灭绝。

我们定义一个生物在食物网中的“灾难值”为,如果它突然灭绝,那么会跟着一起灭绝的生物的种数。

举个例子:在一个草场上,生物之间的关系是:

如 

如果小强和阿米巴把草原上所有的羊都给吓死了,那么狼会因为没有食物而灭绝,而小强和阿米巴可以通过吃牛、牛可以通过吃草来生存下去。所以,羊的灾难值是1。但是,如果草突然灭绝,那么整个草原上的5种生物都无法幸免,所以,草的灾难值是4。

给定一个食物网,你要求出每个生物的灾难值。

Solution

一个思路就是,如果i消失后会直接导致x的灭绝,则连一条i到x的边,最后求一遍前缀和就可以了。

可能会有一些初步的想法比如说直接拓扑+乱搞

但这样会存在一些后效性,不知道一种生物灭绝后会发生什么。

考虑如果有一种生物在某一种生物灭绝后就灭绝了,那么使那种生物灭绝的生物灭绝后也会使这种生物灭绝。

这是祖先与后代的关系,非常像树形结构。

构建一棵树,一个生物灭绝会使整颗子树树灭绝。

考虑一种生物有依赖的最近的点,从它能吃的所有生物都得死,那些生物能吃的也得死。

限制:同一时刻最多有一种生物灭绝。

那么顺着这个方向往上爬,最后到达一个点,那么这个点就是lca

Code

#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#define N 70003
using namespace std;
queue<int>q;
vector<int>son[N],ye[N];
int head[N],tot,n,sum[N],du[N],x,deep[N],p[N][];
struct zzj{
int n,to;
}e[N<<];
void dfs(int x){
sum[x]=;
for(int i=;i<son[x].size();++i){
int v=son[x][i];
dfs(v);
sum[x]+=sum[v];
}
}
inline void add(int u,int v){
e[++tot].n=head[u];
e[tot].to=v;
head[u]=tot;
}
inline int getlca(int a,int b){
if(deep[a]<deep[b])swap(a,b);
for(int i=;i>=;--i)if(deep[a]-(<<i)>=deep[b])a=p[a][i];
if(a==b)return a;
for(int i=;i>=;--i)if(p[a][i]!=p[b][i])a=p[a][i],b=p[b][i];
return p[a][];
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;++i){
while(){
scanf("%d",&x);if(!x)break;
add(x,i);du[i]++;
ye[i].push_back(x);
}
}
for(int i=;i<=n;++i)if(!du[i])q.push(i),add(,i),ye[i].push_back();
while(!q.empty()){
int u=q.front();q.pop();
int lca=ye[u][];
if(ye[u].size()!=)
for(int i=;i<ye[u].size();++i)lca=getlca(lca,ye[u][i]);
p[u][]=lca;deep[u]=deep[lca]+;
son[lca].push_back(u);
for(int i=;(<<i)<=deep[u];++i)p[u][i]=p[p[u][i-]][i-];
for(int i=head[u];i;i=e[i].n)if(!--du[e[i].to])q.push(e[i].to);
}
dfs();
for(int i=;i<=n;++i)printf("%d\n",sum[i]-);
return ;
}

[ZJOI2012]灾难(建图)的更多相关文章

  1. [洛谷P2597] [ZJOI2012]灾难

    洛谷题目链接:[ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引 ...

  2. P2597 [ZJOI2012]灾难——拓扑,倍增,LCA

    最近想学支配树,但是基础还是要打好了的: P2597 [ZJOI2012]灾难 这道题是根据食物链链接出一个有向图的关系,求一个物种的灭绝会连带几种物种的灭绝: 求得就是一个点能支配几个点: 如果一个 ...

  3. Luogu_2597_[ZJOI2012]灾难 倍增lca + 构造

    Luogu_2597_[ZJOI2012]灾难 倍增lca + 构造 题意: 我们用一种叫做食物网的有向图来描述生物之间的关系:一个食物网有N个点,代表N种生物,如果生物x可以吃生物y,那么从y向x连 ...

  4. 【BZOJ2815】[ZJOI2012]灾难 拓扑排序+LCA

    [BZOJ2815][ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从 ...

  5. 1321. [ZJOI2012] 灾难

    1321. [ZJOI2012] 灾难 ★★☆   输入文件:catas.in   输出文件:catas.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 阿米巴是小强的 ...

  6. 洛谷 P2597 [ZJOI2012]灾难 解题报告

    P2597 [ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发 ...

  7. P2597 [ZJOI2012]灾难(倍增LCA+拓扑排序)

    传送门 据大佬说这玩意儿好像叫灾难树还是灭绝树? 我们先按建图,设点$u$的食物有$x[1]...x[k]$,即在图中这些点都有一条指向它的边 以样例来说,对于人,羊和牛都有一条指向它的边,然而不管是 ...

  8. 【BZOJ-1570】BlueMary的旅行 分层建图 + 最大流

    1570: [JSOI2008]Blue Mary的旅行 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 388  Solved: 212[Submit ...

  9. 【BZOJ-4289】Tax 最短路 + 技巧建图

    4289: PA2012 Tax Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 168  Solved: 69[Submit][Status][Dis ...

  10. CF467D Fedor and Essay 建图DFS

      Codeforces Round #267 (Div. 2) CF#267D D - Fedor and Essay D. Fedor and Essay time limit per test ...

随机推荐

  1. js 通过url获取里面的参数值

    场景描述:当我们从一个页面要带有一两个值跳转到另一个页面,另一个页面要使用这些参数的时候,我们就需要通过js获取这些参数啦. 先贴上代码: function getQueryString(name) ...

  2. C#复习笔记(1)--C#开发的进化史

    前言:陆续使用C#已经有一年半的时间.中间做过一些应用,现在为了有更高的提升,决定重新看一遍C# in depth,并总结一些笔记. 一.从简单的数据类型开始 上面是C#1到C#4中的一部分演变历程. ...

  3. Javascript与C#对变量的处理方式

      先来看一下Javascript的情况(下面所说的基本类型和简单类型是一个意思): Javascript中变量会存在两种情况,一种是基本类型的,一共有五种,有null.Bollean.undefin ...

  4. Js中instanceof 的用法

    在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 “object”. ...

  5. SQL年月日格式化

    Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16

  6. 离线安装redis-cluster

    #离线安装redis-cluster https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.5.tar.gz #安装ruby .tar.gz cd rub ...

  7. java float double bigdecimal

    java 有 float,double,BigDecimal 三种,前两者会损失精度,最后一个是专门用于高精度计算的大数类型,但是会损失性能.如果用于金融场合且小数位并不多的时候,可以考虑 BigDe ...

  8. Centos安装python3

    安装环境 系统:阿里云服务器centos7.5系统 看见好多博客对centos安装python3的方式各不相同且都不完整,今天我来完整的演示安装python3 1.下载python3源码包 命令 wg ...

  9. h5 打开 app

    目前只支持在浏览器中打开,如果非浏览器,例如 微信 支付宝 钉钉 第三方 app 中会弹出下载页面 schemeUrl 为 和app 约定url   openApp() { /* 小希学生端 aoji ...

  10. Linux(Centos)下调整分区大小(以home和根分区为例)

      在安装新系统的时候,有时候没法预估或者说错误的划分了分区大小,常常会导致我们后面的操作出现极大地不方便,比如某个分区分的太小了,导致 软件安装的时候会报安装空间不够,这就很麻烦.在这里我就记录一下 ...