题目描述

阿米巴是小强的好朋友。

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

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

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

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

这个图没有环。

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

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

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

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

如 

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

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

输入格式

输入文件 catas.in 的第一行是一个正整数 N,表示生物的种数。生物从 1 标

号到 N。

接下来 N 行,每行描述了一个生物可以吃的其他生物的列表,格式为用空

格隔开的若干个数字,每个数字表示一种生物的标号,最后一个数字是 0 表示列

表的结束。

输出格式

输出文件catas.out包含N行,每行一个整数,表示每个生物的灾难值。

输入输出样例
输入 #1 复制
5
0
1 0
1 0
2 3 0
2 0
输出 #1 复制
4
1
0
0
0
说明/提示
【样例说明】样例输入描述了题目描述中举的例子。【数据规模】对50%的数据,N ≤ 10000。对100%的数据,1 ≤ N ≤ 65534。输入文件的大小不超过1M。保证输入的食物网没有环。

支配树板子

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>using namespace std;
const int maxn = 65540;
int n, top, js;
int f[maxn][16],du[maxn], p[maxn], st[maxn], ans[maxn], dep[maxn];
vector<int>g[maxn],rg[maxn],tr[maxn];queue<int>q;
void topsort()   //把拓扑序装到p数组里面;
{for(int i = 1; i <= n; i++){if(!du[i]){g[0].push_back(i);rg[i].push_back(0);++du[i];}}q.push(0);while(!q.empty()){int x = q.front();p[++js] = x;q.pop();for(int i = 0; i < g[x].size(); i++){int v = g[x][i];du[v]--;if(!du[v])q.push(v);}}
}int lca(int u, int v)
{if(dep[u]<dep[v])swap(u,v);for(int i = 15; i >= 0; i--){if(dep[f[u][i]]>=dep[v])u = f[u][i];}if(u==v) return u;for(int i = 15; i>= 0; i--){if(f[u][i]!=f[v][i]){u = f[u][i];v = f[v][i];}}return f[u][0];
}void dfs(int u)
{ans[u] = 1;for(int i = 0; i < tr[u].size(); i++){int v = tr[u][i];dfs(v);ans[u]+=ans[v];}
}int main()
{scanf("%d", &n);for(int i = 1; i <= n; i++){int x;scanf("%d", &x);js = 0;while(x){g[x].push_back(i);rg[i].push_back(x);du[i]++;scanf("%d", &x);}}topsort();dep[0] = 0;for(int i = 2; i <= n+1; i++){
//        cout << i<<" * "<<p[i]<<endl;int x = p[i];int y = rg[x][0];for(int j = 0; j < rg[x].size();j++) y = lca(y,rg[x][j]);
//        cout <<"**"<<endl;tr[y].push_back(x);dep[x] = dep[y]+1;f[x][0] = y;for(int j = 1; j <= 15; j++){f[x][j] = f[f[x][j-1]][j-1];}}dfs(0);for(int i = 1; i <= n; i++)printf("%d\n", ans[i]-1);return 0;
}

洛谷 P2597 灾难(支配树)相关推荐

  1. Bzoj4016/洛谷P2993 [FJOI2014] 最短路径树问题(最短路径问题+长链剖分/点分治)

    题面 Bzoj 洛谷 题解 首先把最短路径树建出来(用\(Dijkstra\),没试过\(SPFA\)\(\leftarrow\)它死了),然后问题就变成了一个关于深度的问题,可以用长链剖分做,所以我 ...

  2. 专题·树链剖分【including 洛谷·【模板】树链剖分

    初见安~~~终于学会了树剖~~~ [兴奋]当初机房的大佬在学树剖的时候我反复强调过:"学树剖没有前途的!!!" 恩.真香. 一.重链与重儿子 所谓树剖--树链剖分,就是赋予一个链的 ...

  3. [bzoj2815] [洛谷P2597] [ZJOI2012] 灾难

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

  4. 洛谷 p3372 模板-线段树 1

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个 ...

  5. 洛谷 - P1198 - 最大数 - 线段树

    https://www.luogu.org/problemnew/show/P1198 要问区间最大值,肯定是要用线段树的,不能用树状数组.(因为没有逆元?但是题目求的是最后一段,可以改成类似前缀和啊 ...

  6. 【洛谷 3372】线段树 1

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入格式 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含 ...

  7. 洛谷P4114 Qtree1(树链剖分+线段树)

    传送门 LCT秒天秒地用什么树剖 这题可以算是树剖的比较裸的题目了 把每一条边的权值下放到他两边的点中深度较深的那个 然后直接用树剖+线段树带进去乱搞就可以了 1 //minamoto 2 #incl ...

  8. 洛谷 - P2617 Dynamic Rankings(树状数组套主席树)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列 a,再给出 m 次操作: Q l r k:返回区间 [ l , r ] 内第 k 大的数 C x y:令 a[ x ] = y 题目分析:其实 ...

  9. 【洛谷 1873】砍树

    题目描述 伐木工人米尔科需要砍倒M米长的木材.这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机,可以像野火一样砍倒森林.不过,米尔科只被允许砍倒单行树木. 米尔科的伐木机工作过程如下:米尔 ...

最新文章

  1. 如何在.NET中创建服务型组件
  2. DCMTK:可加载的DICOM数据字典中的字典条目
  3. HNCU 1746: 算法4-1,4-3:定位子串
  4. linux系统用户组管理
  5. hadoop上lzop的安装
  6. python包实际怎么使用_Python--模块与包
  7. url传参(中文乱码)值得注意的地方
  8. xml的应用与dtd约束
  9. 无码系列-6 数据缓存设计经验谈
  10. Android 学习笔记【基础扫盲篇】
  11. [转载] [python标准库]math——数学函数
  12. Lesson 07 for Plotting in R for Biologists
  13. vue 高德地图使用热力图
  14. 2021亚太杯数学建模C题全网成品论文+代码+详细思路+数据+参考文献
  15. 用栈实现的算术表达式的运算
  16. 3t硬盘 xp_华硕Disk Unlocker
  17. 微信公众平台与微信公众平台的区别与联系
  18. detach的简易用法
  19. 专业知识整理系列--遥感入门
  20. 计算机无法访问,您可能没有权限使用网络资源.请与这台服务器的管理员联系的解决办

热门文章

  1. Python制作属于自己的有声小说
  2. 结合grabcut和inpaint,实现人像去除
  3. 游戏 - PS4 海绵宝宝: 争霸比基尼海滩重注版
  4. 亓官劼的2020年度总结
  5. JUC之striped64
  6. 【面试题】有一个数组,每隔两个数删掉一个数,到末尾又循环到开头继续进行,求最后一个被删除的数的原始下标位置
  7. 删除主键索引 oracle,删除主键无法删除对应索引问题 drop constraint
  8. 开发一款系统软件大概需要多少钱呢
  9. 【matplotlib教程】绘图样式,文本线型、轴刻度
  10. 骨传导耳机优缺点有哪些?骨传导耳机科普与推荐