51 lines
1.3 KiB
Python
51 lines
1.3 KiB
Python
from graph import Graph
|
|
|
|
|
|
def kruskal(graph: Graph):
|
|
matrix = graph.matrix
|
|
V = graph.V
|
|
edges = []
|
|
for i in range(V):
|
|
for j in range(V):
|
|
if matrix[i][j] > 0:
|
|
edges.append((i, j, matrix[i][j]))
|
|
edges.sort(key=lambda item: item[2])
|
|
subsets = []
|
|
for i in range(V):
|
|
subsets.append([i])
|
|
result = []
|
|
for edge in edges:
|
|
subset1 = None
|
|
subset2 = None
|
|
for subset in subsets:
|
|
if edge[0] in subset:
|
|
subset1 = subset
|
|
if edge[1] in subset:
|
|
subset2 = subset
|
|
if subset1 != subset2:
|
|
result.append(edge)
|
|
subsets.remove(subset1)
|
|
subsets.remove(subset2)
|
|
subsets.append(subset1 + subset2)
|
|
new_matrix = [[0] * V for _ in range(V)]
|
|
for edge in result:
|
|
new_matrix[edge[0]][edge[1]] = edge[2]
|
|
new_matrix[edge[1]][edge[0]] = edge[2]
|
|
return Graph(new_matrix)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
matrix = [
|
|
# 0 1 2 3 4 5
|
|
[0, 0, 7, 6, 9, 0], # 0
|
|
[0, 0, 5, 0, 0, 6], # 1
|
|
[7, 5, 0, 1, 0, 2], # 2
|
|
[6, 0, 1, 0, 0, 2], # 3
|
|
[9, 0, 0, 0, 0, 1], # 4
|
|
[0, 6, 2, 2, 1, 0] # 5
|
|
]
|
|
graph = Graph(matrix)
|
|
graph.bf_print(0) # 0 2 3 4 1 5
|
|
mst = kruskal(graph)
|
|
mst.bf_print(0) # 0 3 2 1 5 4
|