def MakeMaze(self, width, height): self.width = width self.height = height self.canvasWidth = width * self.SCALE_FACTOR self.canvasHeight = height * self.SCALE_FACTOR self.disjointSets = DisjointSets(width * height) self.mazeCells = [[MazeCell(x, y) for y in range(height)] for x in range(width)] Xs = list(range(self.width)) Ys = list(range(self.height)) # cartesian product X x Y randomCoords = list(itertools.product(Xs, Ys)) randomCoords.extend(randomCoords) random.shuffle(randomCoords) for (row, column) in randomCoords: mazeCell = self.mazeCells[row][column] wallRemoveDirection = random.sample( [Direction.RIGHT, Direction.DOWN], 1)[0] if (mazeCell.visitedCount == 1): wallRemoveDirection = Direction.RIGHT if mazeCell.rightWallExists else Direction.DOWN a = self._findSetIndex(row, column) b = self._findSetIndex(row, column, wallRemoveDirection) if (self._checkBoundary(row, column, wallRemoveDirection) and self.disjointSets.SetUnion(a, b)): self._setWall(mazeCell, wallRemoveDirection, False) mazeCell.visitedCount += 1
def test_SetUnion(self): numElements = 5 test = DisjointSets(numElements) self.assertEqual(test.SetUnion(0, 2), True) self.assertEqual(test.uptrees, [2, -1, -2, -1, -1]) self.assertEqual(test.SetUnion(0, 2), False) self.assertEqual(test.uptrees, [2, -1, -2, -1, -1]) self.assertEqual(test.SetUnion(1, 2), True) self.assertEqual(test.uptrees, [2, 2, -3, -1, -1]) self.assertEqual(test.SetUnion(4, 4), False) self.assertEqual(test.uptrees, [2, 2, -3, -1, -1]) self.assertEqual(test.SetUnion(5, 5), False) self.assertEqual(test.uptrees, [2, 2, -3, -1, -1]) self.assertEqual(test.SetUnion(3, 4), True) self.assertEqual(test.uptrees, [2, 2, -3, 4, -2]) self.assertEqual(test.SetUnion(0, 3), True) self.assertEqual(test.uptrees, [2, 2, -5, 4, 2]) self.assertEqual(test.SetUnion(-1, -2), False) self.assertEqual(test.uptrees, [2, 2, -5, 4, 2])
def test_FindRoot(self): numElements = 5 test = DisjointSets(numElements) test.uptrees = [2, 2, -4, -1, 2] self.assertEqual(test.FindRoot(2), 2) self.assertEqual(test.FindRoot(0), 2) self.assertEqual(test.FindRoot(-1), -1)
def kruskal(graph): """Find the minimum spanning tree of a graph.""" msf = set() forest = DisjointSets() for v in graph.keys(): forest.makeset(v) edges = [] for u, adjlist in graph.items(): for (v, weight) in adjlist.items(): edges.append((u, v, weight)) edges.sort(key=lambda edge: edge[2]) for u, v, w in edges: if forest.find(u) != forest.find(v): msf.add((u, v, w)) forest.union(u, v) return msf
def kruskal(G): aristas = G.aristas() aristas.sort() D = DisjointSets(G.num_verts) return aristas_sin_ciclos(aristas, D)
def test_AddElements(self): numElements = 5 test = DisjointSets(numElements) self.assertEqual(test.uptrees, list(np.repeat(-1, numElements)))