我有一个我需要的问题,给定一个图表找到每个顶点至少链接到另一个所需的最小边数。为了解决这个问题,我尝试在伪代码中执行此方法:
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
点,并且您提供了无法连接在一起的所有两个点对,您必须获得最小边缘,以便任何给定点与至少另一个相关联。
答案 0 :(得分:0)
让我们看看一个配置以及它在你的情况下是如何失败的:
您的算法将
所以你需要3条边而不是2条。你必须找到一组可连接的点(比如A,B,C,D)并首先连接点数最少的点。在我们的例子中,C-A-B-D就是这样一个集合。 C只有一次机会,所以我们连接C-A剩余的B-D。
更好但仍然贪婪且因此不是最佳算法:
示例(行尾的三角形):
但到目前为止这不是最复杂的案例。问题无法通过greedy algorithm得到最佳解决。如果你是想想两个可能的五边形(而不是三角形),你会发现,通过一条边连接,连接任何一对可能的连接仍然无法找到最佳解决方案。五边形的情况可以通过5条边来解决,但只有从正确的对开始才能解决。
祝你好运,玩得开心。
答案 1 :(得分:-1)
这是一个图表遍历问题,您可以选择任何您喜欢的风格:
显然,如果图表由未连接的组件组成,那么就没有解决方案。可以使用上面链接的DFS算法轻松检查。