题解 | #小G有一个大树#

小G有一个大树

https://ac.nowcoder.com/acm/problem/15033

对于某个节点来说,如果该节点删除那么就会形成他儿子节点全部独立成一棵树和他父亲节点的那棵树。
那么状态转移方程:dp[i] = (total-f[i], (所有儿子节点最大的那个)f[u])
对于求某个节点下有多少节点来说是一个简答树状dp问题。
f[i] = 1+(所有儿子节点)f[u];
//对于某个节点来说,如果该节点删除那么就会形成他儿子节点全部独立成一棵树和他父亲节点的那棵树。
//那么状态转移方程:dp[i] = (total-f[i], (所有儿子节点最大的那个)f[u])
//对于求某个节点下有多少节点来说是一个简答树状dp问题。
//f[i] = 1+(所有儿子节点)f[i];
#include <bits/stdc++.h>

using namespace std;
const int maxn = 1000+10;
int n;
vector<int> v[maxn];
int f[maxn];
int dp[maxn];
int ans = 0, ans_val=0x3f3f3f3f;

int dfs(int x, int fa) {
    int len = v[x].size();
    int son_max = 0;
    f[x] = 1;
    for (int i=0;i<len;i++) {
        int next = v[x][i];
        if (next == fa) continue;
        int num = dfs(next, x);
        f[x] += num;
        son_max = max(son_max, num);
    }
    int t = max(n-f[x], son_max);
    dp[x] = t;
    return f[x];
}

int main() {
    cin>>n;
    int x, y;
    memset(dp, 127, sizeof(dp));
    for (int i=1;i<n;i++) {
        cin>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    dfs(1, 0);
    for (int i=1;i<n;i++) {
        if (ans_val>dp[i]) {
            ans_val = dp[i];
            ans = i;
        }
    }
    cout<<ans<<" "<<ans_val;
    return 0;
}


全部评论

相关推荐

no_work_no_life:深圳,充电宝,盲猜anker
点赞 评论 收藏
分享
野猪不是猪🐗:现在的环境就是这样,供远大于求。 以前卡学历,现在最高学历不够卡了,还要卡第一学历。 还是不够筛,于是还要求得有实习、不能有gap等等... 可能这个岗位总共就一个hc,筛到最后还是有十几个人满足这些要求。他们都非常优秀,各方面都很棒。 那没办法了,看那个顺眼选哪个呗。 很残酷,也很现实
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务