code: def parse_neighbors(neighbors, vars=[]):
      
      dict = DefaultDict([])
      for var in vars:
          dict[var] = []
      specs = [spec.split(':') for spec in neighbors.split(';')]
      for (A, Aneighbors) in specs:
          A = A.strip()
          dict.setdefault(A, [])
          for B in Aneighbors.split():
              dict[A].append(B)
              dict[B].append(A)
      return dict
docs: Convert a string of the form 'X: Y Z; Y: Z' into a dict mapping
      regions to neighbors.  The syntax is a region name followed by a ':'
      followed by zero or more region names, followed by ';', repeated for
      each region name.  If you say 'X: Y' you don't need 'Y: X'.
      >>> parse_neighbors('X: Y Z; Y: Z')
      {'Y': ['X', 'Z'], 'X': ['Y', 'Z'], 'Z': ['X', 'Y']}