# -*- coding: utf-8 -*- from collections import deque from enum import Enum class State(Enum): unvisited = 0 visited = 1 class Graph(object): def bfs(self, source, dest): """ Return True if there is a path from source to dest.""" if source is None: return False queue = deque() queue.append(source) source.visit_state = State.visited while queue: node = queue.popleft() print(node) if dest is node: return True for adjacent_node in node.adj_nodes.values(): if adjacent_node.visit_state == State.unvisited: queue.append(adjacent_node) adjacent_node.visit_state = State.visited return False class Person(object): def __init__(self, id, name): self.id = id self.name = name self.friend_ids = [] class LookupService(object): def __init__(self): self.lookup = {} # key: person_id, value: person_server def get_person(self, person_id): person_server = self.lookup[person_id] return person_server.people[person_id] class PersonServer(object): def __init__(self): self.people = {} # key: person_id, value: person def get_people(self, ids): results = [] for id in ids: if id in self.people: results.append(self.people[id]) return results class UserGraphService(object): def __init__(self, person_ids, lookup): self.lookup = lookup self.person_ids = person_ids self.visited_ids = set() def bfs(self, source, dest): # Use self.visited_ids to track visited nodes # Use self.lookup to translate a person_id to a Person pass