【发布时间】: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,但如果它修改它,那么
-
遇到一个未着色的节点给它 c1 和它的子节点 c2 着色,
-
遇到一个彩色节点将其子节点着色为相反的颜色
-
如果它试图“翻转”孩子的颜色,则返回不可能有 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