題目大意:删除一點之後剩下所有子樹的節點個數不超過n/2,問有幾個這樣的點。
不存在輸出NONE。。。但是這題樣例有問題,并不存在NONE的情況。
AC代碼:
#include <cstring>
#include <cstdio>
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 20100;
struct node{
int v, w, next;
}edge[maxn];
int head[maxn];
int dp[maxn];
int num[maxn];
int tot;
void addedge(int u, int v, int w) {
edge[tot].v = v;
edge[tot].w = w;
edge[tot].next = head[u];
head[u] = tot ++;
}
void DFS1(int u, int fa) {
for (int i = head[u]; i != -1; i = edge[i].next) {
int v = edge[i].v;
if(v == fa) continue;
DFS1(v, u);
num[u] += num[v];
}
}
void DFS2(int u, int fa) {
for (int i = head[u]; i != -1; i = edge[i].next) {
int v = edge[i].v;
if(v == fa) {
dp[u] = max(dp[u], num[1] - num[u]);
}
else {
dp[u] = max(dp[u], num[v]);
DFS2(v, u);
}
}
}
int main() {
int n;
while(~scanf("%d", &n)) {
memset(head, -1, sizeof(head));
tot = 0;
num[1] = 1;
for (int i = 2; i <= n; i++) {
int u, v;
num[i] = 1;
scanf("%d%d", &u, &v);
addedge(u, v, 1);
addedge(v, u, 1);
}
// memset(num, 0, sizeof(num));
memset(dp, 0, sizeof(dp));
DFS1(1, 1);
// for (int i = 1; i <= n; i++) {
// cout << num[i] << endl;
// }
DFS2(1, 1);
int min_ = n/2;
int flag = 0;
for (int i = 1; i <= n; i++) {
// cout << "***" << dp[i] << "***" << endl;
if(dp[i] <= min_) {
printf("%d\n", i);
flag = 1;
}
}
if(!flag) {
printf("NONE\n");
}
}
return 0;
}