小红的红子树

简介: 小红的红子树

小红的红子树


小红拿到了—棵有根树,树的根节点为1号节点。

小红将一些节点染成了红色。她想知道有多少子树满足子树所有节点均为红色?


输入描述


第一行输入一个正整数n,代表节点的数量。

第二行输入一个长度为n的字符串,第i个字符为'R'代表第i个节点被染成红色,为'w'代表未被染色。

接下来的n ― 1行,每行输入两个正整数x和y,代表x和y有一条边连接。

1<n≤105

1 ≤x, y ≤n


出描述


输出一个整数,代表节点均为红色的子树数量。

示例1

输入输出示例仅供调试,后台判题数据─般不包含示例

输入

3

WRR

1 2

1 3

输出

2

说明

节点2和节点3均合法

思路

在这道题中,我们采用字典的这种方式去存储图,记录每一个点的相邻节点。但要注意一点的是在递归的时候不可以调用他的父节点,否则会发生栈溢出

深度搜索过程中,我们先判断当前节点是否为红,再将这一判断结果cur与递归结果做&&运算,(注:递归函数最后要返回cur值),这样就可以判断以当前节点为根节点的子树是否是否全部为红色,如果全为红,则将结果+1。这样我们就能得到本题的答案了。


1. n=int(input())
2. colors="0"+input()
3. dir1={}
4. for i in range(n-1):
5.     x,y=map(int,input().split(" "))
6. if x not in dir1: dir1[x]=[]
7. if y not in dir1: dir1[y]=[]
8.     dir1[x].append(y)
9.     dir1[y].append(x)
10. 
11. cnt=0
12. def dfs(node,pre):
13.     cur = (colors[node]=='R')
14. for nx in dir1[node]:
15. # nx点和pre点是相连的,我们不能去递归nx的父节点,否则产生深度溢出
16. if nx!=pre:
17.             cur = dfs(nx,node) and cur
18. global cnt
19. if cur:cnt+=1
20. return cur
21. 
22. 
23. dfs(1,-1)
24. print(cnt)
目录
相关文章
|
Python 容器
Python collections模块之Counter()详解
Python collections模块之Counter()详解
343 3
|
存储 负载均衡 Linux
|
设计模式 Java 机器人
SpringBoot3自动配置流程 SPI机制 核心注解 自定义starter
SpringBoot3自动配置流程 SPI机制 核心注解 自定义starter
|
5月前
|
存储 安全 NoSQL
【干货满满】API安全加固指南:签名防篡改+Access Token管理最佳实践
API 安全关乎业务与用户隐私,签名机制防篡改、伪造请求,Access Token 管理身份与权限。本文详解签名生成、Token 类型与管理、常见安全问题及最佳实践,助开发者构建安全可靠的 API 体系。
|
9月前
|
消息中间件
使用RabbitMQ如何保证消息不丢失 ?
消息从发送,到消费者接收,会经理多个过程 , 其中的每一步都可能导致消息丢失 针对这些问题,RabbitMQ分别给出了解决方案: ● 消息发送到交换机丢失 : 发布者确认机制publisher-confirm消息发送到交换机失败会向生产者返回ACK , 生产者通过回调接收发送结果 , 如果发送失败, 重新发送, 或者记录日志人工介入 ● 消息从交换机路由到队列丢失 : 发布者回执机制publisher-return消息从交换机路由到队列失败会向生产者返回失败原因 , 生产者通过回调接收回调结果 , 如果发送失败, 重新发送, 或者记录日志人工介入 ● 消息保存到队列中丢失 : MQ持久化(交
|
Java Spring
spring多线程实现+合理设置最大线程数和核心线程数
本文介绍了手动设置线程池时的最大线程数和核心线程数配置方法,建议根据CPU核数及程序类型(CPU密集型或IO密集型)来合理设定。对于IO密集型,核心线程数设为CPU核数的两倍;CPU密集型则设为CPU核数加一。此外,还讨论了`maxPoolSize`、`keepAliveTime`、`allowCoreThreadTimeout`和`queueCapacity`等参数的设置策略,以确保线程池高效稳定运行。
2079 11
spring多线程实现+合理设置最大线程数和核心线程数
|
12月前
|
消息中间件 存储 Kafka
被问到MQ消息已丢失,该如何处理?
在分布式系统中,消息中间件(如RabbitMQ、Kafka等)用于解耦生产者和消费者,确保数据传输的可靠性和顺序性。尽管有多种措施防止消息丢失,如消息持久化、手动确认机制和重试机制,但消息丢失仍可能发生。本文探讨了四种常见丢失场景及补救措施:1. 生产者发送消息失败;2. 消息在传输过程中丢失;3. 消息中间件内部丢失;4. 消费者未处理完消息前丢失。针对每种场景,提出了相应的解决方案,如消息重发、本地存储、日志记录、高可用配置、死信队列等,以确保系统的可靠性和稳定性。
632 0
|
Cloud Native Java Shell
开发者如何使用云原生多模数据库 Lindorm
【10月更文挑战第3天】开发者如何使用云原生多模数据库 Lindorm
633 4
|
安全 应用服务中间件 网络安全
检查一个网站是否启用了HTTPS
检查一个网站是否启用了HTTPS
2398 6
|
JavaScript
宝塔面板部署vue项目
宝塔面板部署vue项目
1644 0