codeforces C. Xor-tree

來源:互聯網
上載者:User

標籤:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.