题目:https://vjudge.net/contest/392676#problem/H 题意比较费解
题意:给n个点;给出n-1 个pi,即当前节点(坐标)的父节点,构成一棵树;给出n个颜色,将对应坐标涂成相应的颜色;问最少需要几次;(涂抹规则可以看样例)
提炼:遍历每个节点,如果当前节点和它的父节点颜色不同,则代表需要重新涂色
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
int a[N],b[N];
int main(){
int n; cin>>n;
int cnt=0;
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]]){
cnt++;
}
}
cout<<cnt;
}
下面是dfs()
#include<bits/stdc++.h>
const int N=1e4+5;
const int inf=0x3f3f3f3f;
int n,p[N],c[N],curr[N];
vector<int> x[N];
int dfs(int node){
int val=0;
if(c[node]!=curr[node]){
curr[node]=c[node];
val++;
}
for(int i=0;i<x[node].size();i++){
curr[x[node][i]]=curr[node]; //给子节点赋颜色
val+=dfs(x[node][i]);
}
return val;
}
int main(){
int n; cin>>n;
for(int i=2;i<=n;i++){
cin>>p[i];
x[p[i]].push_back(i);
}
for(int i=1;i<=n;i++){
cin>>c[i];
}
int ans=dfs(1);
cout<<ans;
}