如何从无向图中删除一些边?

时间:2015-05-07 01:50:19

标签: python algorithm graph

假设我有一个包含7个节点的无向​​图。

g = {1:[2,3],2:[1,4],3:[1,4,6],4:[2,3,5,7],5:[4,6 ],6:[3,5],7:[4]}

我想从图中删除一些边,特别是一个超过2级的节点。我已经实现了以下代码,它可以通过DFS方式探索图中的每个节点,检查它们的度数并根据节点的学位。

def Remove_edges(graph, start):
stack = [start]
visited = []
while stack:
    vertex = stack.pop()
    if vertex not in visited:
        visited.append(vertex)
        check_node_degree = node_degree(graph,vertex)

        if check_node_degree > 2:
            compute_edges = get_edges(graph, vertex)

            while len(compute_edges)!=2:
                compute_edges.pop()


        for neighbour in graph[vertex]:
            stack.append(neighbour)

graph.update(g.edges())
new_g = graph.copy()
return new_g

我得到了这样的结果,new_g = {1:3,2:4,3:6,4:7,5:6,6:[3,5],7:[4]}。

任何人都可以帮我解决问题吗?

1 个答案:

答案 0 :(得分:0)

您似乎想要创建最大度为1的图形(即,您正在构建匹配)。如果这不是您要解决的问题,那么您需要更清楚地了解您的问题。

此外,您还可以调用未包含在问题中的自定义函数。我相信你的错误来自一个这样的功能,但我无法确定:

graph.update(g.edges())

在while循环之后,访问过的任何节点都会有一个邻居(它的最后一个邻居);具体来说,您的图表应该是: new_g = {1:3,2:4,3:6,4:7,5:6,6:5,7:4}。

但是,你有一个无向图,所以你调用graph.update()来修复断边,它会重新串起6到3(因为3的边有6)。 (同样,你没有包含graph.update()的代码,所以我假设它正在修复破碎的边缘。)你需要调用一个相反的函数:而不是使有向边无向,它们应该被删除。

此外,我可以建议您更改算法吗?我看到两个问题。首先,如果图形连接良好,您将多次访问节点,这就是您需要与访问数组进行比较的原因。另一方面,如果图形不是一个连接的组件,则不会访问每个节点。这两个问题都可以通过循环遍历节点而不是DFS来解决;这将节省您的时间和资源,并提高算法的正确性。

另外,如果您有兴趣最大化图表中剩余的边数,建议您查看http://en.wikipedia.org/wiki/Matching_%28graph_theory%29