节点初始标志记在d1[]中,节点目标标志记在d2[]中,k1为1表示奇数节点标志改变,k2为1表示偶数节点标志改变.h表示节点深度
从根节点开始深搜,遇到节点j先通过k1, k2改变d1[j]的值,改变后若d1[j] != d2[j]则d1[j] ^= 1, 同时若该节点深度h为奇数,则该节点孩子中奇数深度的节点都要改变,所以k1 ^= 1,同理若h为偶数,则该节点孩子中偶数深度的节点都要改变,所以k2 ^= 1;
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
#define maxn 100005
#define MOD 1000000007
#define INF 1e9
using namespace std;
typedef long long ll;
vector<int> v[maxn], ans;
int d1[maxn], d2[maxn];
void dfs(int j, int f, int k1, int k2, int h){
if(k1 && (h&1)){
d1[j] ^= 1;
}
if(k2 && !(h&1)){
d1[j] ^= 1;
}
if(d1[j] != d2[j]){
if(h&1)
k1 ^= 1;
else
k2 ^= 1;
ans.push_back(j);
}
for(int i = 0; i < v[j].size(); i++){
int e = v[j][i];
if(e != f){
dfs(e, j, k1, k2, h + 1);
}
}
}
int main(){
// freopen("in.txt", "r", stdin);
int n, a, b;
scanf("%d", &n);
for(int i = 0; i < n - 1; i++){
scanf("%d%d", &a, &b);
v[a].push_back(b);
v[b].push_back(a);
}
for(int i = 1; i <= n; i++)
scanf("%d", d1+i);
for(int i = 1; i <= n; i++)
scanf("%d", d2+i);
dfs(1, -1, 0, 0, 0);
printf("%d\n", ans.size());
for(int i = 0; i < ans.size(); i++)
printf("%d\n", ans[i]);
return 0;
}