Я пытаюсь реализовать алгоритм Краскала, чтобы найти минимальное остовное дерево в Python для решения вопроса онлайн-судьи, но у меня возникают проблемы с ограничением времени. Вопрос дает серию ребер в порядке возрастания и спрашивает, возможно ли минимальное остовное дерево. Полные спецификации проблемы можно увидеть здесь.
Вот мой код проблемы:
import sys
raw_input = sys.stdin.readline
line = map(int, raw_input().split())
n = line[0]
m = line[1]
dict1 = {}
lists = []
for i in xrange(1, n + 1):
dict1[i] = set([i])
for i in xrange(m):
edge = map(int, raw_input().split())
a = edge[0]
b = edge[1]
if dict1[a] != dict1[b]:
newSet = dict1[a].union(dict1[b])
for vertice in newSet:
dict1[num] = newSet
lists.append(i + 1)
check = all(dict1[x] == dict1[1] for x in dict1.keys())
if check:
for i in lists:
print i
else:
print "Disconnected Graph"
Код сначала создает непересекающиеся множества для всех возможных вершин. Затем для каждого ребра он проверяет, различны ли множества, в которых лежит каждая из двух вершин. Если да, то два набора объединяются с помощью операции объединения. Каждая вершина в комбинированном наборе является членом вновь созданного комбинированного набора. Если вершины уже соединены, они пропускаются. Я думаю, что проблема с моим кодом заключается в том, сколько раз нужно обновить наборы в строках:
for vertice in newSet:
dict1[num] = newSet
Есть ли более быстрый способ обновить наборы, чтобы проверить, равны ли они? Эта операция занимает примерно O (вершин ^ 2) времени и занимает слишком много времени, когда число вершин достигает 100 000.
minimum_spanning_tree
? - person jakevdp   schedule 27.10.2015