Tree Cutting POJ - 2378 ·树形DP + 计数

题目大意:删除一点之后剩下所有子树的节点个数不超过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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章