题意:给一棵n个节点的树,要求每个节点有对应的颜色,颜色上法:根节点和其所有子节点为同一颜色,求需要上颜色最少次数
思路:用dfs对所有子节点遍历,遍历之前先将子节点颜色涂成与当前相同颜色,如果当前颜色与对应颜色不同则涂色,并增加操作数,需要用vis数组判断子节点重复问题
#include<bits/stdc++.h>
using namespace std;
int n, c[10005], nowc[10005], vis[10005];
vector<int> child[10005];
int dfs(int cur)
{
int k = 0;
vis[cur] = 1;
if (nowc[cur] != c[cur]) {
nowc[cur] = c[cur];
k++;
}
for (int i = 0; i < child[cur].size(); i++) {
if (!vis[child[cur][i]]) {
nowc[child[cur][i]] = nowc[cur];
k += dfs(child[cur][i]);
}
}
return k;
}
int main()
{
while (cin >> n) {
memset(c, 0, sizeof(c));
memset(nowc, 0, sizeof(nowc));
memset(vis, 0, sizeof(vis));
for (int i = 2; i <= n; i++) {
int k;
cin >> k;
child[k].push_back(i);
}
for (int i = 1; i <= n; i++) {
cin >> c[i];
}
cout << dfs(1) << endl;
}
return 0;
}