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;
}

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