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");
}
}