Color a Tree

A - Coloring a Tree

题解:

先理解题意,给你n个点,代表这一棵树有n个节点。第二行内容是建树的关系。

1
2
例如:1 2 2 1 5
代表:节点2和节点1相连,节点3和节点2相连,节点4和节点2相连,节点5和节点1相连,节点6和节点5相连。
1
第三行内容是需要将各个点涂成的颜色,给这个树涂色,有这么一条原则就是给某一节点涂色,以其为根节点的子树也将变为相应的颜色。

思路:

1
2
3
因为最后需要使所有的点都涂成要求的颜色,一定是按照从根节点到叶子节点遍历的涂色,但所有的点都遍历会造成浪费,我们只需要找出需要涂的点即可,
那么哪些点需要涂呢?我们发现只有那些最后要求的其父亲节点和本身不同色的需要涂色,因为需要向下改变自身颜色,那么只需要统计这样点的个数即可。
最怕dfs因为dfs永远学不会,最后发现也可以直接循环搜索,反正都告诉你子节点父节点关系了,那就循环找呗。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>

using namespace std;
int a[10000];
int b[10000];
int main()
{
int n,count=0;
cin>>n;
a[0]=1;a[1]=1;
for(int i=2;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
for(int i=1;i<=n;i++)
{
if(b[i]!=b[a[i]])
{
count++;
}
}
cout<<count+1<<endl;
return 0;
}