Codeforces 902 B.Coloring a Tree 简单的树

题意

给出n(1e4)个点的树:n-1个数表示节点的父节点,然后n个数(不等于0)表示节点应该涂的颜色.
初始时刻颜色全为0,对一个点涂色会使它的所有子节点涂上相同颜色,问至少需要涂几次颜色.

解法

首先一定是先染父节点,再选择是否需要染子节点.
根节点一定需要染,其余节点是否需要染色取决于它与它的父节点最终颜色是否相同.
遍历每个节点,如果最终颜色与父节点不同,则需要染色的次数+1.

注意

题目中给的树结构表示方法实际为一个拓扑序,不需要自行再建立树结构,可以直接遍历进行与父节点有关的操作.
建议将树节点从1开始编号,简单直观.

代码

/* LittleFall : Hello! */
#include 
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分钟

你可能感兴趣的:(题解)