Codeforces Round #395 (Div. 2) C. Timofey and a tree 树
C. Timofey and a tree
链接:
http://codeforces.com/contest/764/problem/C
题意:
一棵树中各个节点被染上了c[i]颜色;
让你在一棵树中随便选一个节点作为根节点,然后把整棵树抬起来;
问你是否存在一个根节点,这个根节点的直系儿子节点的子树里面的所有节点的颜色都一样;
题解:
要理解树的构造以及特点,每棵树的子树是不相连的,就是几个分块了,所以这个点要想使所有子树都是一种颜色,其实就是这个点所连边包括所有端点不同色的边,因为还有端点不同色的边没有与根节点相连,那么肯定某一颗子树含有这个边,也就是这颗子树并没有同色,因为子树之间没有边相连,所以只能在某一科子树里。所以做法就是记录所有不同色的边的个数,记录每个点连接的不同色的边的个数,如果某个两者相等说明这个点连着所有不同色的边,也就是符合题意了
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 const int maxn = 2e5 + 5; 6 int u[maxn], v[maxn], cnt[maxn], c[maxn], sum = 0; 7 int main() 8 { 9 int n; 10 cin >> n; 11 for (int i = 1; i < n; i++) 12 cin >> u[i] >> v[i]; 13 for (int i = 1; i <= n; i++) 14 cin >> c[i]; 15 for (int i = 1; i < n; i++) 16 { 17 if (c[u[i]] != c[v[i]]) 18 sum++, cnt[u[i]]++, cnt[v[i]]++; 19 20 } 21 for (int i = 1; i <= n; i++) 22 { 23 if (cnt[i] == sum) 24 { 25 cout << "YES\n" << i << endl; 26 return 0; 27 } 28 } 29 cout << "NO" << endl; 30 return 0; 31 }