题目意思: 给你n个点,代表这一棵树有n个节点。第二行内容是建树的关系,(开始我一直看不明白是如何建树的,后来翻译给队友,他帮我指了)
从第二个节点开始的节点和父节点(上一个节点)相连,
例如:1 2 2 1 5
代表:节点2和节点1相连,节点3和节点2相连,节点4和节点2相连,节点5和节点1相连,节点6和节点5相连。
第三行内容是需要将各个点涂成的颜色,给这个树涂色,有这么一条原则就是给某一节点涂色,以其为根节点的子树也将变为相应的颜色,我们可以成为一种颜料的溢出,问你最终需要
最少需要涂多少次颜色就可以满足题目要求。
解题思路:我们可以这样来思考,因为最后需要使所有的点都涂成要求的颜色,一定是按照从根节点到叶子节点遍历的涂色,但所有的点都遍历会造成浪费,我们只需要找出需要涂的点即可,
那么哪些点需要涂呢?我们发现只有那些最后要求的其父亲节点和本身不同色的需要涂色,因为需要向下改变自身颜色,那么只需要统计这样点的个数即可。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 int pr[10010]; 6 int a[10010]; 7 int main() 8 { 9 int n,i,counts; 10 scanf("%d",&n); 11 counts=0; 12 pr[0]=1; 13 pr[1]=1;///根节点的父亲节点是自身 14 for(i=2;i<=n;i++) 15 { 16 scanf("%d",&pr[i]); 17 } 18 for(i=1;i<=n;i++) 19 { 20 scanf("%d",&a[i]); 21 } 22 for(i=1;i<=n;i++) 23 { 24 if(a[i]!=a[pr[i]])///父亲节点和自身颜色不同 25 { 26 counts++; 27 } 28 } 29 printf("%d ",counts); 30 return 0; 31 }