CF763A Timofey and a tree(思维)

现在有一个无根树,我们加入把其中的一个结点看做根,那么这个根上的每一个子树中都不能有一个结点的颜色不同,如果都相同,那么此时就是合法的,我们输出YES及这个结点。如果不存这样的根,那么输出NO。

思路:
因为如果一个树的子树中只要有一个点与这个子树中的其他点颜色不同,那么这样主角就会生气,所以这样只有一种情况是合法的,就是当这个无根树的某个结点作为根时,其连接到的结点与根的颜色不一样的个数等于所有结点与这个根颜色不同的结点个数。(有点绕,耐心理解-)。因为子树中一旦出现某个结点与其他结点颜色不同就会造成整个树不合法。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int a[maxn], b[maxn], cnt[maxn], col[maxn];
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n - 1; i++) {
		cin >> a[i] >> b[i];
	}
	for (int i = 1; i <= n; i++) {
		cin >> col[i];
	}
	int res = 0;
	for (int i = 1; i <= n - 1; i++) {
		if (col[a[i]] != col[b[i]]) { //相邻节点的颜色不同()
			cnt[a[i]]++; cnt[b[i]]++; res++;
		}
	}
	for (int i = 1; i <= n; i++) {
		if (cnt[i] == res) {
			cout << "YES" << endl;
			cout << i << endl;
			return 0;
		}
	}
	cout << "NO" << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值