小红的红子树

简介: 小红的红子树

小红的红子树


小红拿到了—棵有根树,树的根节点为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)
目录
相关文章
|
2月前
lanqiao OJ 664 方格填数
lanqiao OJ 664 方格填数
13 1
|
7月前
小红的白色字符串
小红的白色字符串
35 0
【Leetcode -404.左子叶之和 -543.二叉树的直径】
【Leetcode -404.左子叶之和 -543.二叉树的直径】
60 0
洛谷P1162 填涂颜色——广搜
洛谷P1162 填涂颜色——广搜
79 0
【创作赢红包】< 二叉树OJ题(一) >单值二叉树&&二叉树的最大深度&&翻转二叉树&&相同的树&&对称二叉树
【创作赢红包】< 二叉树OJ题(一) >单值二叉树&&二叉树的最大深度&&翻转二叉树&&相同的树&&对称二叉树
熄灯问题 && 飞行员兄弟 && 翻棋子
熄灯问题 && 飞行员兄弟 && 翻棋子
|
存储 程序员 分布式数据库
小朋友看了都会的二叉树,你确定不来看看吗?1
小朋友看了都会的二叉树,你确定不来看看吗?
94 0
小朋友看了都会的二叉树,你确定不来看看吗?1
小朋友看了都会的二叉树,你确定不来看看吗?2
小朋友看了都会的二叉树,你确定不来看看吗?
66 0
小朋友看了都会的二叉树,你确定不来看看吗?2
|
存储
【CCCC】L2-030 冰岛人 (25分) 模拟题,二叉树链式存储,从底部向上
【CCCC】L2-030 冰岛人 (25分) 模拟题,二叉树链式存储,从底部向上
198 0
AcWing 747. 数组的左上半部分
AcWing 747. 数组的左上半部分
82 0
AcWing 747. 数组的左上半部分