如何解决在线性时间内找到 k-着色k = 2/3图
问题:
给定一个图 G = (V,E) G 的 k 着色是顶点的标签,颜色为 c_1,c_2,...,c_k 使得对于每条边 (u,v) 的颜色u 与 v 的颜色不同。
A.给出一个线性时间算法,为一棵树找到一个 2-coloring。
B.考虑用两种颜色为树着色,以便获得最大数量的 c_1 节点。证明您的 (a) 部分中的算法(可能稍作修改)可用于解决此问题。准确点。
C.显示一个树 T 的示例,它最多可以有 j 个节点在 2 着色中着色为 c_1,但 T 可以在 3 着色中具有 j' > j 个着色为 c_1 的节点。尝试找出这种树 T 的最小例子。
D.给出一个线性时间动态规划算法,该算法为树创建 3 着色,使得最大节点数为 c_1。证明你的回答是正确的。
我有什么:
A 和 B 部分看起来很简单,但我在 C 和 D 上挣扎
A.这看起来很简单,运行DFS,但是如果它就修改它
这只是 DFS,所以将运行在 O(V+E)
编辑:由于这是一棵树,您可以在随机节点上调用 BFS,在 BFS 中交替颜色
B.由于这是一个二元第一选择(即 c1 或 c2)并且所有选择都遵循第一选择,我们可以简单地计算哪个更优着色第一个节点 c1 或 c2。我们可以通过在上述算法中添加一个计数器来计算 c1 节点的数量。从c1开始运行算法两次,然后从c2开始,比较两者之间c1节点的数量,然后选择c1节点较多的图
C.摆弄了一段时间,找不到一个,更不用说最小的了
编辑:王冰作品描述的1-3、2-3、3-4、4-5、4-6
D.不知道。我假设您将不得不使用修改后的 DFS 让它以线性方式运行,但除此之外我非常不确定。我可以想出蛮力的方法,但没有什么是线性运行的。
编辑:仍然对此感到困惑
解决方法
c:1-3、2-3、3-4、4-5,4-6。这棵树可以有 3 个双色的每个颜色的节点。但是,如果将节点 #3/#4 着色为其他两种颜色(三色),则可以有 4 个相同颜色的节点。通过检查所有可能性,您应该很容易证明没有更小的答案。
D:只需遍历树,例如DFS。每个节点需要保留所有 3 种颜色的 c_1 计数。当您处理第一个节点时,这将是 (1,0) - 相当容易计数。将节点添加到访问中后,尝试所有 3 种颜色,每种颜色将与连接节点的 2 种颜色兼容,从中选择较大的一种,以此类推,以构建当前节点的 3 个值。
E=[(1,3),(2,(3,4),(4,5),6)]
V={v:set() for e in E for v in e}
[None if V[e[0]].add(e[1]) else V[e[1]].add(e[0]) for e in E]
serialized={}
def traverse(c):
serialized[c]=V[c]
[traverse(n) for n in V[c] if n not in serialized]
traverse(E[0][0])
visited=set()
for k,v in reversed(serialized.items()):
filtered=v.intersection(visited)
visited.add(k)
m=[1+sum(max([V[child][1],V[child][2]]) for child in filtered),sum(max([V[child][0],V[child][1]]) for child in filtered)]
V[k]=m
print(max(V[k]))
,
A.选择任何顶点并给它上色 c1。从那里运行 BFS。奇数距离处的所有东西都得到 c2,偶数距离处的所有东西都得到 c1。
B.只有两种颜色,它们的区别仅在于将 c1 替换为 c2。如果需要,运行 (A) 并交换。
C.想象一下 A 和 B 是相连的,a 有许多其他邻居,它们都是叶子,B 也是如此。 使用 2 种颜色,您可以获得比 A 或 B 大的一种给定颜色,但使用三种颜色您可以得到两种A 和 B 不同的颜色,并将所有的叶子涂成相同的颜色。叶子的数量取决于 j 和 j' 输入。如果我们要找到 j 和 j' 的最小值,则给出每两片叶子。然后你可以有四个 c1 叶子,A c2 和 B c3,而不是最多只有 3 个只有两种颜色。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。