1 条题解

  • 0
    @ 2026-2-17 22:01:03
    #include<bits/stdc++.h>
    using namespace std;
    
    // [1] 全局常量与变量定义
    const int MAXN = 1e5 + 10; // 适配题目n≤1e5的规模
    vector<int> g[MAXN];        // 邻接表,存储树的无向边
    int n;                       // 树的总结点数
    int sz[MAXN];                // sz[u]:以u为根的子树的总结点数
    int min_max_block = INT_MAX; // 记录所有结点删除后,最大连通块的最小值(即题目答案)
    
    // [2] DFS核心函数:计算子树大小,同时求解目标值
    // 参数说明:u=当前遍历的结点,fa=当前结点的父结点(避免往回走)
    void dfs(int u, int fa)
    {
        sz[u] = 1; // 子树初始大小为当前结点自身
        int max_block = 0; // 记录删除当前结点u后,最大的连通块大小
    
        // 遍历当前结点的所有邻接结点
        for(int v : g[u])
        {
            if(v == fa) continue; // 跳过父结点,防止死循环
            dfs(v, u);            // 递归计算子结点的子树大小
            sz[u] += sz[v];       // 累加子树大小到当前结点
            max_block = max(max_block, sz[v]); // 更新子树方向的最大连通块
        }
    
        // 加上父节点方向的连通块大小,得到删除u后的最大连通块
        max_block = max(max_block, n - sz[u]);
    
        // 更新全局最小值:找到所有结点中最小的max_block
        min_max_block = min(min_max_block, max_block);
    }
    
    int main()
    {
        // 关闭cin同步,加速输入,避免n=1e5时输入超时
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        // [3] 输入总结点数
        cin >> n;
        // [4] 输入n-1条无向边,构建邻接表
        for(int i = 1; i <= n-1; i++)
        {
            int x, y;
            cin >> x >> y;
            g[x].push_back(y);
            g[y].push_back(x); // 无向边双向存储
        }
    
        // [5] 从结点1开始DFS,根节点的父结点设为-1(不存在的结点)
        dfs(1, -1);
    
        // [6] 输出题目要求的结果
        cout << min_max_block << endl;
    
        return 0;
    }
    
    • 1

    信息

    ID
    1084
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者