пометка подключенных компонентов с помощью networkx - PullRequest
0 голосов
/ 02 февраля 2020

Использование igraph Я могу назначить уникальный идентификатор подключенного компонента для каждого узла:

import igraph 
def tag_components(vertices, edges):
    graph = igraph.Graph()
    graph.add_vertices(vertices)
    graph.add_edges(edges)
    graph_tags = graph.clusters().membership
    return graph_tags
print(tag_components([0,1,2,3,4,5], [[1,2],[2,4],[3,5]]))

Он выводит [0, 1, 1, 2, 1, 2], что означает, что 3 подключенных компонента проиндексированы 0, 1, 2 соответствует группам узлов [0], [1, 2, 4], [3, 5]. Как я могу добиться того же результата, используя networkx?

Я ожидаю что-то вроде:

def tag_components_nx(vertices, edges):
    G = nx.Graph()
    G.add_nodes_from(vertices)
    G.add_edges_from(edges)
    ...
    return graph_tags

Обновление

У меня уже есть удовлетворительный ответ, и мне интересно, если networkx имеет более сложные методы, чем connected_components подходит для моей проблемы

1 Ответ

1 голос
/ 02 февраля 2020

Начиная с вывода nx.connected_components вы можете создать желаемый формат вывода.

Пример.

>>> g.nodes()
NodeView((0, 1, 2, 3, 4, 5))
>>> g.edges()
EdgeView([(1, 2), (2, 4), (3, 5)])
>>> idx_components = {u:i for i,node_set in enumerate(nx.connected_components(g)) for u in node_set}
>>> res = [idx_components[u] for u in vertices]
>>> res
[0, 1, 1, 2, 1, 2]
...