根据题意可以构造出来的特殊树有三种情况(全是以结点1为根节点),,第一种是一条直线,第二种是一条直线末尾开花,第三种是直接开花。如图所示。然后就可以知道对于每一个深度的点数为1,1,1,...,x,0,0,...。然后dfs一遍找一下就可以了。
#pragma warning(disable:4996)
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int n;
vector<int>g[1005];
vector<int>dis[1005];
bool vis[1005];
void dfs(int u, int d){
vis[u] = true;
dis[d].push_back(u);
for (int i = 0; i < g[u].size(); i++){
int v = g[u][i];
if (!vis[v]){
dfs(v, d + 1);
}
}
}
int main(){
while (~scanf("%d", &n)){
if (n == 1){
puts("YES");
continue;
}
for (int i = 0; i <= n; i++)g[i].clear(), dis[i].clear();
memset(vis, false, sizeof vis);
for (int i = 1; i < n; i++){
int u, v; scanf("%d %d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
bool ans = true;
dfs(1, 0);
int t = 0;
while ((int)dis[t].size() == 1)t++;
int num = dis[t].size();
if (num + t != n)ans = false;
if (ans)puts("YES");
else puts("NO");
}
return 0;
}
13万+

被折叠的 条评论
为什么被折叠?



