During an Animal Day event, N people (numbered from 0 to N−1) showed up. Each of them had either a dog or a cat. The organizers decided to give them a wonderful gift: a toy for each animal.
After the event, it turned out that some people who owned a dog had received a cat-toy, and some people who owned a cat received a dog-toy. People may exchange toys, but only if they know each other (otherwise they have no way to contact the other person). The pair of people can exchange toys multiple times.
Knowing who knows who, who owns which animal, and what kind of toy he or she received, can you determine whether it is possible for people to exchange toys in such a way that every dog ends up with a dog-toy and every cat gets a cat-toy?
Write a function:
def solution(P, T, A, B)
that returns True if it is possible to exchange toys in such a way that every animal receives an appropriate toy, or False otherwise. First two arrays describe the pets (array P) and toys (array T) that every person owns. The J-th person owns pet P[J] and toy T[J] (1 means dog or dog-toy and 2 means cat or cat-toy). The next two arrays, A and B, both of length M, describe the relationships between people. For each integer K from 0 to M−1, person A[K] knows person B[K].
Examples:
1. Given:
P = [1, 1, 2] T = [2, 1, 1] A = [0, 2] B = [1, 1]the function should return True. Person 0 can exchange toys with person 1 to obtain a dog-toy, and then person 1 can exchange toys with person 2.
2. Given:
P = [2, 2, 1, 1, 1] T = [1, 1, 1, 2, 2] A = [0, 1, 2, 3] B = [1, 2, 0, 4]the function should return False. There is no way for persons 3 and 4 to exchange toys with others.
3. Given:
P = [1, 1, 2, 2, 1, 1, 2, 2] T = [1, 1, 1, 1, 2, 2, 2, 2] A = [0, 2, 4, 6] B = [1, 3, 5, 7]the function should return False. There is no way for persons 2 and 3 and for persons 4 and 5 to exchange toys with others.
4. Given:
P = [2, 2, 2, 2, 1, 1, 1, 1] T = [1, 1, 1, 1, 2, 2, 2, 2] A = [0, 1, 2, 3, 4, 5, 6] B = [1, 2, 3, 4, 5, 6, 7]the function should return True.
Write an efficient algorithm for the following assumptions:
- N is an integer within the range [1..100,000];
- M is an integer within the range [0..200,000];
- each element of arrays P and T is an integer that can have one of the following values: 1, 2;
- each element of arrays A and B is an integer within the range [0..N-1];
- for each integer K from 0 to M−1, elements A[K] and B[K] are different;
- there are no redundant elements in arrays A, B; more formally every unordered pair of persons a, b will appear as A[K], B[K] for at most one K.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
pass
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]]
pass
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]]
pass
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].add(nodes[B[i]])
nodes[B[i]].add(nodes[A[i]])
pass
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
pass
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots =
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
node = Node()
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
node = nodes
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
nodes = set(nodes.values())
node = nodes
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
nodes = set(nodes.values())
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
nodes = set(nodes.)
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
nodes = set(nodes.keys())
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
nodes = set(nodes.keys())
while nodes:
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
nodes = set(nodes.keys())
while nodes:
node = nodes.pop()
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
keys = set(nodes.keys())
while nodes:
node = nodes[keys.pop()]
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
keys = set(nodes.keys())
while nodes:
node = nodes[keys.pop()]
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
graph = []
keys = set(nodes.keys())
def iterate(node):
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
keys = set(nodes.keys())
while nodes:
node = nodes[keys.pop()]
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
graph = []
current = []
keys = set(nodes.keys())
def iterate(node):
current.add(node)
for friend in node.friends:
iterate(friend)
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
keys = set(nodes.keys())
while nodes:
node = nodes[keys.pop()]
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
graph = []
current = []
keys = set(nodes.keys())
def iterate(node):
key
current.add(node)
for friend in node.friends:
iterate(friend)
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
keys = set(nodes.keys())
while nodes:
node = nodes[keys.pop()]
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
graph = []
current = []
keys = set(nodes.keys())
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.add(node)
for friend in node.friends:
iterate(friend)
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
keys = set(nodes.keys())
while nodes:
node = nodes[keys.pop()]
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
if not nodes:
return []
graph = []
current = []
keys = set(nodes.keys())
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.add(node)
for friend in node.friends:
iterate(friend)
while keys:
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
keys = set(nodes.keys())
while nodes:
node = nodes[keys.pop()]
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
if not nodes:
return []
graph = []
current = []
keys = set(nodes.keys())
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.add(node)
for friend in node.friends:
iterate(friend)
while keys:
iterate(keys)
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
keys = set(nodes.keys())
while nodes:
node = nodes[keys.pop()]
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
if not nodes:
return []
graph = []
current = []
keys = set(nodes.keys())
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.add(node)
for friend in node.friends:
iterate(friend)
while keys:
iterate(nkeys)
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
keys = set(nodes.keys())
while nodes:
node = nodes[keys.pop()]
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
if not nodes:
return []
graph = []
current = []
keys = set(nodes.keys())
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.add(node)
for friend in node.friends:
iterate(friend)
while keys:
iterate(next(iter(keys)))
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
keys = set(nodes.keys())
while nodes:
node = nodes[keys.pop()]
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
if not nodes:
return []
graph = []
current = []
keys = set(nodes.keys())
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.add(node)
for friend in node.friends:
iterate(friend)
while keys:
iterate(next(iter(keys)))
graph.append(current)
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
keys = set(nodes.keys())
while nodes:
node = nodes[keys.pop()]
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.add(node)
for friend in node.friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
keys = set(nodes.keys())
while nodes:
node = nodes[keys.pop()]
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.add(node)
for friend in node.friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
keys = set(nodes.keys())
while nodes:
node = nodes[keys.pop()]
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# asumes
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.add(node)
for friend in node.friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
roots = []
current = []
keys = set(nodes.keys())
while nodes:
node = nodes[keys.pop()]
node = nodes.
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.add(node)
for friend in node.friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
graph = buildGraph(nodes)
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.add(node)
for friend in node.friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
graph = buildGraph(nodes)
for nodes in graph:
collections.Counter()
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.add(node)
for friend in node.friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
graph = buildGraph(nodes)
for nodes in graph:
pets = collections.Counter([n.pets for n in nodes])
toys = collections.Counter([n.toys for n in nodes])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.append(node)
for friend in node.friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.add(nodes[B[i]])
nodes[B[i]].friends.add(nodes[A[i]]) # Is it transitive???
graph = buildGraph(nodes)
for nodes in graph:
pets = collections.Counter([n.pets for n in nodes])
toys = collections.Counter([n.toys for n in nodes])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.append(node)
for friend in node.friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(nodes[B[i]])
nodes[B[i]].friends.append(nodes[A[i]]) # Is it transitive???
graph = buildGraph(nodes)
for nodes in graph:
pets = collections.Counter([n.pets for n in nodes])
toys = collections.Counter([n.toys for n in nodes])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.append(node)
for friend in node.friends:
iterate(friend)
graph = []
while keys:
iterate(nodes[next(iter(keys)))
graph.append(current)
current
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(nodes[B[i]])
nodes[B[i]].friends.append(nodes[A[i]]) # Is it transitive???
graph = buildGraph(nodes)
for nodes in graph:
pets = collections.Counter([n.pets for n in nodes])
toys = collections.Counter([n.toys for n in nodes])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.append(node)
for friend in node.friends:
iterate(friend)
graph = []
while keys:
iterate(nodes[next(iter(keys))])
graph.append(current)
current
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(nodes[B[i]])
nodes[B[i]].friends.append(nodes[A[i]]) # Is it transitive???
graph = buildGraph(nodes)
for nodes in graph:
pets = collections.Counter([n.pets for n in nodes])
toys = collections.Counter([n.toys for n in nodes])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.append(node)
for friend in node.friends:
iterate(friend)
graph = []
while keys:
iterate(nodes[next(iter(keys))])
graph.append(current)
current
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(nodes[B[i]])
nodes[B[i]].friends.append(nodes[A[i]]) # Is it transitive???
graph = buildGraph(nodes)
for nodes in graph:
pets = collections.Counter([n.pet for n in nodes])
toys = collections.Counter([n.toy for n in nodes])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.append(node)
for friend in node.friends:
iterate(friend)
graph = []
while keys:
iterate(nodes[next(iter(keys))])
graph.append(current)
current
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(odes[B[i]])
nodes[B[i]].friends.append(nodes[A[i]]) # Is it transitive???
graph = buildGraph(nodes)
for nodes in graph:
pets = collections.Counter([n.pet for n in nodes])
toys = collections.Counter([n.toy for n in nodes])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(node):
if node.person not in keys:
return
keys.remove(node.person)
current.append(node)
for friend in node.friends:
iterate(friend)
graph = []
while keys:
iterate(nodes[next(iter(keys))])
graph.append(current)
current
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i]) # Is it transitive???
graph = buildGraph(nodes)
for nodes in graph:
pets = collections.Counter([n.pet for n in nodes])
toys = collections.Counter([n.toy for n in nodes])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(person):
if person not in keys:
return
keys.remove(person)
node = nodes[person]
current.append(node)
for friend in node.friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i]) # Is it transitive???
graph = buildGraph(nodes)
for nodes in graph:
pets = collections.Counter([n.pet for n in nodes])
toys = collections.Counter([n.toy for n in nodes])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(person):
if person not in keys:
return
keys.remove(person)
current.append(person)
node = nodes[person]
for friend in node.friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i]) # Is it transitive???
graph = buildGraph(nodes)
for nodes in graph:
pets = collections.Counter([n.pet for n in nodes])
toys = collections.Counter([n.toy for n in nodes])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(person):
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i]) # Is it transitive???
graph = buildGraph(nodes)
for nodes in graph:
pets = collections.Counter([n.pet for n in nodes])
toys = collections.Counter([n.toy for n in nodes])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(person):
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i]) # Is it transitive???
graph = buildGraph(nodes)
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(person):
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i]) # Is it transitive???
graph = buildGraph(nodes)
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(person):
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i]) # Is it transitive???
graph = buildGraph(nodes)
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(person):
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i]) # Is it transitive???
graph = buildGraph(nodes)
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(person):
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i]) # Is it transitive???
graph = buildGraph(nodes)
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph, i
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(person):
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i]) # Is it transitive???
graph = buildGraph(nodes)
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph, i.e. contact info is two-way
if not nodes:
return []
keys = set(nodes.keys())
current = []
def iterate(person):
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i]) # Is it transitive???
graph = buildGraph(nodes)
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
current = []
def iterate(person):
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
graph = []
while keys:
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i]) # Is it transitive???
graph = buildGraph(nodes)
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
graph = []
while keys:
# find th
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i]) # Is it transitive???
graph = buildGraph(nodes)
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i]) # Is it transitive???
graph = buildGraph(nodes)
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i]) # Is it transitive???
graph = buildGraph(nodes)
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
graph = buildGraph(nodes)
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
graph = buildGraph(nodes)
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = buildGraph(nodes)
# check that each connected social graph has the same
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def buildGraph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = buildGraph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = buildGraph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
graph = []
while keys:
current = []
nexts = []
graph.append(current)
return graph
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
graph = []
while keys:
current = []
nexts = [next(iter(keys))]
while nexts:
graph.append(current)
return graph
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
graph = []
while keys:
current = []
candidates = [next(iter(keys))]
while candidates:
candidate = candidates.pop()
graph.append(current)
return graph
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
graph = []
while keys:
current = []
candidates = [next(iter(keys))]
while candidates:
candidate = candidates.pop()
if candidate not in keys:
continue
keys.remove(candidate)
graph.append(current)
return graph
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
graph = []
while keys:
current = []
candidates = [next(iter(keys))]
while candidates:
person = candidates.pop()
if person not in keys:
continue
keys.remove(person)
current.append(person)
candidates.extend()
graph.append(current)
return graph
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
graph = []
while keys:
current = []
candidates = [next(iter(keys))]
while candidates:
person = candidates.pop()
if person not in keys:
continue
keys.remove(person)
current.append(person)
candidates.extend(nodes[person].friends)
graph.append(current)
return graph
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
graph = []
while keys:
current = []
candidates = [next(iter(keys))]
while candidates:
person = candidates.pop()
if person not in keys:
continue
keys.remove(person)
current.append(person)
candidates.extend(nodes[person].friends)
graph.append(current)
return graph
'''
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
'''
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
graph = []
while keys:
current = []
candidates = [next(iter(keys))]
while candidates:
person = candidates.pop()
if person not in keys:
continue
keys.remove(person)
current.append(person)
candidates.extend(nodes[person].friends)
graph.append(current)
return graph
'''
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
'''
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
# fil
graph = []
while keys:
current = []
candidates = [next(iter(keys))]
while candidates:
person = candidates.pop()
if person not in keys:
continue
keys.remove(person)
current.append(person)
candidates.extend(nodes[person].friends)
graph.append(current)
return graph
'''
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
'''
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
# fill in a list of connected social graphs
graph = []
while keys:
# build the current social graph based on an arbitrary (remaining) starting node
current = []
candidates = [next(iter(keys))]
while candidates:
person = candidates.pop()
if person not in keys:
continue
keys.remove(person)
current.append(person)
candidates.extend(nodes[person].friends)
graph.append(current)
return graph
'''
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
'''
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
# fill in a list of connected social graphs
graph = []
while keys:
# build the current social graph based on an arbitrary (remaining) starting node
current = []
candidates = [next(iter(keys))]
#
while candidates:
person = candidates.pop()
if person not in keys:
continue
keys.remove(person)
current.append(person)
candidates.extend(nodes[person].friends)
graph.append(current)
return graph
'''
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
'''
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
# fill in a list of connected social graphs
graph = []
while keys:
# build the current social graph based on an arbitrary (remaining) starting node
current = []
candidates = [next(iter(keys))]
# depth-first traversal through the nodes
while candidates:
person = candidates.pop()
if person not in keys:
continue
keys.remove(person)
current.append(person)
candidates.extend(nodes[person].friends)
graph.append(current)
return graph
'''
keys = set(nodes.keys())
current = []
def iterate(person):
# recurse to find all the people in this section of the social graph
if person not in keys:
return
keys.remove(person)
current.append(person)
for friend in nodes[person].friends:
iterate(friend)
# fill in a list of connected social graphs
graph = []
while keys:
# find the next (arbitrary) connected social graph
iterate(next(iter(keys)))
graph.append(current)
current = []
return graph
'''
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
# fill in a list of connected social graphs
graph = []
while keys:
# build the current social graph based on an arbitrary (remaining) starting node
current = []
candidates = [next(iter(keys))]
# depth-first traversal through the nodes
while candidates:
person = candidates.pop()
if person not in keys:
continue
keys.remove(person)
current.append(person)
candidates.extend(nodes[person].friends)
graph.append(current)
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
# fill in a list of connected social graphs
graph = []
while keys:
# build the current social graph based on an arbitrary (remaining) starting node
current = []
candidates = [next(iter(keys))]
# depth-first traversal through the nodes
while candidates:
person = candidates.pop()
if person not in keys:
continue
keys.remove(person)
current.append(person)
candidates.extend(nodes[person].friends)
graph.append(current)
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
# fill in a list of connected social graphs
graph = []
while keys:
# build the current social graph based on an arbitrary (remaining) starting node
current = []
candidates = [next(iter(keys))]
# depth-first traversal through the nodes
while candidates:
person = candidates.pop()
if person not in keys:
continue
keys.remove(person)
current.append(person)
candidates.extend(nodes[person].friends)
graph.append(current)
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
# fill in a list of connected social graphs
graph = []
while keys:
# build the current social graph based on an arbitrary (remaining) starting node
current = []
candidates = [next(iter(keys))]
# depth-first traversal through the nodes
while candidates:
person = candidates.pop()
if person not in keys:
continue
keys.remove(person)
current.append(person)
candidates.extend(nodes[person].friends)
graph.append(current)
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
[[], [], [], []]
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
# fill in a list of connected social graphs
graph = []
while keys:
# build the current social graph based on an arbitrary (remaining) starting node
current = []
candidates = [next(iter(keys))]
# depth-first traversal through the nodes
while candidates:
person = candidates.pop()
if person not in keys:
continue
keys.remove(person)
current.append(person)
candidates.extend(nodes[person].friends)
graph.append(current)
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
[[], [], [], []]
# you can write to stdout for debugging purposes, e.g.
# print("this is a debug message")
import collections
Node = collections.namedtuple('Node', ['person', 'pet', 'toy', 'friends'])
def build_graph(nodes):
# assumes undirected graph, i.e. contact info is two-way
keys = set(nodes.keys())
# fill in a list of connected social graphs
graph = []
while keys:
# build the current social graph based on an arbitrary (remaining) starting node
current = []
candidates = [next(iter(keys))]
# depth-first traversal through the nodes
while candidates:
person = candidates.pop()
if person not in keys:
continue
keys.remove(person)
current.append(person)
candidates.extend(nodes[person].friends)
graph.append(current)
return graph
def solution(P, T, A, B):
# write your code in Python 3.6
nodes = {}
# create each person node with no friends
for i in range(len(P)):
nodes[i] = Node(i, P[i], T[i], [])
# fill in the friendships
for i in range(len(A)):
nodes[A[i]].friends.append(B[i])
nodes[B[i]].friends.append(A[i])
# find all the connected social graphs (for trading toys)
graph = build_graph(nodes)
# check that each connected social graph has the same number of pets as toys for each animal type
for persons in graph:
pets = collections.Counter([nodes[p].pet for p in persons])
toys = collections.Counter([nodes[p].toy for p in persons])
if pets != toys:
return False
return True
The solution obtained perfect score.