将所有点链接到图表中的至少另一个点

时间:2015-12-30 11:16:11

标签: algorithm

我有一个我需要的问题,给定一个图表找到每个顶点至少链接到另一个所需的最小边数。为了解决这个问题,我尝试在伪代码中执行此方法:

getEdgesCount(listOfPoints):
linkedPoints = set()
edgeCount = 0

for point in listOfPoints:
    alternative = None
    best = None
    foundEdge = false
    if point not in linkedPoints:
         for secondPoint in listOfPoints:
             if secondPoint != point:
                 if canLink(secondPoint,point):
                     if secondPoint in linkedPoints:
                         alternative = secondPoint
                         foundEdge = true
                     else:
                         best = secondPoint
                         foundEdge = true
                         break
        if foundEdge:
            linkedPoints.push(point)
            edgeCount++
            if best != None:
                linkedPoints.push(best)
            else:
                linkedPoints.push(alternative)
return edgeCount

但是这段代码似乎并不总是给出正确的答案,这意味着它很重要,所以我问你这个代码有什么问题?

我可能误解了这个问题,这是它的立场: 您有一组n点,并且您提供了无法连接在一起的所有两个点对,您必须获得最小边缘,以便任何给定点与至少另一个相关联。

2 个答案:

答案 0 :(得分:0)

让我们看看一个配置以及它在你的情况下是如何失败的:

  • 可与C
  • 连接
  • B可与D
  • 连接
  • 可与B连接(但不需要)

您的算法将

  1. 首先连接A和B
  2. 发现C只能连接到A
  3. 发现D只能与B
  4. 连接

    所以你需要3条边而不是2条。你必须找到一组可连接的点(比如A,B,C,D)并首先连接点数最少的点。在我们的例子中,C-A-B-D就是这样一个集合。 C只有一次机会,所以我们连接C-A剩余的B-D。

    更好但仍然贪婪且因此不是最佳算法:

    1. 用最少的连接搜索孤独点。
    2. 在可能的合作伙伴中,再次使用尽可能少的连接并将其连接到第一个。
    3. 重复1.直到完成成对孤独点之间的所有连接。
    4. 对孤独点与非孤独点的联系也一样。
    5. 示例(行尾的三角形):

      • 可能的联系:
        • A to B
        • B to C
        • A to D
        • D to B
        • C to E
        • E to F
        • F to C
      • 可能的连接数(已排序)
        • A:2
        • d:2
        • E:2
        • F:2
        • B:3
        • C:3
      • A只有2个可能的连接(A-B或A-D)
        • B有3而D只有2 =>连接A-D
      • 剩余点的剩余可能连接数
        • B:1
        • E:2
        • F:2
        • C:3
      • B只有1个可能的连接=>连接B-C
      • 剩余点的剩余可能连接数
        • E:1
        • F:1
      • E只有一个可能的连接=>连接E-F
      • 解决

      但到目前为止这不是最复杂的案例。问题无法通过greedy algorithm得到最佳解决。如果你是想想两个可能的五边形(而不是三角形),你会发现,通过一条边连接,连接任何一对可能的连接仍然无法找到最佳解决方案。五边形的情况可以通过5条边来解决,但只有从正确的对开始才能解决。

      祝你好运,玩得开心。

答案 1 :(得分:-1)

这是一个图表遍历问题,您可以选择任何您喜欢的风格:

显然,如果图表由未连接的组件组成,那么就没有解决方案。可以使用上面链接的DFS算法轻松检查。