Список связующего дерева из списка ребер в Python

Я пытаюсь выяснить, как напечатать список связующего дерева из заданного списка ребер. Например, если я читаю в:

0 1

2 1

0 2

1 3

Я хочу распечатать список связующего дерева:

[[1], [0,2,3], [1], [1]]

Я знаю, как создать список смежности с помощью кода:

n = int(input("Enter number of vertices: "))
adjList = [[] for i in range(n)]
with open("graph.txt") as edges:
    for line in edges:
        line = line.replace("\n", "").split(" ")
        adjList[int(line[0])].append(int(line[1]))
        adjList[int(line[1])].append(int(line[0]))
    print(l)

Но создание Spanning Tree - это отдельная история. Учитывая, что связующее дерево будет невзвешенным, я не уверен, нужно ли мне использовать какую-то версию алгоритма Прима здесь?

Любая помощь приветствуется!

1 ответ

Эта реализация основана на networkx пакет (документация для него здесь). Обратите внимание, что есть несколько разных связующих деревьев, которые, я думаю, вы можете получить для этого набора соединений. Этот код будет представлять остовное дерево с помощью набора ребер, но я посмотрю, смогу ли я изменить его, чтобы оно представляло дерево так, как вы предпочитаете.

import networkx as nx

def spanning_tree_from_edges(edges):
    graph = nx.Graph()

    for n1, n2 in edges:
        graph.add_edge(n1, n2)

    spanning_tree = nx.minimum_spanning_tree(graph)
    return spanning_tree

if __name__ == '__main__':
    edges = [(0, 1), (2, 1), (0, 2), (1, 3)]
    tree = spanning_tree_from_edges(edges)
    print(sorted(tree.edges()))

Выход

[(0, 1), (0, 2), (1, 3)]

Эта альтернатива, по-видимому, представляет дерево как набор соединений узлов (т. Е. В нужном формате). Обратите внимание, что эта коллекция отличается тем, что она отличается от того, что вы получаете:

if __name__ == '__main__':
    edges = [(0, 1), (2, 1), (0, 2), (1, 3)]
    tree = spanning_tree_from_edges(edges)
    print([list(nx.all_neighbors(tree, n)) for n in tree.nodes()])

Выход

[[1, 2], [0, 3], [0], [1]]

Начальный график

Сгенерированное остовное дерево

Другие вопросы по тегам