Рекурсивная функция для возврата списка всех подключенных узлов, заданных определенным узлом из сетевого графа с использованием python

Я пытаюсь написать функцию, которая будет возвращать список всех подключенных узлов в подсети, учитывая начальный узел из подграфа:

например, следующий график имеет две подсети, одну красную и одну зеленую, как показано на следующем рисунке:

используя пакет python под названием networkx, я запустил следующий код:

import networkx as nx
import pandas as pd
import numpy as np

G=nx.Graph()

G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_node(4)
G.add_node(5)
G.add_node(6)

G.add_edge(1,2)
G.add_edge(2,3)
G.add_edge(1,5)
G.add_edge(4,6)

def recurse(G, z , node):
    z.append(node)
    n = list(set(G.neighbors(node)) - set(z)) 
    if len(n) == 0:
        return []
    else:
        for i in n:
            if i not in z:
                z.extend(recurse(G, z, i))
                return z

z = []
f = recurse(G,z,1)
print(f)

Функция должна возвращать подгруппу -> [1,2,3,5], когда задано (1) в качестве начального узла, но она возвращает [1,2,3,1,2,3]

Любые идеи, как я могу выполнить эту задачу путем настройки кода или, возможно, с помощью другого метода?

Спасибо!

1 ответ

Решение

Если вас не интересует порядок посещения узлов, вы можете просто сделать DFS и собрать посещенные узлы для set:

def recurse(G, z, node):
    z.add(node)
    for i in G.neighbors(node):
        if i not in z:
            recurse(G, z, i)

z = set()
recurse(G,z,1)
print(z) # {1, 2, 3, 5}
Другие вопросы по тегам