阿米巴是小强的好朋友。

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

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

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

一个食物网有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][20];
struct zzj{int n,to;
}e[N<<3];
void dfs(int x){sum[x]=1;for(int i=0;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=19;i>=0;--i)if(deep[a]-(1<<i)>=deep[b])a=p[a][i];if(a==b)return a;for(int i=19;i>=0;--i)if(p[a][i]!=p[b][i])a=p[a][i],b=p[b][i];return p[a][0];
}
int main(){scanf("%d",&n);for(int i=1;i<=n;++i){while(1){scanf("%d",&x);if(!x)break;add(x,i);du[i]++;ye[i].push_back(x); } }for(int i=1;i<=n;++i)if(!du[i])q.push(i),add(0,i),ye[i].push_back(0);while(!q.empty()){int u=q.front();q.pop();int lca=ye[u][0];if(ye[u].size()!=1)for(int i=1;i<ye[u].size();++i)lca=getlca(lca,ye[u][i]);p[u][0]=lca;deep[u]=deep[lca]+1;son[lca].push_back(u);for(int i=1;(1<<i)<=deep[u];++i)p[u][i]=p[p[u][i-1]][i-1];for(int i=head[u];i;i=e[i].n)if(!--du[e[i].to])q.push(e[i].to); }dfs(0);for(int i=1;i<=n;++i)printf("%d\n",sum[i]-1);return 0;
}

转载于:https://www.cnblogs.com/ZH-comld/p/9752552.html

[ZJOI2012]灾难(建图)相关推荐

  1. BZOJ2815: [ZJOI2012]灾难

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

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

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

  3. RealSenseD435与ORB-SLAM2实现稠密建图

    一.RealSenseD435介绍 RealSenseD435是一款结构光相机,使用左右目相机和红外光实现测距.有效测距范围为0.2~10m 二.ORBSLAM2_with_pointcloud_ma ...

  4. ORB_SLAM2局部建图线程

      局部建图线程入口:可执行程序在初始化三个线程的时候,在System.cc的构造函数中进入局部建图线程 mpLocalMapper = new LocalMapping(mpMap, //指定使io ...

  5. POJ 2226 Muddy Fields 最小点覆盖+加建图(好题)

    题目链接 题目一看就是最小点覆盖,这道题与POJ - 3041 算是一类题,但是3041算是一道十分裸的,因为删除的是整行或者整列,所以图其实是现成的,但是本题的难点就在如何建图. 思路:首先还是尽量 ...

  6. 在多变环境中长期定位和建图的通用框架

    点云PCL免费知识星球,点云论文速读. 文章:A General Framework for Lifelong Localization and Mapping in Changing Environ ...

  7. TANDEM 基于深度多视图立体视觉的实时跟踪和稠密建图

    点云PCL免费知识星球,点云论文速读. 文章:TANDEM: Tracking and Dense Mapping in Real-time using Deep Multi-view Stereo ...

  8. 面向固态激光雷达和惯导的里程计和建图

    点云PCL免费知识星球,点云论文速读. 文章:Towards High-Performance Solid-State-LiDAR-Inertial Odometry and Mapping 作者:K ...

  9. F-LOAM:基于激光雷达的快速里程计和建图

    文章:F-LOAM : Fast LiDAR Odometry and Mapping 作者:Han Wang, Chen Wang, Chun-Lin Chen, and Lihua Xie git ...

  10. 【SLAM建图和导航仿真实例】(三)- 使用RTAB-MAP进行SLAM建图和导航

    引言 在这个-SLAM建图和导航仿真实例-项目中,主要分为三个部分,分别是 (一)模型构建 (二)根据已知地图进行定位和导航 (三)使用RTAB-MAP进行建图和导航 该项目的slam_bot已经上传 ...

最新文章

  1. Bootstrap中文本的样式
  2. excel筛选排序从小到大_数据横向排序和筛选,Ctrl+F搭配通配符quot;*quot;,只需简单四步完成...
  3. 计数在html怎么添加,在Go中显示html模板的计数
  4. Invalid host: lb://xxx_xxx
  5. OpenCV学习笔记(七):访问图像中像素的三类方法
  6. Asp.Net就业课之案例实践第二次课
  7. django自定义用户表
  8. 腾讯大湘网某处csrf(city.hn.qq.com)可投诉刷留言
  9. 操作系统03进程管理Process_Scheduling
  10. mysql忘记密码怎末版_mysql忘记密码怎么办
  11. Activiti - 新一代的开源BPM引擎
  12. 黑鱼资源网完整版织梦整站源码打包分享
  13. java实现从头部及尾部删除指定长度字符
  14. #华为云·寻找黑马程序员#【代码重构之路】使用Pattern的正确姿势
  15. android清理缓存功能吗,Android清理缓存功能实现
  16. 通过json动态创建控制器
  17. element-ui的input加单位符号
  18. 快速开发框架介绍-懂你的RUOYI
  19. android 8 推送到tv,手机如何推送文件到电视,三款TV投屏软件亲测推荐!
  20. 如何关闭mysql secure_file_priv

热门文章

  1. 【iOS】Touch Up Inside 和 Touch Up Outside 的区别
  2. [Java] 蓝桥杯ADV-83 算法提高 寻找三位数
  3. 蓝桥杯BASIC-28 基础练习 Huffuman树
  4. matlab与r语言运算速度,R语言与matlab循环时间对比
  5. 查看centos硬件配置
  6. golang导入包的理解
  7. weblogic的安装、目录结构、启动
  8. git命令之git rebase 的用法
  9. WCF BasicHttpBinding 安全解析(3)默认安全设置(IIS宿主)
  10. 为什么软件预算经常会改变和膨胀