Advertisement
Guest User

Untitled

a guest
Jan 8th, 2016
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.57 KB | None | 0 0
  1. from collections import deque
  2. from Panda_class import Panda
  3.  
  4. class PandaSocialNetwork:
  5.     def __init__(self):
  6.         self.__pandas = {}
  7.  
  8.     def add_panda(self, panda):
  9.         self.__pandas[panda] = []
  10.  
  11.     def has_panda(self, panda):
  12.         if panda in self.__pandas:
  13.             return True
  14.         return False
  15.  
  16.     def make_friends(self, panda1, panda2):
  17.         self.__pandas[panda1].append(panda2)
  18.         self.__pandas[panda2].append(panda1)
  19.         return
  20.  
  21.     def are_friends(self, panda1, panda2):
  22.         if self.has_panda(panda1) and self.has_panda(panda2):
  23.             if panda2 in self.__pandas[panda1] and panda1 in self.__pandas[panda2]:
  24.                 return True
  25.         return False
  26.  
  27.     def friends_of(self, panda):
  28.         return self.__pandas[panda]
  29.  
  30.     def _bfs_with_level(self, start_node, end_node):
  31.         visited = set()
  32.         queue = deque()
  33.  
  34.         visited.add(start_node)
  35.         queue.append((0, start_node))
  36.  
  37.         while len(queue) != 0:
  38.             node_with_level = queue.popleft()
  39.             node = node_with_level[1]
  40.             level = node_with_level[0]
  41.  
  42.             if node == end_node:
  43.                 return level
  44.  
  45.             for neighbour in self.__pandas[node]:
  46.                 if neighbour not in visited:
  47.                     visited.add(neighbour)
  48.                     queue.append((level + 1, neighbour))
  49.  
  50.         return -1
  51.  
  52.     def _bfs_gender_counter(self, levels, start_node, gender):
  53.         visited = set()
  54.         queue = deque()
  55.  
  56.         visited.add(start_node)
  57.         queue.append((0, start_node))
  58.  
  59.         gender_counter = 0
  60.  
  61.         while len(queue) != 0:
  62.             node_with_level = queue.popleft()
  63.             node = node_with_level[1]
  64.             level = node_with_level[0]
  65.  
  66.             if level == levels:
  67.                 for panda in visited:
  68.                     if panda.get_gender() == gender:
  69.                         gender_counter += 1
  70.                 if start_node.get_gender() == gender:
  71.  
  72.                     gender_counter -= 1
  73.                 return gender_counter
  74.  
  75.             for neighbour in self.__pandas[node]:
  76.                 if neighbour not in visited:
  77.                     visited.add(neighbour)
  78.                     queue.append((level + 1, neighbour))
  79.  
  80.         return -1
  81.  
  82.     def connection_level(self, panda1, panda2):
  83.  
  84.         if panda1 not in self.__pandas or panda2 not in self.__pandas:
  85.             return False
  86.  
  87.         return self._bfs_with_level(panda1, panda2)
  88.  
  89.     def are_connected(self, panda1, panda2):
  90.  
  91.         return self._bfs_with_level(panda1, panda2) > 0
  92.  
  93.     def how_many_gender_in_network(self, level, panda, gender):
  94.  
  95.         return self._bfs_gender_counter(level, panda, gender)
  96.  
  97.  
  98. def main():
  99.         rado = Panda("Rado", "rado@pandamail.com", "male")
  100.         pavli = Panda("Pavli", "pavlin@pandamail.com", "female")
  101.         maria = Panda("maria", "maria@pandamail.com", "female")
  102.         ivo = Panda("Ivo", "ivo@pandamail.bg", "male")
  103.         niki = Panda("Niki", "niki@mail.com", 'male')
  104.         pan = Panda("Pan", 'pan@mail.com', 'male')
  105.  
  106.         network = PandaSocialNetwork()
  107.         network.add_panda(rado)
  108.         network.add_panda(pavli)
  109.         network.add_panda(maria)
  110.         network.add_panda(ivo)
  111.         network.add_panda(niki)
  112.  
  113.         network.make_friends(ivo, rado)
  114.         network.make_friends(rado, pavli)
  115.         network.make_friends(pavli, maria)
  116.         network.make_friends(rado, niki)
  117.  
  118.         print network.how_many_gender_in_network(3, maria, 'male')
  119.  
  120.  
  121. if __name__ == '__main__':
  122.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement