標籤:
http://codeforces.com/problemset/problem/430/C
題意:在一棵上有n個節點,有n-1條邊,在每一個節點上有一個值0或1,然後給你一個目標樹,讓你選擇節點,然後把節點的值翻轉,它的孫子節點跟著翻轉,依次類推。。。問經過最少次數可以使這棵樹變成目標樹。
思路:利用異或的性質,任何數和0異或為它本身,從根節點dfs就行。
1 #include <cstdio> 2 #include <vector> 3 #include <cstring> 4 #include <algorithm> 5 #define maxn 200100 6 using namespace std; 7 8 int n,k,x; 9 int a[maxn];10 int b[maxn];11 int num[maxn];12 bool vis[maxn];13 vector<int>g[maxn];14 int ans[maxn];15 int cnt;16 void dfs(int c,int x,int y)17 {18 if((a[c]^x)!=b[c])19 {20 ans[cnt++]=c;21 x=!x;22 }23 for(int i=0; i<(int)g[c].size(); i++)24 {25 int v=g[c][i];26 if(!vis[v])27 {28 vis[v]=true;29 dfs(v,y,x);30 }31 }32 }33 34 int main()35 {36 scanf("%d",&n);37 for(int i=1; i<n; i++)38 {39 int u,v;40 scanf("%d%d",&u,&v);41 g[u].push_back(v);42 g[v].push_back(u);43 }44 for(int i=1; i<=n; i++)45 {46 scanf("%d",&a[i]);47 }48 for(int i=1; i<=n; i++)49 {50 scanf("%d",&b[i]);51 }52 vis[1]=true;53 dfs(1,0,0);54 printf("%d\n",cnt);55 for(int i=0; i<cnt; i++)56 {57 printf("%d\n",ans[i]);58 }59 return 0;60 }View Code
codeforces C. Xor-tree