有多少种方法可以使圆形中未着色的边缘着色

时间:2019-04-21 12:00:27

标签: algorithm disjoint-sets

给定一个圆上的n个点,并绘制了所有边缘(C(2,n))。这些边缘中的一些已经被染成蓝色或红色。您应该找出有多少种方法可以对静止的边缘进行着色,以使最终的图片具有以下条件:

  1. 所有边缘都是彩色的。
  2. 所有三角形的红色边缘均为0或2。

以下是一些示例:

示例1

输入:n = 3并且0的边缘已经着色。 输出= 4:因为我们可以将所有边缘涂成蓝色,或者只将其中之一涂成蓝色,其余的涂成红色。

示例2

输入n = 4,并且4个边缘已经着色

1 2蓝色

2 3蓝色

3 4红色

4 1红色

output = 1:因为着色剩余边缘的唯一方法如下:

1 3蓝色

2 4红色

约束:

  • 3 <= n <= 100,000
  • 时间限制:1秒
  • 内存限制:256 MB

实际上,我对这种问题的理想数据结构一无所知,我需要您的一些帮助

1 个答案:

答案 0 :(得分:3)

这是线性时间算法。

首先,请注意,有效着色的每个周期都包含偶数个红色边缘(我将其保留为练习)。给定生成树的颜色,仅存在一个有效的补全。唯一性很容易证明,因为不在树中的每个边缘的颜色由与之形成循环的树边缘的颜色的奇偶性决定。我将保留有效性作为另一项练习(时间紧迫,对不起)。

该算法是,使用深度优先搜索来查找给定边缘的生成林,并存储每个节点与其树根之间的边缘颜色奇偶校验。有了这些数据,我们就可以验证不在森林中的每个边缘的给定颜色。如果有任何错误,则着色为0。否则,将有2 ^(树数减去一)着色。