1 条题解
-
0
C. 年度蚂蚁集会 详细题解
题目核心理解
一棵 个节点的树上,每个节点初始有 只蚂蚁。 你可以下达指令:让节点 的蚂蚁移向相邻节点 。 规则:蚂蚁只在 的蚂蚁数 的蚂蚁数时移动。 可以无限次操作,问是否能把所有蚂蚁集中到同一个节点。
核心思路
1. 关键性质
- 非空节点始终构成一个连通块,只有当前连通块的叶子节点可以移动。
- 每次只能把蚂蚁从叶子移向内部,且必须满足叶子大小 父亲大小。
- 如果某一轮最小的叶子无法移入父亲,则所有更大的叶子更无法移动,直接无解。
2. 模拟规则
- 维护当前树的叶子节点(度数为 的点)。
- 每次取出一个叶子 ,找到其唯一相邻的非空父亲 。
- 若 ,则无法合并,输出
NO。 - 否则将 合并到 ,删掉叶子 ,父亲度数减一。
- 重复直到只剩一个节点,输出
YES。
3. 最优性依据
只有从小到大合并叶子才能保证每一步都合法。 任何合法的最终集合点,一定可以通过这种叶子收缩方式得到。
算法流程
- 读入树,建邻接表,初始化每个点大小 ,度数为实际度数。
- 把所有初始叶子(度数 )加入队列。
- 每次取出队首叶子 ,标记已删。
- 找到 未被删除的邻居 (父亲)。
- 若 ,输出
NO并结束。 - 否则 , 度数减一;若度数变为 则入队。
- 直到只剩一个节点,输出
YES。
公式与复杂度分析
合并条件:
每次合并后:
复杂度
- 建图、初始化:
- BFS 收缩过程:每个点进出队列一次,
- 总时间复杂度:
可轻松处理 的数据,在 秒时限内稳定通过。
- 1
信息
- ID
- 6584
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者