From b5937c0b3da93068294632f59bd87c1730a52716 Mon Sep 17 00:00:00 2001 From: Bruno Santos Date: Tue, 1 Oct 2019 09:15:16 -0300 Subject: [PATCH 1/4] suiting PEP8 --- graphs/prim.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/graphs/prim.py b/graphs/prim.py index f7e08278966d..aae96b126ab2 100644 --- a/graphs/prim.py +++ b/graphs/prim.py @@ -7,21 +7,21 @@ G = [vertex(n) for n in range(x)] For each vertex in G, add the neighbors: -G[x].addNeighbor(G[y]) -G[y].addNeighbor(G[x]) +G[x].add_neighbor(G[y]) +G[y].add_neighbor(G[x]) For each vertex in G, add the edges: -G[x].addEdge(G[y], w) -G[y].addEdge(G[x], w) +G[x].add_edge(G[y], w) +G[y].add_edge(G[x], w) -To solve run: +To solve, run: MST = prim(G, G[0]) """ import math -class vertex(): +class Vertex: """Class Vertex.""" def __init__(self, id): @@ -40,17 +40,17 @@ def __init__(self, id): def __lt__(self, other): """Comparison rule to < operator.""" - return (self.key < other.key) + return self.key < other.key def __repr__(self): """Return the vertex id.""" return self.id - def addNeighbor(self, vertex): + def add_neighbor(self, vertex): """Add a pointer to a vertex at neighbor's list.""" self.neighbors.append(vertex) - def addEdge(self, vertex, weight): + def add_edge(self, vertex, weight): """Destination vertex and weight.""" self.edges[vertex.id] = weight @@ -61,19 +61,19 @@ def prim(graph, root): Return a list with the edges of a Minimum Spanning Tree prim(graph, graph[0]) """ - A = [] + a = [] for u in graph: u.key = math.inf u.pi = None root.key = 0 - Q = graph[:] - while Q: - u = min(Q) - Q.remove(u) + q = graph[:] + while q: + u = min(q) + q.remove(u) for v in u.neighbors: - if (v in Q) and (u.edges[v.id] < v.key): + if (v in q) and (u.edges[v.id] < v.key): v.pi = u v.key = u.edges[v.id] for i in range(1, len(graph)): - A.append([graph[i].id, graph[i].pi.id]) - return(A) + a.append([graph[i].id, graph[i].pi.id]) + return a From de549a98a8f44f9627331191cc2c8c6c861fdf54 Mon Sep 17 00:00:00 2001 From: Bruno Santos Date: Tue, 1 Oct 2019 10:18:13 -0300 Subject: [PATCH 2/4] create auxiliary function --- graphs/prim.py | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/graphs/prim.py b/graphs/prim.py index aae96b126ab2..a776ba14e85e 100644 --- a/graphs/prim.py +++ b/graphs/prim.py @@ -2,20 +2,6 @@ Prim's Algorithm. Determines the minimum spanning tree(MST) of a graph using the Prim's Algorithm - -Create a list to store x the vertices. -G = [vertex(n) for n in range(x)] - -For each vertex in G, add the neighbors: -G[x].add_neighbor(G[y]) -G[y].add_neighbor(G[x]) - -For each vertex in G, add the edges: -G[x].add_edge(G[y], w) -G[y].add_edge(G[x], w) - -To solve, run: -MST = prim(G, G[0]) """ import math @@ -36,7 +22,7 @@ def __init__(self, id): self.key = None self.pi = None self.neighbors = [] - self.edges = {} # [vertex:distance] + self.edges = {} # {vertex:distance} def __lt__(self, other): """Comparison rule to < operator.""" @@ -55,6 +41,15 @@ def add_edge(self, vertex, weight): self.edges[vertex.id] = weight +def connect(graph, a, b, edge): + # add the neighbors: + graph[a-1].add_neighbor(graph[b-1]) + graph[b-1].add_neighbor(graph[a-1]) + # add the edges: + graph[a-1].add_edge(graph[b-1], edge) + graph[b-1].add_edge(graph[a-1], edge) + + def prim(graph, root): """ Prim's Algorithm. @@ -75,5 +70,5 @@ def prim(graph, root): v.pi = u v.key = u.edges[v.id] for i in range(1, len(graph)): - a.append([graph[i].id, graph[i].pi.id]) + a.append((int(graph[i].id)+1, int(graph[i].pi.id)+1)) return a From dabf413d0a128c44381e7814a263a1594fb4a6b7 Mon Sep 17 00:00:00 2001 From: Bruno Santos Date: Tue, 1 Oct 2019 10:19:22 -0300 Subject: [PATCH 3/4] running example --- graphs/prim.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/graphs/prim.py b/graphs/prim.py index a776ba14e85e..ea6d0a532481 100644 --- a/graphs/prim.py +++ b/graphs/prim.py @@ -72,3 +72,21 @@ def prim(graph, root): for i in range(1, len(graph)): a.append((int(graph[i].id)+1, int(graph[i].pi.id)+1)) return a + + +if __name__ == "__main__": + # Creates a list to store x vertices. + x = 5 + G = [Vertex(n) for n in range(x)] + + connect(G, 1, 2, 15) + connect(G, 1, 3, 12) + connect(G, 2, 4, 13) + connect(G, 2, 5, 5) + connect(G, 3, 2, 6) + connect(G, 3, 4, 6) + connect(G, 0, 0, 0) + # Generate the minimum spanning tree: + MST = prim(G, G[0]) + for i in MST: + print(i) From e1c88ed70199e11309d2a68496b32732d0729cad Mon Sep 17 00:00:00 2001 From: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Date: Sun, 1 Dec 2019 05:12:10 +0000 Subject: [PATCH 4/4] updating DIRECTORY.md --- DIRECTORY.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 74c63d144e40..a3db3636e34c 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -82,6 +82,9 @@ * [Red Black Tree](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/red_black_tree.py) * [Segment Tree](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/segment_tree.py) * [Treap](https://github.com/TheAlgorithms/Python/blob/master/data_structures/binary_tree/treap.py) + * Data Structures + * Heap + * [Heap Generic](https://github.com/TheAlgorithms/Python/blob/master/data_structures/data_structures/heap/heap_generic.py) * Disjoint Set * [Disjoint Set](https://github.com/TheAlgorithms/Python/blob/master/data_structures/disjoint_set/disjoint_set.py) * Hashing