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 }

 

posted @ 2017-02-12 11:43  Flowersea  阅读(162)  评论(0编辑  收藏  举报