比赛 20120419s 评测结果 AAAWWWWAWW
题目名称 国王的遗产 最终得分 40
用户昵称 王者自由 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-04-19 10:53:46
显示代码纯文本
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 30000 + 10, K = 100 + 10;
int n, k, x, y;
int T, R, S, e, g, r;
int c[N], t[N], p[N];
bool l[N];
vector<int> G[N];
void DFS(int u, int fa) {
    t[u] = 1;
    c[u] = u;
    int v;
    for(int i=0; v=G[u][i], i<G[u].size(); i++)
        if(v != fa && !l[v]) {
            DFS(v, p[v] = u);
            t[u] += t[v];
            c[u] = min(c[u], c[v]);
            if((t[v] <= g / 2 && t[v] > T) || (t[v] == T && c[v] < S)) {
                T = t[v];
                S = c[v];
                R = v;
            }
        }
}
void DFS2(int u, int fa) {
    int num;
    int v;
    for(int i=0; v=G[u][i], i<G[u].size(); i++)
        if(v != fa && !l[v]) {
            DFS2(v, u);
            num = g - t[v];
            if((num <= g / 2 && num > T) || (num == T && R > 0)) {
                T = num;
                S = c[v];
                R = -v;
            }
        }
}
void Update1(int u, int fa) {
    l[u] = 1;
    int v;
    for(int i=0; v=G[u][i], i<G[u].size(); i++)
        if(v != fa && !l[v])
            Update1(v, u);
}
void Update2(int u, int fa) {
    l[u] = 1;
    int v;
    for(int i=0; v=G[u][i], i<G[u].size(); i++)
        if(v != fa && !l[v] && v != -R)
            Update2(v, u);
}
int main() {
    freopen("legacy.in", "r", stdin);
    freopen("legacy.out", "w", stdout);
    scanf("%d %d", &n, &k);
    for(int i=1; i<=n; i++) {
        scanf("%d %d", &x, &y);
        G[x].push_back(y);
        G[y].push_back(x);
    }
    for(int i=1; i<=n; i++)
        sort(G[i].begin(), G[i].end());
    r = 1, g = n;
    for(int i=1; i<k; i++) {
        while(l[r]) r++;
        T = 0, p[r] = 0;
        DFS(r, 0);
        DFS2(r, 0);
        if(R > 0)
            Update1(R, p[R]);
        else
            Update2(r, 0);
        printf("%d ", T);
        g -= T;
    }
    printf("%d\n", g);
    return 0;
}