Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从无向图中删除一些边?_Python_Algorithm_Graph - Fatal编程技术网

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

Python 如何从无向图中删除一些边?,python,algorithm,graph,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.

比如说,我有一个有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的图(即,您正在构建一个匹配)。如果这不是你想要解决的问题,那么你需要更清楚地回答你的问题

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

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来解决;这将节省您的时间和资源,并提高算法的正确性


另外,如果您对最大化图形中剩余的边数感兴趣,我建议您查看

修复缩进。我强烈建议您检查一下。期望的输出是什么?您的基本假设可能有问题。您说要基于阶数>2的节点删除边。边度的两端是否都大于2?或者与节点d>2相邻的任何边?什么是
图形
?什么是
start
?谢谢您的建议@dbliss。非常感谢@Kittsil