ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

F.孤独(牛客小白月赛39)

2021-10-23 20:03:28  阅读:236  来源: 互联网

标签:sz 39 int 连通 maxv2 牛客 为根 小白月赛 dp


F.孤独(牛客小白月赛39)

题意:

给定一棵树,寻找一个路径,将断掉所有与这个路径上的点相连的边,使得剩下的最大连通块的大小最小
在这里插入图片描述

题解:

这题有点印象,感觉做过,至少这个方法肯定遇到过
设dp[u]表示以u为根的子树里,删除以u为起点的路径后最大连通块的大小最小是多少
我们贪心的去进行转移,它一定是选择最大儿子去走路径去删除,因为只有这样才会影响到最大连通块(最大儿子意味着最大连通块)

所以转移方程为:dp[u]=max(sz[v2],dp[v1]),最大连通块要么是以v1为根删除得到的最大连通块,要么就是子树v2
在这里插入图片描述
但是这个dp[i]并不是答案
因为路径并不是只从u开始,有可能路径的两端都在一个子树里
在这里插入图片描述
此时,路径一定是以u为根的子树里,,因为有两个方向的路径,因此一定走最大儿子和次大儿子。此时连通块有这几部分:以v1为根的子树里删除后剩下的连通块,以v2为根的子树里删除后剩下的连通块,第三大叶子节点v3,还有就是除了以u为根的子树,之外所有点组成一个连通块,这四部分取max,答案我们取min
此时答案就是:ans=min(ans,max(n-sz[u],dp[v1],dp[v2],sz[v3]))
在这里插入图片描述

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=3e6;
vector<int> v[maxn];
int n;
int dp[maxn];
int sz[maxn];
int res= 1e9;
void dfs(int u, int fa)
{
    sz[u]= 1;
    dp[u]= 1;
    int maxv= 0;
    int maxv2= 0;
    int maxv3= 0;
    int id= 0; //大儿子
    int id2= 0; //次大儿子
    for (auto j : v[u]) {
        if (j == fa)
            continue;
        dfs(j, u);
        sz[u]+= sz[j];
        if (sz[j] > maxv) {
            maxv3= maxv2;
            maxv2= maxv;
            maxv= sz[j];
            id2= id;
            id= j;
        }
        else if (sz[j] > maxv2) {
            id2= j;
            maxv3= maxv2;
            maxv2= sz[j];
        }
        else if (sz[j] > maxv3) {
            maxv3= sz[j];
        }
    }
    int ans= 0;
    dp[u]= max(maxv2, dp[id]);
    res= min(res, max({n - sz[u], maxv3, dp[id], dp[id2]}));
}
int main()
{
    cin >> n;
    for (int i= 0; i < n - 1; i++) {
        int a, b;
        scanf("%d%d", &a, &b);
        v[a].push_back(b);
        v[b].push_back(a);
    }
    dfs(1, 0);
    cout << res << endl;
    return 0;
}

标签:sz,39,int,连通,maxv2,牛客,为根,小白月赛,dp
来源: https://blog.csdn.net/qq_35975367/article/details/120925183

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有