algorithm - 有多少种方法可以给圆形中未着色的边缘着色
问题描述
给定圆上的 n 个点并绘制所有边 (C(2,n))。其中一些边缘已经用蓝色或红色着色。您应该了解有多少种方法可以为静止边缘着色,以便获得具有以下条件的最终图片:
- 所有边缘都是彩色的。
- 所有三角形都有 0 或 2 条红色边。
这里有些例子:
示例 1
输入:n = 3 和 0 条边已经着色。output = 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
实际上我不知道此类问题的理想数据结构,我需要你的帮助以获得一些线索
解决方案
这是一个线性时间算法。
首先,观察有效着色的每个循环都包含偶数个红色边缘(我将把它留作练习)。给定生成树的颜色,只存在一个有效补全。唯一性很容易证明,因为不在树中的每条边的颜色由与它形成循环的树边的颜色的奇偶性决定。我将把有效性作为另一个练习(时间紧迫,抱歉)。
该算法是,使用深度优先搜索来查找给定边缘的生成森林,存储每个节点与其树的根之间的边缘颜色的奇偶性。给定这些数据,我们可以验证不在森林中的每条边的给定颜色。如果有任何错误,则有 0 个着色。否则,有 2^(树数减一)着色。
推荐阅读
- mysql - 在 node.js 上使用合并和续集
- java - 以以下方式迭代地图有什么区别?
- neural-network - 不受句子顺序影响的文本文档的神经网络
- python - Python:如何使用日期从父页面获取 URL?
- java - 防止反馈循环/Catch22 Java 递归
- shell - bash/zsh - rc 文件中带有文件参数的当前目录(点 `.`)命令
- java - 我需要关于下一次递归的解释(我是初学者)
- azure - 资源“00000003-0000-0000-c000-000000000000”上不存在的“EduRoster.Read.All”
- r - 如何使用ggplot 2将一个变量绘制为条形图
- wordpress - 如何为路由添加异常路由 - laravel