标签:
3 1 2 2 3 4 1 2 2 3 1 4
YES NOHintFor the second testcase, this tree is similiar with the given tree: 4 1 2 1 4 3 4
众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习,其中有一道是这样的: 对于一棵树T,令F(T,i)为点1到点i的最短距离(边长是1). 两棵树A和B是相似的当且仅当他们顶点数相同且对于任意的i都有F(A,i)=F(B,i). 两棵树A和B是不同的当且仅当他们定点数不同或者存在一个i使得以1号点为根的时候i在两棵树中的父亲不同。 一棵树A是特殊的当且仅当不存在一棵和它不同的树和它相似。 现在勇太想知道一棵树到底是不是特殊的。 当然,这个问题对于萌萌哒六花来说实在是太难了,你可以帮帮她吗?
数据组数不超过100组。每组数据的第一行一个整数n(2≤n≤1000)。 接下来n?1行。每行两个整数u,v(1≤u,v≤n),代表给定树上的一条边。
对于每一组数据,如果给定树是特殊的输出"YES"否则输出"NO"。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
#include<stdlib.h>
using namespace std;
int n,m;
int v[1010];
int map[1001][1001];
int main() {
while(scanf("%d",&n)!=EOF) {
memset(map,0,sizeof(map));
memset(v,0,sizeof(v));
int x,y;
int pf;
for(int i=0; i<n-1; i++) {
scanf("%d%d",&x,&y);
map[x][y] = 1;
map[y][x] = 1;
if(x == 1) {
pf = y;
} else if(y == 1) {
pf = x;
}
v[x]++;
v[y]++;
}
int rt = 0;
int cnt = 0,ans = 0,pt = 0;
for(int i=1; i<=n; i++) {
if(v[i] == 1) {
ans++;
} else if(v[i] == 2) {
cnt++;
}else{
rt = i;
pt++;
}
}
if(pt>=2){
printf("NO\n");
continue;
}
if(v[1]!=1) {
if(v[1] == n-1) {
printf("YES\n");
} else {
printf("NO\n");
}
}else{
if(cnt + ans +1 >= n && v[pf] <=2){
int flag = 0;
if(pt>0){
for(int i=1;i<=n;i++){
if(map[rt][i] == 1 && v[i]!=1){
flag++;
}
}
}
if(flag <= 1){
printf("YES\n");
}else{
printf("NO\n");
}
}else{
if(v[pf] == n-1){
printf("YES\n");
continue;
}
printf("NO\n");
}
}
}
return 0;
}版权声明:本文为博主原创文章,如有特殊需要请与博主联系 QQ : 793977586。
标签:
原文地址:http://blog.csdn.net/yeguxin/article/details/48105099