题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5423
Mean:
判断是否是一棵特殊树。
特殊树的定义如中文翻译
analyse:
eample1:
3
1 2 1----2----3
2 3
1 2 1----2----3
2 3
F(A,1)=0;
F(A,2)=1;
F(A,3)=2;
变化成另一棵树的话(但并不相似):
3
1 3 1----3----2
2 3
F(B,1)=0;
F(B,2)=2;
A(B,3)=1;
无论怎样变化都做不到F(A,i)==F(B,i)相同。
eample2
4
1 2 1---2---3
2 3 |
1 4 4
1 2 1---2---3
2 3 |
1 4 4
F(A,1)=0;
F(A,2)=1;
F(A,3)=2;
F(A,4)=3;
4
1 2 1---4---3
1 4 |
3 4 2
F(B,1)=0;
F(B,2)=1;
F(B,3)=2;
F(B,4)=3;
容易发现一棵树是特殊的,当且仅当非叶子的结点个数不多于1个。
那么DFS一遍求出每一层结点个数判断即可。
#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include<vector> #include<queue> #include<algorithm> using namespace std; typedef long long LL; const int maxn=1009; const int INF=0x3f3f3f3f; const int mod=2009; int maps[maxn][maxn]; int dist[maxn]; int cnt[maxn]; int n; void DFS(int u, int d) { dist[u]=d; for(int i=1; i<=n; i++) { if(maps[u][i]&&dist[i]==-1) DFS(i, d+1); } } int main() { while(~scanf("%d", &n)) { int u, v; memset(maps, 0, sizeof(maps)); for(int i=1; i<n; i++) { scanf("%d %d", &u, &v); maps[u][v]=maps[v][u]=1; } memset(dist, -1, sizeof(dist)); memset(cnt, 0, sizeof(cnt)); DFS(1,0); for(int i=1; i<=n; i++) cnt[dist[i]]++; int index=0, j; for(j=1; j<n; j++) { if(cnt[j]) { if(cnt[j]<=cnt[index]&&cnt[index]>1) break; else index=j; } } if(j==n) puts("YES"); else puts("NO"); } return 0; }