Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 52401b3

Browse files
Update graph.py
1 parent 426dd53 commit 52401b3

File tree

1 file changed

+42
-54
lines changed
  • graphs/minimum-spanning-tree/kruskals-algorithm

1 file changed

+42
-54
lines changed
Lines changed: 42 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,45 @@
1-
from vertex import Vertex
2-
3-
def find_root(vertex: Vertex = None) -> Vertex:
4-
while vertex.root != vertex:
5-
vertex = vertex.root
6-
return vertex
7-
8-
def sort_edges_by_weight_increasingly(edges: list) -> list:
9-
# edges [[label1, label2, weight], [label1, label2, weight]]
10-
if len(edges) < 2:
11-
return edges
12-
13-
pivot_index: int = len(edges) // 2
14-
pivot_value = edges[pivot_index][2]
15-
left_list: list = []
16-
right_list: list = []
17-
for i in range(len(edges)):
18-
if i != pivot_index:
19-
if edges[i][2] < pivot_value:
20-
left_list.append(edges[i])
21-
else:
22-
right_list.append(edges[i])
23-
24-
return sort_edges_by_weight_increasingly(left_list) + [edges[pivot_index]] + sort_edges_by_weight_increasingly(right_list)
1+
from typing import Set, Dict, List, Tuple
252

3+
class Graph:
264

5+
def __init__(self) -> None:
6+
self.vertices:Set[str] = set()
7+
self.root:Dict[str, str] = dict()
8+
self.rank:Dict[str, int] = dict()
9+
self.edges:List[Tuple[str, str, int]] = list()
10+
self.mst:List[Tuple[str, str, int]] = list()
2711

28-
class Graph:
29-
def __init__(self):
30-
self.vertices: dict = {}
31-
self.edges: list = []
32-
33-
def add_vertex(self, label: str = None):
34-
self.vertices[label] = Vertex(label)
35-
36-
def add_edge(self, vertex_1_label: str = None, vertex_2_label: str = None, weight: int = float("inf")):
37-
if vertex_1_label not in self.vertices or vertex_2_label not in self.vertices:
38-
raise Exception("Invalid label name")
39-
self.edges.append([vertex_1_label, vertex_2_label, weight])
40-
self.edges.append([vertex_2_label, vertex_1_label, weight])
41-
42-
def kruskal(self):
43-
# sort edges by weight increasingly
44-
self.edges = sort_edges_by_weight_increasingly(self.edges)
45-
minimum_spanning_tree: list = []
46-
for edge_list in self.edges:
47-
vertex_one: Vertex = self.vertices[edge_list[0]]
48-
vertex_two: Vertex = self.vertices[edge_list[1]]
49-
50-
root_one: Vertex = find_root(vertex_one)
51-
root_two: Vertex = find_root(vertex_two)
52-
53-
if root_one != root_two:
54-
root_one.root = root_two
55-
minimum_spanning_tree.append([vertex_one.label, vertex_two.label])
56-
57-
print(minimum_spanning_tree)
12+
13+
def add_vertex(self, label:str) -> None:
14+
self.vertices.add(label)
15+
self.root[label] = label
16+
self.rank[label] = 0
17+
18+
19+
def add_edge(self, label1:str, label2:str, weight:int) -> None:
20+
self.edges.append((label1, label2, weight))
21+
22+
23+
def kruskal(self) -> None:
24+
self.edges.sort(key = lambda edge: edge[2])
25+
for l1, l2, weight in self.edges:
26+
27+
root1:str = self._find_root(l1)
28+
root2:str = self._find_root(l2)
29+
30+
if root1 != root2:
31+
if self.rank[root1] > self.rank[root2]:
32+
self.root[root2] = root1
33+
self.rank[root1] = self.rank[root1] + 1
34+
else:
35+
self.root[root1] = root2
36+
self.rank[root2] = self.rank[root2] + 1
37+
self.mst.append((l1, l2, weight))
38+
39+
print(self.mst)
40+
41+
42+
def _find_root(self, label:str) -> str:
43+
if self.root[label] != label:
44+
self.root[label] = self._find_root(self.root[label])
45+
return self.root[label]

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /