UVA

https://odzkskevi.qnssl.com/8b9d8bb43198f28efe782047d56ab361?v=1501987995

 1 /*
 2 题目大意:一个树上有n个节点,n-1条边,每个节点上有一个颜色
 3 现要求选取其中一个节点为根,要求子树的颜色相同,问是否能够达到要求。
 4 题目分析:两个有共同边的节点,如果颜色不一样,那么肯定会有其中一个点选为根
 5 记录这个点的度+1,总的counts+1,最后遍历数组,找出度和counts的大小相同的点并输出
 6 如果没有即是不能达到要求。
 7 */
 8 #include <cstdio>
 9 #include <cstring>
10 using namespace std;
11 int const maxn =  100005;
12 struct node{
13     int u,v;
14 }a[maxn];
15 int c[maxn];
16 int degree[maxn];
17 int main(){
18     int n;
19     scanf("%d",&n);
20     for(int i=1;i<n;i++)
21         scanf("%d%d",&a[i].u ,&a[i].v );
22     for(int i=1;i<=n;i++) scanf("%d",&c[i]);
23     int counts=0;
24     memset(degree,0,sizeof(degree));
25     for(int i=1;i<n;i++){
26         if(c[a[i].u]!=c[a[i].v]){
27             counts++;
28             degree[a[i].u ]++;
29             degree[a[i].v ]++;
30         }
31     }
32     for(int i=1;i<=n;i++){
33         if(counts==degree[i]){
34             printf("YES
%d
",i);
35             return 0;
36         }
37     }
38     printf("NO
");
39     return 0;
40 }
41 /////Runtime error on test
42 #include <iostream>
43 #include <stdio.h>
44 #include <string.h>
45 using namespace std;
46 const int maxn=100005;
47 struct node {
48     int u,v;
49 }a[maxn];
50 int c[maxn],degree[maxn];
51 int main(){
52     int n;
53     scanf("%d",&n);
54     for(int i=1;i<n;i++)
55         scanf("%d%d",&a[i].u,&a[i].v);
56     for(int i=1;i<=n;i++)
57     scanf("%d",&c[i]);
58     int ans=0;
59     memset(degree,0,sizeof(degree));
60     for(int i=1;i<n;i++){
61         if(c[a[i].u]!=c[a[i].v]){
62             ans++;
63             degree[a[i].u]++;
64             degree[a[i].v]++;
65         }
66     }
67     for(int i=1;i<=n;i++){
68         if(ans==degree[i]){
69         printf("YES
%d
",i);
70         return 0;
71         }
72     }
73         printf("NO
");
74         return 0;
75 }
原文地址:https://www.cnblogs.com/z-712/p/7324410.html