在线性时间内找到 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,但是如果它就修改

  1. 遇到一个未着色的节点颜色它 c1 和它的子节点 c2,

  2. 遇到一个有颜色的节点,它的子节点颜色相反

  3. 如果它曾经试图“翻转”一个孩子的颜色,然后返回它不可能有 k 着色

这只是 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 个只有两种颜色。