POJ 2378 Tree Cutting (DFS)

题目链接:http://poj.org/problem?id=2378

一棵树,去掉一个点剩下的每棵子树节点数不超过n/2。问有哪些这样的点,并按照顺序输出。

dfs回溯即可。

 1 //#pragma comment(linker, "/STACK:102400000, 102400000")
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <vector>
 8 #include <cmath>
 9 #include <ctime>
10 #include <list>
11 #include <set>
12 #include <map>
13 using namespace std;
14 typedef long long LL;
15 typedef pair <int, int> P;
16 const int N = 1e4 + 5;
17 vector <int> ans;
18 struct Edge {
19     int next, to;
20 }edge[N << 1];
21 int d[N], head[N], cnt, n;
22 
23 inline void add(int u, int v) {
24     edge[cnt].next = head[u];
25     edge[cnt].to = v;
26     head[u] = cnt++;
27 }
28 
29 void dfs(int u, int p) {
30     bool ok = true;
31     d[u] = 1;
32     for(int i = head[u]; ~i; i = edge[i].next) {
33         int v = edge[i].to;
34         if(v == p)
35             continue;
36         dfs(v, u);
37         if(d[v] * 2 > n)
38             ok = false;
39         d[u] += d[v];
40     }
41     if((n - d[u]) * 2 > n)
42         ok = false;
43     if(ok)
44         ans.push_back(u);
45 }
46 
47 int main()
48 {
49     while(~scanf("%d", &n)) {
50         int u, v;
51         memset(head, -1, sizeof(head));
52         cnt = 0;
53         ans.clear();
54         for(int i = 1; i < n; ++i) {
55             scanf("%d %d", &u, &v);
56             add(u, v);
57             add(v, u);
58         }
59         dfs(1, -1);
60         sort(ans.begin(), ans.end());
61         for(int i = 0; i < ans.size(); ++i) {
62             printf("%d\n", ans[i]);
63         }
64     }
65     return 0;
66 }

 

posted @ 2016-09-01 21:34  Recoder  阅读(161)  评论(0编辑  收藏  举报