ACM区域赛「徐州2019」M. Kill the tree

题意很简单,类似于找树的重心,代码如下.

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 200005
#define rep(n) for(int i=1;i<=n;i++)
#define rall(x) for(int i=(x).size()-1;i>=0;i--)
#define all(x) for(int i=0;i<(x).size();i++)
int size[MAXN];
int son[MAXN];
vector<int>e[MAXN];
int ans[MAXN];
int pre[MAXN];
void dfs(int rt,int fa)
{
    size[rt]=1;
    for(auto it:e[rt])
    {
        if(it!=fa)
        {
            pre[it]=rt;
            dfs(it,rt);
            size[rt]+=size[it];
            if(size[it]>size[son[rt]])
                son[rt]=it;
        }
    }
    if (size[son[rt]] < size[rt] - size[son[rt]])
        ans[rt]=rt;
    else if(size[son[rt]]==size[rt] - size[son[rt]])
        ans[rt]=son[rt];
    else
    {
        int now=ans[son[rt]];
        while(size[now]<(size[rt]+1)/2)
        {
            now=pre[now];
        }
        ans[rt]=now;
    }
}
int main() {
    int m;
    scanf("%d",&m);
    for(int i=1;i<m;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        e[u].push_back(v);
        e[v].push_back(u);
    }
    dfs(1,0);
    for(int i=1;i<=m;i++) {
        vector<int>put;
        put.push_back(ans[i]);
        if(size[ans[i]]*2==size[i])
            put.push_back(pre[ans[i]]);
        sort(put.begin(),put.end());
        for (int j = 0; j < put.size(); j++) {
            if(j)putchar(' ');
            printf("%d", put[j]);
        }
        printf("\n");
    }
}
展开阅读全文

-

01-01
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值