1 条题解
-
0
问题分析
1.操作的性质 设一个开关连接灯泡 和 。
如果 ,那么按下开关后:
若 ,则变为
若 ,则变为
如果 ,那么操作无效。
这个条件看起来比经典的“开关翻转连接的灯泡”要复杂,因为操作依赖于当前状态。
2.关键转化 我们定义一个新的状态表示: 设 表示灯泡 的目标状态与初始状态是否不同(即是否需要翻转)。 初始时所有 。
考虑一个开关 在什么条件下能改变状态:
在原问题中,开关 有效的条件是 。 在翻转表示下,,。
开关操作的效果是:如果 ,那么可以同时翻转 和 (即 ,)。
图论建模
建立图 :
顶点: 个灯泡
边:每个开关 是一条边,权值为
方程 是图上的异或约束。
求解方法
对每个连通分量:
任选一个顶点 ,设 (或其他值)
通过 DFS/BFS 确定其他顶点的 值
如果出现矛盾(同一个顶点被赋予两个不同的值),则该连通分量无解 → 整个系统无解?等等,这里要小心
实际上,这个方程组总是有解的,因为我们可以选择 (),然后推导出其他变量。 每个连通分量会产生 种可能的 赋值方案吗?
仔细分析:
对于连通分量,一旦确定某个顶点的值,其他顶点值唯一确定。 所以每个连通分量有 种可能的赋值(对应选择 或 )。
但是这些赋值不一定都对应有效的状态翻转吗? 在本题中,所有赋值都是有效的,因为方程 就是根据开关操作的可执行条件推导出来的,满足方程就意味着操作可以执行。
自由度和答案
设图有 个连通分量。 每个连通分量的 变量有 种取值方案,所以总方案数 = 。
但是注意: 变量的每种取值对应唯一的目标状态(目标状态 = 初始状态 ⊕ ),所以可达状态数 = 。
特别地,初始状态本身对应 ,包含在 中。
- 1
信息
- ID
- 4400
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者