洛谷 P2597 灾难(支配树)

2024-01-08 14:09
文章标签 洛谷 灾难 支配 p2597

本文主要是介绍洛谷 P2597 灾难(支配树),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

阿米巴是小强的好朋友。

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

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

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

一个食物网有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 灾难(支配树)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/583715

相关文章

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

Oracle Data Guard:Oracle数据库的高可用性和灾难恢复解决方案

在企业级数据库管理中,确保数据的高可用性和在灾难情况下的快速恢复是至关重要的。Oracle Data Guard是Oracle公司提供的一种强大的数据库高可用性解决方案,它通过在主数据库和至少一个备用数据库之间提供实时或近实时的数据保护来实现这一目标。本文将详细介绍如何在Oracle数据库中部署和使用Oracle Data Guard,包括其基本概念、配置步骤、管理技巧和实际应用示例。 1. O

MySQL灾难恢复策略:构建稳健的备份与恢复机制

在现代企业环境中,数据的安全性和可靠性至关重要。灾难恢复计划(Disaster Recovery Plan, DRP)是确保在发生灾难性事件后,能够迅速恢复业务的关键策略。对于依赖MySQL数据库的系统,实现有效的灾难恢复计划尤为重要。本文将详细介绍如何在MySQL中实现灾难恢复计划,包括备份策略、恢复机制和最佳实践。 1. 灾难恢复计划的重要性 灾难恢复计划对于保护企业免受数据丢失和业务中断

洛谷P5490扫描线

0是最小的数字,将一个线段看成一个区间,对于一个矩形,从下扫到上,入边为1,而出边为-1,意思是将这个区间上的所有点加1(区间修改).把线段表示为Line[i],其中记录了l,r,h,tag,左右端点,高度,入边还是出边(1或-1) 那么每次区间修改后不为0的区间它的值可能是1,2,3或者是其它数字,这不好统计,可以将它转化一下,0是不是表示没有被覆盖过的地方,我们只要统计0的个数然后用总长减去

挤牛奶洛谷uasco

题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒。第二个农民在700秒开始,在 1200秒结束。第三个农民在1500秒开始2100秒结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300秒到1200秒),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200秒到1500秒)。

洛谷刷题(7)

P8738 [蓝桥杯 2020 国 C] 天干地支 题目描述 古代中国使用天干地支来记录当前的年份。 天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊 (wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)。 地支一共有十二个,分别为:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、

C++ 洛谷 哈希表(对应题库:哈希,hash)习题集及代码

马上就开学了,又一个卷季,不写点东西怎么行呢?辣么,我不准备写那些dalao们都懂得,熟练的,想来想去,最终还是写哈希表吧!提供讲解&题目&代码解析哦! 奉上题目链接: 洛谷题目 - 哈希,hash 1、哈希、哈希表(hash)简介 哈希(Hash)是一种将任意长度的输入映射为固定长度输出的算法。哈希函数的输出值称为哈希值或散列值。哈希函数具有以下特性: 确定性:对于相同的输入

北斗卫星通信终端:灾难中的重要支撑

精准定位,快速响应 在应急救援领域,北斗卫星通信终端的精准定位功能展现出了其无可替代的重要性。当灾害发生时,时间就是生命,快速而准确地定位受灾区域和受困人员的位置对于救援行动至关重要。北斗通信终端依托北斗卫星导航系统,能够在复杂环境下迅速捕获卫星信号,通过精密算法计算出准确位置信息。这不仅为救援队伍提供了清晰的行动指引,还大大缩短了搜救时间,提高了救援效率。在关键时刻,北斗卫星通信终端的精准定位