如果我正确理解了您的问题,那么我们正在研究的更多是几何问题而不是图论问题。您在 2d 空间中有具有具体位置的现有点和线段,并且您想要添加不会与现有线段相交的新线段。
为了检查是否可以连接两个节点 node1 和 node2,您可以遍历所有现有边并查看线段node1---node2是否与线段edge.endpoint1 --- edge.endpoint2 相交。检查两条线段是否相交的关键功能可以使用此处找到的任何解决方案来实现:如何检查两条线段是否相交?.
这将花费 O(E) 时间并且看起来像
def canAddEdge(node1, node2):
canAdd = True
for edge in graph:
canAdd = canAdd and not doesIntersect([node1.location(),
node2.location(), edge.endpoint1.location(), edge.endpoint2.location()])
你可以得到一个有效边的列表以添加到 O(EV^2) 中,比如
def getListOfValidEdges(graph):
validEdges = []
for index,firstEndpointNode in enumerate(graph.nodes()):
for secondEndpointNode in graph.nodes()[index:]:
if (canAddEdge(firstEndpointNode, secondEndpointNode)):
validEdges.append([firstEndpointNode, secondEndpointNode])
return validEdges
当然,每次添加新边后,您都需要重新计算有效边。