【问题标题】:Finding k-coloring (with k = 2/3) graph in linear time在线性时间内找到 k 着色(k = 2/3)图
【发布时间】:2021-06-09 01:35:23
【问题描述】:

问题:

给定一个图 G = (V,E),G 的 k 着色是用颜色 c_1, c_2, ..., c_k 对顶点进行标记,使得对于每条边 (u,v) 的颜色u 和 v 的颜色不同。

A.给出一个线性时间算法,为一棵树找到 2 种颜色。

B.考虑用两种颜色为树着色,以便拥有最大数量的节点颜色 c_1。证明您在 (a) 部分中的算法(可能稍作修改)可用于解决此问题。准确一点。

C.显示树 T 的示例,它最多可以有 j 个节点在 2 色中着色为 c_1,但 T 可以有 j' > j 个节点在 3 色中着色为 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.一直在摆弄这个,找不到一个,更不用说最小的了

编辑:Bing Wang 描述的 1-3、2-3、3-4、4-5、4-6 在这里工作

D.不知道。我假设您将不得不使用修改后的 DFS 以使其以线性方式运行,但除此之外我非常不确定。我可以想出一些方法来暴力破解它,但没有什么能以线性方式运行。

编辑:仍然对此感到困惑

【问题讨论】:

  • 你的蛮力算法是什么样的?很有可能你可以记住它并让它在线性时间内运行。
  • 堆栈溢出的规则是问one question per post,所以你能把你的4个问题分解成单独的帖子吗?

标签: algorithm dynamic dynamic-programming undirected-graph


【解决方案1】:

c:1-3、2-3、3-4、4-5,4-6。这棵树可以在双色的每种颜色中有 3 个节点。但是,如果您将节点#3/#4 着色为其他两种颜色,则可以有 4 个相同颜色的节点 - 三色。通过检查所有可能性,您应该很容易证明没有更小的答案。

D:只需遍历树,例如DFS。每个节点需要保留所有 3 种颜色的 c_1 个计数。当您处理第一个节点时,那将是 (1,0,0) - 相当容易计数。将节点添加到已访问的节点后,尝试所有 3 种颜色,每种颜色将与连接节点的 2 种颜色兼容,从中选择较大的一个等,以构造当前节点的 3 个值。

E=[(1,3),(2,3),(3,4),(4,5),(4,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][2]]) for child in filtered)
        ,sum(max([V[child][0],V[child][1]]) for child in filtered)]
    V[k]=m
print(max(V[k]))

【讨论】:

  • 我不同意将其称为 O(V+E),这有点令人困惑,就像在树中一样,V=E+1
  • 对你在 D 中描述的过程有点困惑。你描述的似乎总是优先考虑 c1,这并不总是最优的。例如,在某些情况下,第一个节点不应该是 c1(例如 1-2、1-3),但是使用您描述的方法,它似乎总是 c1,因为它将具有 [1, 0, 0] 和因此选择 c1 中最大的一个。不确定我是否遗漏了什么,作为动态编程的新手,我误解了,或者你犯了一个错误
  • @James 添加了一个代码示例。它可以进一步压缩,但应该适用于任何树。这是 O(N^2) 并且需要 python3.7+
  • @BingWang 原发帖人并没有要求线性时间算法
  • @MaxJones 它是线性时间。我算错了复杂性
【解决方案2】:

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

【讨论】:

  • 感谢A和C的帮助,但是您知道如何解决D吗?
猜你喜欢
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 2012-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多