-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmst_kruskals.py
More file actions
64 lines (55 loc) · 1.85 KB
/
mst_kruskals.py
File metadata and controls
64 lines (55 loc) · 1.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
"""
Minimum Spanning Tree (MST) using Kruskals's Algorithm
"""
from graph_utils import *
def mst_prims(graph: Graph, node_idx=0):
def lowest_cost_link() -> Link:
links = []
for node in min_nodes:
links.extend([link for link in node.links if link.to_node not in min_nodes])
min_link = min(links, key=lambda link: link.cost)
return min_link
node = graph.nodes[node_idx]
min_nodes = [node]
min_links = []
for _ in range(len(graph.nodes) - 1):
min_link_out = lowest_cost_link()
min_links.append(min_link_out)
min_nodes.append(min_link_out.to_node)
# make new MST graph
mst_nodes, mst_links = [], []
old2new_nodes = {}
for old_node in min_nodes:
new_node = old_node.copy()
mst_nodes.append(new_node)
old2new_nodes[old_node] = new_node
for old_link in min_links:
new_link = old_link.copy(
old2new_nodes[old_link.from_node], old2new_nodes[old_link.to_node]
)
mst_links.append(new_link)
new_link.from_node.links.append(new_link)
return Graph(mst_nodes, mst_links)
def mst_kruskals(graph: Graph, node_idx=0):
def lowest_cost_link() -> Link:
min_link = min(links, key=lambda link: link.cost)
return min_link
forest = graph.nodes[:]
links = graph.links[:]
root = {node: node for node in forest}
while links:
min_link = lowest_cost_link()
links.remove(min_link)
from_node = min_link.from_node
to_node = min_link.to_node
if root[from_node] != root[to_node]:
for key_node in root:
if root[key_node] == to_node:
root[key_node] = from_node
else:
print(min_link)
print(root)
g = make_graph(5, 7, directed=False)
print(g)
print(mst_prims(g, 0))
print(mst_kruskals(g, 0))