标签:
题目要求的那个特殊的树其实就是一条直链,然后在链的末端接上若干节点,类似于扫帚的形状。
也就是最后一层的节点下方没有子节点,倒数第二层的节点下方可以有若干子节点,其余节点均只有一个子节点。
用dfs搜索每一层的节点进行判断即可。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <set> #include <queue> #include <vector> #define LL long long using namespace std; const int maxN = 1005; struct Edge { int to, next; //int val; }edge[maxN*2]; int head[maxN], cnt; void addEdge(int u, int v) { edge[cnt].to = v; edge[cnt].next = head[u]; head[u] = cnt; cnt++; } void initEdge() { memset(head, -1, sizeof(head)); cnt = 0; } int n; bool vis[maxN]; int maxDepth; bool flag; bool input() { if (scanf("%d", &n) == EOF) return false; initEdge(); memset(vis, false, sizeof(vis)); maxDepth = 0; flag = true; int u, v; for (int i = 1; i < n; ++i) { scanf("%d%d", &u, &v); addEdge(u, v); addEdge(v, u); } return true; } void dfs(int now, int depth) { if (flag == false) return; int cnt = 0; vis[now] = true; for (int i = head[now]; i != -1; i = edge[i].next) { if (vis[edge[i].to]) continue; dfs(edge[i].to, depth+1); cnt++; } if (cnt == 0) return; maxDepth = max(maxDepth, depth); if (depth != maxDepth && cnt != 1) flag = false; } void work() { dfs(1, 0); if (flag) printf("YES\n"); else printf("NO\n"); } int main() { //freopen("test.in", "r", stdin); while (input()) { work(); } return 0; }
ACM学习历程—HDU5423 Rikka with Tree(搜索)
标签:
原文地址:http://www.cnblogs.com/andyqsmart/p/4791165.html