标签:
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