2018-03-25 02:38:34 +03:00
|
|
|
from collections import deque
|
2018-07-15 03:01:57 +03:00
|
|
|
from enum import Enum
|
|
|
|
|
|
|
|
|
2025-06-14 07:53:22 +03:00
|
|
|
class Person:
|
2017-03-05 08:06:28 +03:00
|
|
|
def __init__(self, id, name):
|
|
|
|
self.id = id
|
|
|
|
self.name = name
|
|
|
|
self.friend_ids = []
|
|
|
|
|
2025-06-14 07:53:22 +03:00
|
|
|
def __repr__(self):
|
|
|
|
return f"Person({self.id}, {self.name})"
|
2017-03-05 08:06:28 +03:00
|
|
|
|
|
|
|
|
2025-06-14 07:53:22 +03:00
|
|
|
class LookupService:
|
2017-03-05 08:06:28 +03:00
|
|
|
def __init__(self):
|
2025-06-14 07:53:22 +03:00
|
|
|
self.lookup = {} # key: person_id, value: PersonServer
|
2017-03-05 08:06:28 +03:00
|
|
|
|
|
|
|
def get_person(self, person_id):
|
2025-06-14 07:53:22 +03:00
|
|
|
person_server = self.lookup.get(person_id)
|
|
|
|
if person_server:
|
|
|
|
return person_server.people.get(person_id)
|
|
|
|
return None
|
2017-03-05 08:06:28 +03:00
|
|
|
|
|
|
|
|
2025-06-14 07:53:22 +03:00
|
|
|
class PersonServer:
|
2017-03-05 08:06:28 +03:00
|
|
|
def __init__(self):
|
2025-06-14 07:53:22 +03:00
|
|
|
self.people = {} # key: person_id, value: Person
|
2017-03-05 08:06:28 +03:00
|
|
|
|
|
|
|
def get_people(self, ids):
|
2025-06-14 07:53:22 +03:00
|
|
|
return [self.people[id] for id in ids if id in self.people]
|
2017-03-05 08:06:28 +03:00
|
|
|
|
|
|
|
|
2025-06-14 07:53:22 +03:00
|
|
|
class UserGraphService:
|
|
|
|
def __init__(self, person_ids, lookup: LookupService):
|
2017-03-05 08:06:28 +03:00
|
|
|
self.lookup = lookup
|
|
|
|
self.person_ids = person_ids
|
|
|
|
self.visited_ids = set()
|
|
|
|
|
2025-06-14 07:53:22 +03:00
|
|
|
def bfs(self, source_id, dest_id):
|
|
|
|
source = self.lookup.get_person(source_id)
|
|
|
|
dest = self.lookup.get_person(dest_id)
|
|
|
|
|
|
|
|
if source is None or dest is None:
|
|
|
|
return False
|
|
|
|
|
|
|
|
queue = deque()
|
|
|
|
queue.append(source)
|
|
|
|
self.visited_ids.add(source.id)
|
|
|
|
|
|
|
|
while queue:
|
|
|
|
current_person = queue.popleft()
|
|
|
|
print(current_person)
|
|
|
|
|
|
|
|
if current_person.id == dest.id:
|
|
|
|
return True
|
|
|
|
|
|
|
|
# Get actual Person objects for friends
|
|
|
|
for friend_id in current_person.friend_ids:
|
|
|
|
if friend_id not in self.visited_ids:
|
|
|
|
friend = self.lookup.get_person(friend_id)
|
|
|
|
if friend:
|
|
|
|
queue.append(friend)
|
|
|
|
self.visited_ids.add(friend.id)
|
|
|
|
|
|
|
|
return False
|
|
|
|
|