Codeforces Round #245 (Div. 1)A. Xor-tree(深搜)
2017-07-09 22:48
375 查看
传送门
The game is played on a tree having n nodes, numbered from 1 to n. Each node i has an initial value initi, which is either 0 or 1. The root of the tree is node 1.
One can perform several (possibly, zero) operations on the tree during the game. The only available type of operation is to pick a node x. Right after someone has picked node x, the value of node x flips, the values of sons of x remain the same, the values of sons of sons of xflips, the values of sons of sons of sons of x remain the same and so on.
The goal of the game is to get each node i to have value goali, which can also be only 0 or 1. You need to reach the goal of the game by using minimum number of operations.
The next line contains n integer numbers, the i-th of them corresponds to initi (initi is either 0 or 1). The following line also contains ninteger numbers, the i-th number corresponds to goali (goali is either 0 or 1).
给出一棵树,有n个节点,根为1,每个节点的值不是0就是1,每次可以翻转一个节点,翻转后,当前节点值翻转,儿子节点值不变,儿子的儿子翻转,依次类推,求最少翻转次数,使得每个节点的值与目标结果相同。
题解:
由于翻转一个节点,其子节点有的会改变,因此贪心的从根开始搜索,如果当前节点与目标不同,那么一定要翻转,因为只影响子节点,因此其父节点已经到达目标结果将不受影响。
Description
Iahub is very proud of his recent discovery, propagating trees. Right now, he invented a new tree, called xor-tree. After this new revolutionary discovery, he invented a game for kids which uses xor-trees.The game is played on a tree having n nodes, numbered from 1 to n. Each node i has an initial value initi, which is either 0 or 1. The root of the tree is node 1.
One can perform several (possibly, zero) operations on the tree during the game. The only available type of operation is to pick a node x. Right after someone has picked node x, the value of node x flips, the values of sons of x remain the same, the values of sons of sons of xflips, the values of sons of sons of sons of x remain the same and so on.
The goal of the game is to get each node i to have value goali, which can also be only 0 or 1. You need to reach the goal of the game by using minimum number of operations.
Input
The first line contains an integer n (1 ≤ n ≤ 105). Each of the next n - 1 lines contains two integers ui and vi (1 ≤ ui, vi ≤ n; ui ≠ vi) meaning there is an edge between nodes ui and vi.The next line contains n integer numbers, the i-th of them corresponds to initi (initi is either 0 or 1). The following line also contains ninteger numbers, the i-th number corresponds to goali (goali is either 0 or 1).
Output
In the first line output an integer number cnt, representing the minimal number of operations you perform. Each of the next cnt lines should contain an integer xi, representing that you pick a node xi. cells into walls so that all the remaining cells still formed a connected area. Help him.Sample Input
10 2 1 3 1 4 2 5 1 6 2 7 5 8 6 9 8 10 5 1 0 1 1 0 1 0 1 0 1 1 0 1 0 0 1 1 1 0 1
Sample Output
2 4 7
思路
题意:给出一棵树,有n个节点,根为1,每个节点的值不是0就是1,每次可以翻转一个节点,翻转后,当前节点值翻转,儿子节点值不变,儿子的儿子翻转,依次类推,求最少翻转次数,使得每个节点的值与目标结果相同。
题解:
由于翻转一个节点,其子节点有的会改变,因此贪心的从根开始搜索,如果当前节点与目标不同,那么一定要翻转,因为只影响子节点,因此其父节点已经到达目标结果将不受影响。
#include<bits/stdc++.h> using namespace std; const int maxn = 100005; int init[maxn],goal[maxn]; vector<int>ans,itv[maxn]; void dfs(int u,int fa,int odd,int even) { if (odd) init[u] ^= 1; if (init[u] != goal[u]) { odd ^= 1; ans.push_back(u); } int size = itv[u].size(); for (int i = 0;i < size;i++) { int v = itv[u][i]; if (fa == v) continue; //树是双向的,因此此处保证从根单向搜索 dfs(v,u,even,odd); } } int main() { int n,u,v; scanf("%d",&n); for (int i = 1;i < n;i++) { scanf("%d%d",&u,&v); itv[u].push_back(v); itv[v].push_back(u); } for (int i = 1;i <= n;i++) scanf("%d",&init[i]); for (int i = 1;i <= n;i++) scanf("%d",&goal[i]); dfs(1,1,0,0); int size = ans.size(); printf("%d\n",size); for (int i = 0;i < size;i++) printf("%d\n",ans[i]); return 0; }
相关文章推荐
- 【Codeforces Round #430 (Div. 2) C】Ilya And The Tree
- Codeforces Round #245 (Div. 2) A - Points and Segments (easy)
- Codeforces Round #396 (Div. 2) E. Mahmoud and a xor trip
- Codeforces Round #430 (Div. 2) C. Ilya And The Tree
- Codeforces Round #430 (Div. 2) C. Ilya And The Tree
- Codeforces Round #430 (Div. 2) C. Ilya And The Tree dfs+set
- Codeforces Round #169 (Div. 2) D. Little Girl and Maximum XOR(贪心,中等)
- Codeforces Round #430 (Div. 2) C. Ilya And The Tree
- Codeforces Round #339 (Div. 2) A - Link/Cut Tree
- Codeforces Round #405 Div. 1 B. Bear and Tree Jumps
- Codeforces Round #200 (Div. 1)D. Water Tree 【dfs序+线段树】
- Codeforces Round #397(Div. 1 + Div. 2 combined)E. Tree Folding【思维+Dfs】dalao们的解法真巧妙系列QAQ
- Codeforces Round 245 div1A&div2C Xor-tree dfs暴搜
- Codeforces Round #263 Div.1 B Appleman and Tree --树形DP【转】
- 【Codeforces Round 339 (Div 2)A】【水题 暴力】 LinkCut Tree 输出[l,r]范围内所有的k的幂数
- Codeforces Round #430 (Div. 2) C. Ilya And The Tree(dfs+最大公约数+因子+树)
- Codeforces Round #430 (Div. 2) 842C Ilya And The Tree(暴力)
- Codeforces Round #430 (Div. 2) C. Ilya And The Tree dfs+set
- Codeforces Round #430 (Div. 2) C. Ilya And The Tree dfs+set
- Codeforces Round #225 (Div. 2)---E. Propagating tree(时间戳+线段树)