这对于数据结构和算法课程来说是一个问题,所以我不是在寻找具体或完整的答案,但我会很感激提示,看看我是否在正确的轨道上(或者可以指向我的那些)在正确的轨道上)
给定一个无向的位置图,其中节点是位置,道路是边缘(通过遍历某条道路所需的时间加权),找到可以到达所有节点的最小点数*最大重量为5。 *点是图表上的任何点。它们可以位于边缘或节点上。从现在开始,我会把它们称为关键点。
例如,如果我们有这个图:
节点1 - >节点3(权重1) - >节点2(权重7)
node2-> node1(权重7) - > node4(w 1) - > node7(w 8)
Node3->节点1(1) - >节点4(2) - >节点5(2) - > node6(2)
Node4->节点2(1) - >节点3(2) - >节点5(2)
Node5->节点3(2) - >节点4(2) - > node7(3)
Node6->节点3(2) - > node7(5)
Node7-> node6(5) - >节点5(3) - >节点2(8)
然后关键点是:一个位于节点1和2之间的边缘,节点1的权重为2,节点2的权重为5(注意它们的总和必须等于7,来自节点的原始权重1到2),第二个在节点7本身。 第一个临界点可以达到最大权重为5的节点1到6.从该点开始,只有节点7在权重5中不可达,因此第二个临界点在节点7本身上。因此,整个图可以从权重5(或更小)的这两个临界点到达。
我的想法:为每个鼻子保持一个布尔“完成”,表示可以或者不能从已找到的一个关键点到达它。 从某个节点开始。使用BFS并遍历图表。在未完成的节点上,执行以下操作:
检查节点的邻接列表。忽略加权大于10的边,因为您无法放置到达您所在节点的临界点以及这些边缘所导致的节点。忽略通向“完成”节点的边缘。如果没有剩余边缘,则将与当前节点位置相同的临界点添加到关键点列表中。否则,检查剩余的最大重量边缘,并在此边缘上创建临界点:临界点的2个选项。从curr_node到critical_point = 5的权重,以及从border_node到adjacent_node(边缘所指向的节点)的权重是edgeWeight-5,OR:从crtical_point到adjacent_node的权重是5,从curr_node到critical_point的权重是edgeWeight-5。尝试两者并检查哪个关键点可以在权重5中达到更多节点。使用具有更多可达节点的节点并将这些节点标记为已完成。
这里的问题是有效性的证明。每个关键点有不止两个选项(当使用最大权重边缘时)我只是考虑2.但另一方面,如果我考虑更多,我们会遇到复杂性问题,而算法已经不是优化。此外,我们可能需要在节点周围的边缘放置多个临界点。这个算法只放一个或者一个并继续前进,因为我认为放置多个点可能会放置比所需更多的点。
所以基本上,我不太确定从哪里开始。任何帮助都会非常感激。
答案 0 :(得分:2)
以下是我的最爱,欢迎您在推理中找到漏洞。
看起来你手头有套装问题。即给定一个集合覆盖问题的实例,可以构建一个问题实例,这样解决后者也可以解决前者问题。当然,集合覆盖问题是NP完全的。
这是减少。给定一个通用集U和一些覆盖所有U的子集S,构建一个仍然覆盖所有U的 minimal 子集。
我们如下构建图G。 U的每个元素u都是红色顶点。 S的每个元素是蓝色顶点。如果你在s中,我们将相应的顶点连接到长度为5的边。如果S的两个元素s_i和s_j相交,我们将相应的顶点连接到长度为5的边。没有其他边。
假设我们已经确定了G中的临界点的集合Q.如果Q中有任何非蓝点,则将其移除并替换为最近的蓝色顶点(如果有多个蓝色顶点中的任何一个)。 可到达顶点的集合不会变得更小。因此,对于任何最小的临界集,我们可以构建仅蓝色的最小临界集,并且仅蓝色的临界集是精确设置的U的封面。