【问题标题】:Critical points of a graph: reach all nodes in minimum number of points and weight图的关键点:以最小点数和权重到达所有节点
【发布时间】:2012-12-24 13:43:10
【问题描述】:

这是一个数据结构和算法课程的问题,所以我不是在寻找一个具体或完整的答案,但希望能帮助我看看我是否走在正确的轨道上(或者那些可以指出我的提示)在正确的轨道上)

给定一个位置的无向图,其中节点是位置,道路是边(加权通过某条道路所需的时间),找到可以到达所有节点的最小点数*最大重量为 5。 *点是图表上的任何点。它们可以在边缘或节点上。从现在开始,我将它们称为临界点。

例如,如果我们有这个图表:

节点1->节点3(权重1)->节点2(权重7)

node2->node1(权重7)->node4(w 1)->node7(w 8)

节点3->节点1(1)->节点4(2)->节点5(2)->节点6(2)

节点4->节点2(1)->节点3(2)->节点5(2)

节点5->节点3(2)->节点4(2)->节点7(3)

节点6->节点3(2)->节点7(5)

节点7->节点6(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,从 critical_node 到相邻节点(边缘通向的节点)的权重是 edgeWeight-5,或者:从 crtical_point 到相邻节点的权重是 5,从 curr_node 到 critical_point 的权重是 edgeWeight-5。两者都试一下,检查哪个临界点可以到达更多权重为 5 的节点。使用具有更多可到达节点的那个,并将这些节点标记为已完成。

这里的问题是有效性证明。每个临界点有不止 2 个选项(当使用最大的权重边缘时),我只考虑 2 个。但另一方面,如果我考虑更多,我们会遇到复杂性问题,并且算法已经不是太优化。此外,我们可能需要在节点周围的边缘上放置多个临界点。该算法只放置一个或不放置并继续前进,因为我假设放置多个可能会放置比需要更多的点。

所以基本上,我不太确定从这里去哪里。非常感谢任何帮助。

【问题讨论】:

  • 当您说“可以到达所有边缘”时,您的意思是每条边缘上的每个点都必须在临界点的 5 以内吗?还是只是每个 node (即边缘的端点)必须在临界点的 5 以内?例如。如果图只是一条长度为 20 的边,则前者需要 3 个临界点,而后者只需要 2 个临界点。
  • 对不起,我的错。我的意思是每个节点而不是每个边缘。所以在你的例子中只有 2 个。
  • 我们可以假设所有边的权重都是整数吗?如果是这样,那么必须有一个所有临界点都出现在沿边缘的整数距离处的最小点解决方案,这将允许更简单的算法,因为可能的临界点位置的集合是有限的,因此我们可以轻松枚举所有可能性(尽管这将导致求解时间是图形总权重的函数)。
  • 另一个想法:给定一个边缘,在您正在考虑的那个边缘上尝试两个临界点放置是不够的。考虑下图,边长等于连字符数:a--b------c--d。这可以使用单个临界点解决,前提是它恰好位于 b 和 c 之间的中间,即距离每个临界点 3。
  • 这是一个递归解决方案的骨架,假设整数距离,保证找到最优解: 1. 选择任何非“完成”节点 v. 2. 尝试在每个整数点添加一个临界点距离

标签: algorithm data-structures graph


【解决方案1】:

以下出自我的脑洞,欢迎大家在推理中找漏洞。

看起来你手头有设置封面的问题。 IE。给定集合覆盖问题的一个实例,可以构建您的问题的一个实例,这样解决后者也将解决前者。当然,集合覆盖问题是 NP 完全的。

这里是减少。给定一个全集 U 及其包含所有 U 的子集 S,构建一个仍然覆盖所有 U 的 S 的最小子集。

我们如下构建图 G。 U 的每个元素 u 是一个红色顶点。 S 的每个元素 s 是一个蓝色顶点。如果 u \in s,我们用长度为 5 的边连接对应的顶点。如果 S 的两个元素 s_i 和 s_j 相交,我们用长度为 5 的边连接对应的顶点。没有其他边。

假设我们已经确定了 G 中的一组关键点 Q。如果 Q 中有任何非蓝色点,请将其删除并替换为最近的蓝色顶点(如果有多个,则替换为任意一个)。 可达顶点的集合不会变得更小。因此,对于任何最小临界集,我们都可以构建一个只有蓝色的最小临界集,而只有蓝色的临界集是 U 的精确集覆盖。 p>

【讨论】:

  • 恐怕有些东西我不太明白。什么使顶点成为红色或蓝色?我了解集合覆盖问题中的集合 U 和 S 是什么,但不知道它们在这里如何应用。另外,两个元素相交是什么意思?如果这些问题中的任何一个对您来说都是微不足道的,请多多包涵。我不会假装自己是编程专家。感谢您的帮助
  • 红色和蓝色只是任意标签。有两种顶点:U 的每个元素一个顶点(我称它们为红色)和 S 中的每个集合一个顶点(我称它们为蓝色)。给定一个集合覆盖问题,我们通过创建红色和蓝色顶点并按照描述添加边将其转换为图形。如果你能找到这个图的一个临界集,你就可以把它转化为集合覆盖问题的一个解。如果你能找到一个关键的any图集,你就可以解决集合覆盖问题的any实例。封面问题很难,所以你的问题也一定很难。
猜你喜欢
  • 1970-01-01
  • 2016-02-23
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 1970-01-01
  • 2020-01-17
  • 1970-01-01
相关资源
最近更新 更多