1 条题解
-
0
题目理解
我们有一个由 个齿轮和 条链条(边)组成的传动系统。
每条边 表示:- 如果 转 圈,那么 转 圈。
- 传动比 的符号表示方向:
- 正: 顺时针 → 顺时针
- 负: 顺时针 → 逆时针
换句话说,我们可以把齿轮的转动用一个实数 表示(可以是任意实数,表示转速或角度),对于每条边 ,应满足:
因为 转 圈对应 转 圈,所以 的另一种写法是 。
转化为图论问题
我们可以把每个齿轮 看作图的一个节点,链条是边。
对于边 ,我们得到约束:即:
如果我们设 (作为参考),那么我们可以用 BFS 或 DFS 遍历图,推导出所有 相对于 的值。
具体来说,从节点 到节点 的传递关系是:
已知 ,则 (注意这里 是正整数, 是非零整数,可能是负数)。
检查相容性
当我们遍历图时:
- 如果某个节点还没有被访问过,就按上述公式计算它的 值。
- 如果某个节点已经被访问过,就检查当前计算出的 值是否与之前的值一致(考虑浮点数精度问题,可以用分数形式避免精度误差)。
关键:由于 可能是负数,所以传动比可能是负的,表示转动方向相反。
在计算中,负号会导致 的正负号变化,表示转动方向。如果所有推导出的 值都满足所有边的约束,则输出
Yes,否则No。
实现细节
- 为了避免浮点数精度问题,我们可以用分数表示 :,即 ,并且保持最简分数形式(用 gcd 约分)。
- 符号由分子分母的符号共同决定。
- 检查一致性时,比较两个分数是否相等:。
- 注意负数情况。
算法步骤
- 读入 。
- 对每组数据:
- 建图(邻接表),存储 。
- 初始化 为 false, 为未定义。
- 从节点 1 开始 BFS/DFS,设 。
- 遍历过程中,对于边 :
- 如果 未访问,则 并约分。
- 如果 已访问,则检查 是否成立,不成立则返回
No。
- 如果所有边都相容,输出
Yes。
- 1
信息
- ID
- 4745
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者