def create_labyrinth(rows: int, cols: int, n: int = 0) -> UndirectedGraph: vertices = [(r, c) for r in range(rows) for c in range(cols)] mfs = MergeFindSet() for v in vertices: mfs.add(v) edges = [] for r, c in vertices: if r + 1 < rows: edges.append(((r, c), (r + 1, c))) if c + 1 < cols: edges.append(((r, c), (r, c + 1))) random.shuffle(edges) corridors = [] for (u, v) in edges: if mfs.find(u) != mfs.find(v): corridors.append((u, v)) mfs.merge(u, v) elif n > 0: corridors.append((u, v)) n -= 1 return UndirectedGraph(E=corridors)
def create_labyrinth(rows, cols): # generar vertices vertices = [(row, col) for row in range(rows) for col in range(cols)] mfs = MergeFindSet() edges = [] for v in vertices: mfs.add(v) # anadir la fila de abajo y la columna derecha a la lista de aristas y barajarla for row, col in vertices: if row + 1 < rows: edges.append(((row, col), (row + 1, col))) if col + 1 < cols: edges.append(((row, col), (row, col + 1))) # borrar las aristas prohibidas edges = list(set(edges) - set(aristas_p)) random.shuffle(edges) corridors = [] for u, v in edges: if mfs.find(u) != mfs.find(v): mfs.merge(u, v) corridors.append((u, v)) return corridors, vertices
def prim2(v_ini, aristas_prim): aristas_ordenadas = [] for arista, w in sorted(aristas_prim.items(), key=lambda x: x[1]): aristas_ordenadas.append(arista) mfs = MergeFindSet() g_prim = UndirectedGraph(E=aristas_ordenadas) path = [] for v in range(len(puntos)): mfs.add(v) seen = set() q = Fifo() q.push(v_ini) seen.add(v_ini) menor_arista = menor_arista_iter(v_ini, g_prim, aristas_prim) aristas_vecinas_ordenadas = [] for i in menor_arista: aristas_vecinas_ordenadas.append(i) # print(aristas_vecinas_ordenadas) while len(q) > 0: u = q.pop() for suc in g_prim.succs(u): if suc not in seen: seen.add(suc) q.push(suc) # if mfs.find(u) != mfs.find(v): # no hace ciclo # seen.add(u,v) return path, g_prim
def create_labyrinth(rows: int, cols: int, n: int = 0) -> UndirectedGraph: # Definition # Step 1 vertices = [(r, c) for r in range(rows) for c in range(cols)] # Step 2 mfs = MergeFindSet() for v in vertices: mfs.add(v) # Step 3 edges = [] for (r, c) in vertices: if r + 1 < rows: edges.append(((r, c), (r + 1, c))) if c + 1 < cols: edges.append(((r, c), (r, c + 1))) random.shuffle(edges) # Step 4 corridors = [] discarted_edges = [] #modificacion # Step 5 for (u, v) in edges: if mfs.find(u) != mfs.find(v): mfs.merge(u, v) corridors.append((u, v)) else: discarted_edges.append((u, v)) #modificacion corridors.extend(discarted_edges[:n]) #modificacion # Step 6 return UndirectedGraph(E=corridors)
def create_labyrinth(rows, cols, n=0): # for i in range(rows): # for j in range(cols): # vertices.append((i, j)) vertices = [(row, col) for row in range(rows) for col in range(cols)] print(vertices) mfs = MergeFindSet() for elem in vertices: mfs.add(elem) edges = [] for row, col in vertices: if row+1 < rows: edges.append(((row, col), (row+1, col))) if col+1 < cols: edges.append(((row, col),(row, col+1))) shuffle(edges) contador = 0 corridors = [] for u, v in edges: if mfs.find(u) != mfs.find(v): mfs.merge(u, v) corridors.append((u, v)) elif n > contador: corridors.append((u, v)) contador+=1 return UndirectedGraph(E=corridors)