Esempio n. 1
0
def makemaze(w,h,tw):
  random.seed()
  size = w*h
  ds = DisjointSets(size)
  walls = ([(a,a+1) for a in [x for x in range(size) if (x+1)%w != 0]]
          + [(a,a+w) for a in [x for x in range(size-w)]])
  while not _done(ds):
    a,b = walls[random.randint(0, len(walls)-1)]
    x,y = ds.find(a), ds.find(b)
    if not x == y:
      ds.union(x,y)
      walls.remove((a,b))

  tiles = ([Tile('wall',_newp(i,tw),_newp(j,tw),tw) for i in range(2*w+1) for j in range(2*h+1)
           if (i == 0 or j == 0 or i == w*2 or j == h*2 or (i%2==0 and j%2==0))
           and not (j == 2*h-1 and i == 2*w)]
           + [Tile('floor',_newp(i,tw),_newp(j,tw),tw) 
              for i in range(1,2*w+1) for j in range(1,2*h+1)
              if (i%2==1 and j%2==1)
              or (j == 2*h-1 and i == 2*w)]
           + [Tile('wall' if i%2==0 and
                            list(set([(a,a+1) for a in range(i/2-1,size,w)])
                             & set([(b,b+1) for b in 
                                range(j/2*w,(j/2+1)*w-1)]))[0] in walls
                          or i%2==1 and
                            list(set([(a,a+w) for a in range(i/2,size,w)])
                            & set([(b,b+w) for b in 
                               range((j/2-1)*w,j/2*w)]))[0] in walls
                          else 'floor'
                   ,_newp(i,tw),_newp(j,tw),tw) 
              for i in range(1,2*w) for j in range(1,2*h)
              if i%2 != j%2])

  return tiles
Esempio n. 2
0
class Class(object):
    def __init__(self, meta=None, fields=tuple()):
        if meta is None:
            meta = {}
        self.meta = meta
        self.fields = list(fields)
        self.instances = WeakCollection()
        # Each set of linked subfields means that those subfields are linked and share the same instance
        self.links = DisjointSets()
        
    def __repr__(self):
        return '<%s, meta=%r, fields=%r>' % (self.__class__.__name__, self.meta, len(self.fields))

    def add_field(self, field):
        self.fields.append(field)
        for instance in self.instances:
            instance.new_field(field)
        
    def create_instance(self, **kw):
        instance = Instance(self, **kw)
        self.instances.add(instance)
        return instance

    def union(self, src_subfield_hierarchy, dst_subfield_hierarchy):
        src_subfield_hierarchy = tuple(src_subfield_hierarchy)
        dst_subfield_hierarchy = tuple(dst_subfield_hierarchy)
        self.links.union(src_subfield_hierarchy, dst_subfield_hierarchy)
        assert dst_subfield_hierarchy in self.links.set_of(src_subfield_hierarchy)
        assert src_subfield_hierarchy in self.links.set_of(dst_subfield_hierarchy)
        
        for instance in self.instances:
            # Find the subfield's_instance for this instance (extract the instance from the deepest level)
            src_subfield_instance = instance.get_subfield_instance(src_subfield_hierarchy, False)
            
            # Tell the instance that the subfield has changed, it will update all internally linked fields to point
            # to the new instance.
            instance.subfield_linked(src_subfield_hierarchy, src_subfield_instance)

    def split(self, subfield_hierarchy):
        self.links.split(subfield_hierarchy)
        for instance in self.instances:
            instance.subfield_unlinked(subfield_hierarchy)
Esempio n. 3
0
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
Esempio n. 4
0
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
Esempio n. 5
0
def mst(n, edges):
    weight_sum, m, tree = 0, n - 1, []
    edges.sort(key=lambda x: -x[2])
    sets = DS()
    vertices = [sets.make_set(i) for i in range(n)]
    while m > 0:
        edge = edges.pop()
        if not sets.union(vertices[edge[0]], vertices[edge[1]]):
            continue
        tree.append(edge)
        weight_sum += edge[2]
        m -= 1
    return tree, weight_sum