1 条题解
-
0
#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
- 上传者