【问题标题】:How to remove some edges from an undirected graph?如何从无向图中删除一些边?
【发布时间】:2015-05-07 01:50:19
【问题描述】:

假设我有一个有 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]}。

谁能帮我解决这个问题?

【问题讨论】:

  • 修正缩进。我强烈建议您查看networkx
  • 想要的输出是什么?
  • 您的基本假设可能有问题。您说要删除基于度数> 2的节点的边缘。边缘度数> 2的两端?或者任何与节点 d > 2 相邻的边?
  • 什么是graphstart 是什么?
  • 感谢@dbliss 的建议。

标签: python algorithm graph


【解决方案1】:

您似乎想创建一个最大度数为 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

【讨论】:

  • 非常感谢@Kittsil
猜你喜欢
  • 2017-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2019-08-05
  • 1970-01-01
  • 2010-12-08
相关资源
最近更新 更多