[ZJOI2012]灾难(建图)
阿米巴是小强的好朋友。
阿米巴和小强在草原上捉蚂蚱。小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难。
学过生物的阿米巴告诉小强,草原是一个极其稳定的生态系统。如果蚂蚱灭绝了,小鸟照样可以吃别的虫子,所以一个物种的灭绝并不一定会引发重大的灾难。
我们现在从专业一点的角度来看这个问题。我们用一种叫做食物网的有向图来描述生物之间的关系:
一个食物网有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]灾难(建图)相关推荐
- BZOJ2815: [ZJOI2012]灾难
BZOJ2815: [ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝, ...
- P2597 [ZJOI2012]灾难(倍增LCA+拓扑排序)
传送门 据大佬说这玩意儿好像叫灾难树还是灭绝树? 我们先按建图,设点$u$的食物有$x[1]...x[k]$,即在图中这些点都有一条指向它的边 以样例来说,对于人,羊和牛都有一条指向它的边,然而不管是 ...
- RealSenseD435与ORB-SLAM2实现稠密建图
一.RealSenseD435介绍 RealSenseD435是一款结构光相机,使用左右目相机和红外光实现测距.有效测距范围为0.2~10m 二.ORBSLAM2_with_pointcloud_ma ...
- ORB_SLAM2局部建图线程
局部建图线程入口:可执行程序在初始化三个线程的时候,在System.cc的构造函数中进入局部建图线程 mpLocalMapper = new LocalMapping(mpMap, //指定使io ...
- POJ 2226 Muddy Fields 最小点覆盖+加建图(好题)
题目链接 题目一看就是最小点覆盖,这道题与POJ - 3041 算是一类题,但是3041算是一道十分裸的,因为删除的是整行或者整列,所以图其实是现成的,但是本题的难点就在如何建图. 思路:首先还是尽量 ...
- 在多变环境中长期定位和建图的通用框架
点云PCL免费知识星球,点云论文速读. 文章:A General Framework for Lifelong Localization and Mapping in Changing Environ ...
- TANDEM 基于深度多视图立体视觉的实时跟踪和稠密建图
点云PCL免费知识星球,点云论文速读. 文章:TANDEM: Tracking and Dense Mapping in Real-time using Deep Multi-view Stereo ...
- 面向固态激光雷达和惯导的里程计和建图
点云PCL免费知识星球,点云论文速读. 文章:Towards High-Performance Solid-State-LiDAR-Inertial Odometry and Mapping 作者:K ...
- F-LOAM:基于激光雷达的快速里程计和建图
文章:F-LOAM : Fast LiDAR Odometry and Mapping 作者:Han Wang, Chen Wang, Chun-Lin Chen, and Lihua Xie git ...
- 【SLAM建图和导航仿真实例】(三)- 使用RTAB-MAP进行SLAM建图和导航
引言 在这个-SLAM建图和导航仿真实例-项目中,主要分为三个部分,分别是 (一)模型构建 (二)根据已知地图进行定位和导航 (三)使用RTAB-MAP进行建图和导航 该项目的slam_bot已经上传 ...
最新文章
- Bootstrap中文本的样式
- excel筛选排序从小到大_数据横向排序和筛选,Ctrl+F搭配通配符quot;*quot;,只需简单四步完成...
- 计数在html怎么添加,在Go中显示html模板的计数
- Invalid host: lb://xxx_xxx
- OpenCV学习笔记(七):访问图像中像素的三类方法
- Asp.Net就业课之案例实践第二次课
- django自定义用户表
- 腾讯大湘网某处csrf(city.hn.qq.com)可投诉刷留言
- 操作系统03进程管理Process_Scheduling
- mysql忘记密码怎末版_mysql忘记密码怎么办
- Activiti - 新一代的开源BPM引擎
- 黑鱼资源网完整版织梦整站源码打包分享
- java实现从头部及尾部删除指定长度字符
- #华为云·寻找黑马程序员#【代码重构之路】使用Pattern的正确姿势
- android清理缓存功能吗,Android清理缓存功能实现
- 通过json动态创建控制器
- element-ui的input加单位符号
- 快速开发框架介绍-懂你的RUOYI
- android 8 推送到tv,手机如何推送文件到电视,三款TV投屏软件亲测推荐!
- 如何关闭mysql secure_file_priv