【发布时间】: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