cf1189d1

题目链接

题目大意

有一种操作: 选择两个叶子结点,把两个点的最短路径上的权值同时加或减任意一个数
给出一棵树,问你是否可以经过操作把这棵树上的权值变成任意数

刚开始我的想法:在每一个非叶子节点上必须直接相连一个叶子结点(错的)
比如这样:

因为我感觉只有这样才可以满足条件
正当我准备大大大大大大大大写特写的时候,
tg来了,这道题我写过,特判度数为二的点就行了。

嗯??? 我怎么想不到 好吧 是我菜了

我的那个思路是错了 大错特错了
明显错了。。

代码:

#include<stdio.h>
#include<algorithm>
using namespace std;
const int maxn = 1e5+5;

int du[maxn]; 


int main()
{
   
	int n;
	scanf("%d",&n);
	for (int i = 1; i < n; i ++)
	{
   
		int x,y;
		scanf("%d%d",&x,&y);
		du[x] ++ ;
		du[y] ++ ;
	}
	int f = 1;
	for (int i = 1;i <= n; i ++ )
	{
   
		if(du[i] == 2)
		{
   
			f = 0;
			break;
		}
	}
	if(f )
	{
   
		printf("YES\n");
	}
	else
	{
   
		printf("NO\n");
	}
}