题意
给出n(1e4)个点的树:n-1个数表示节点的父节点,然后n个数(不等于0)表示节点应该涂的颜色.
初始时刻颜色全为0,对一个点涂色会使它的所有子节点涂上相同颜色,问至少需要涂几次颜色.
解法
首先一定是先染父节点,再选择是否需要染子节点.
根节点一定需要染,其余节点是否需要染色取决于它与它的父节点最终颜色是否相同.
遍历每个节点,如果最终颜色与父节点不同,则需要染色的次数+1.
注意
题目中给的树结构表示方法实际为一个拓扑序,不需要自行再建立树结构,可以直接遍历进行与父节点有关的操作.
建议将树节点从1开始编号,简单直观.
代码
/* LittleFall : Hello! */
#include <bits/stdc++.h>
using namespace std;
int father[10016],color[10016];
int main(void)
{
int n;
scanf("%d",&n);
for(int i=2;i<=n;i++)
scanf("%d",&father[i]);
for(int i=1;i<=n;i++)
scanf("%d",&color[i]);
int ans=1;
for(int i=2;i<=n;i++)
if(color[i]!=color[father[i]])
ans++;
printf("%d\n",ans );
return 0;
}
代码用时:2分钟