题目地址:http://codeforces.com/contest/764/problem/C
思路:对于所有两点颜色不同的边,一定为其中一点与根节点相连(若不相连则子树颜色不同),所有两点颜色不同的边组成的图,其边总数为tot,则根节点即为度为tot的点(与所有颜色不同的点相连)。
#include<set>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+50;
struct Node
{
int u,v;
};
int n;
int d[maxn];
int col[maxn];
Node e[maxn];
int main()
{
scanf("%d",&n);
for(int i=1; i<n; i++)
scanf("%d%d",&e[i].u,&e[i].v);
for(int i=1; i<=n; i++)
scanf("%d",&col[i]);
int tot=0;
for(int i=1; i<n; i++)
{
if(col[e[i].u]!=col[e[i].v])
{
tot++;
d[e[i].u]++,d[e[i].v]++;
}
}
for(int i=1;i<=n;i++)
{
if(d[i]==tot)
{
printf("YES\n%d\n",i);
return 0;
}
}
printf("NO\n");
return 0;
}