class V(object):
def __init__(self, address):
self.address = address # adres tego kompa
self.h = [] # lista sasiadow
self.status = 0 # do BFSa
def add_h(self, h): # dodaje obiekt wierzcholka do siasiadow
if h not in self.h:
self.h.append(h)
def set_status(self, s): # zmienia status tego wierzcholka
self.status = s
def check_h(self, looking_for): # sprawdza swoich sasiadow pod katem pasujacego adresu
self.status = 1
for v in self.h:
if v.status == 0:
if v.address == looking_for:
return True
if v.check_h(looking_for) == True:
return True
return False
class Graph(object):
def __init__(self):
self.v = []
def add(self, v): # dodaje obiekt wierzcholka do wierzcholkow grafu
if v not in self.v:
self.v.append(v)
def get(self, v): # zwraca wierzcholek o podanym adresie
for i in self.v:
if i.address == v:
return i
def add_connection(self, u, v): # dla podanych adresow tworzy polaczenie
if not self.get(u):
self.add(V(u))
if not self.get(v):
self.add(V(v))
uu = self.get(u)
vv = self.get(v)
uu.add_h(vv)
vv.add_h(uu)
def test(self, u, v): # sprawdza czy istnieje polaczenie miedzy danymi adresami
for i in self.v:
i.set_status(0)
if self.get(u):
return self.get(u).check_h(v)
return False
ins = [
'B 100.100.100.1 100.100.100.2',
'B 100.100.100.1 100.100.100.3',
'B 100.100.100.10 100.100.100.11',
'T 100.100.100.1 100.100.100.3',
'T 100.100.100.10 100.100.100.2',
'T 100.100.100.10 100.100.100.11',
'B 100.100.100.11 100.100.100.2',
'T 100.100.100.10 100.100.100.3',
'T 100.100.100.100 100.100.100.103'
]
g = Graph()
for line in ins:
line = line.strip().split()
if line[0] == 'T':
print 'T' if g.test(line[1], line[2]) else 'N'
else:
g.add_connection(line[1], line[2])
Y2xhc3MgVihvYmplY3QpOgoJZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3MpOgoJCXNlbGYuYWRkcmVzcyA9IGFkZHJlc3MgIyBhZHJlcyB0ZWdvIGtvbXBhCgkJc2VsZi5oID0gW10gIyBsaXN0YSBzYXNpYWRvdwoJCXNlbGYuc3RhdHVzID0gMCAjIGRvIEJGU2EKCglkZWYgYWRkX2goc2VsZiwgaCk6ICMgZG9kYWplIG9iaWVrdCB3aWVyemNob2xrYSBkbyBzaWFzaWFkb3cKCQlpZiBoIG5vdCBpbiBzZWxmLmg6CgkJCXNlbGYuaC5hcHBlbmQoaCkKCglkZWYgc2V0X3N0YXR1cyhzZWxmLCBzKTogIyB6bWllbmlhIHN0YXR1cyB0ZWdvIHdpZXJ6Y2hvbGthCgkJc2VsZi5zdGF0dXMgPSBzCgoJZGVmIGNoZWNrX2goc2VsZiwgbG9va2luZ19mb3IpOiAjIHNwcmF3ZHphIHN3b2ljaCBzYXNpYWRvdyBwb2Qga2F0ZW0gcGFzdWphY2VnbyBhZHJlc3UKCQlzZWxmLnN0YXR1cyA9IDEKCQlmb3IgdiBpbiBzZWxmLmg6CgkJCWlmIHYuc3RhdHVzID09IDA6CgkJCQlpZiB2LmFkZHJlc3MgPT0gbG9va2luZ19mb3I6CgkJCQkJcmV0dXJuIFRydWUKCQkJCWlmIHYuY2hlY2tfaChsb29raW5nX2ZvcikgPT0gVHJ1ZToKCQkJCQlyZXR1cm4gVHJ1ZQoJCXJldHVybiBGYWxzZQoKY2xhc3MgR3JhcGgob2JqZWN0KToKCWRlZiBfX2luaXRfXyhzZWxmKToKCQlzZWxmLnYgPSBbXQoKCWRlZiBhZGQoc2VsZiwgdik6ICMgZG9kYWplIG9iaWVrdCB3aWVyemNob2xrYSBkbyB3aWVyemNob2xrb3cgZ3JhZnUKCQlpZiB2IG5vdCBpbiBzZWxmLnY6CgkJCXNlbGYudi5hcHBlbmQodikKCglkZWYgZ2V0KHNlbGYsIHYpOiAjIHp3cmFjYSB3aWVyemNob2xlayBvIHBvZGFueW0gYWRyZXNpZQoJCWZvciBpIGluIHNlbGYudjoKCQkJaWYgaS5hZGRyZXNzID09IHY6CgkJCQlyZXR1cm4gaQoKCWRlZiBhZGRfY29ubmVjdGlvbihzZWxmLCB1LCB2KTogIyBkbGEgcG9kYW55Y2ggYWRyZXNvdyB0d29yenkgcG9sYWN6ZW5pZQoJCWlmIG5vdCBzZWxmLmdldCh1KToKCQkJc2VsZi5hZGQoVih1KSkKCgkJaWYgbm90IHNlbGYuZ2V0KHYpOgoJCQlzZWxmLmFkZChWKHYpKQoKCQl1dSA9IHNlbGYuZ2V0KHUpCgkJdnYgPSBzZWxmLmdldCh2KQoKCQl1dS5hZGRfaCh2dikKCQl2di5hZGRfaCh1dSkKCglkZWYgdGVzdChzZWxmLCB1LCB2KTogIyBzcHJhd2R6YSBjenkgaXN0bmllamUgcG9sYWN6ZW5pZSBtaWVkenkgZGFueW1pIGFkcmVzYW1pCgkJZm9yIGkgaW4gc2VsZi52OgoJCQlpLnNldF9zdGF0dXMoMCkKCQlpZiBzZWxmLmdldCh1KToKCQkJcmV0dXJuIHNlbGYuZ2V0KHUpLmNoZWNrX2godikKCQlyZXR1cm4gRmFsc2UKCmlucyA9IFsKJ0IgMTAwLjEwMC4xMDAuMSAxMDAuMTAwLjEwMC4yJywKJ0IgMTAwLjEwMC4xMDAuMSAxMDAuMTAwLjEwMC4zJywKJ0IgMTAwLjEwMC4xMDAuMTAgMTAwLjEwMC4xMDAuMTEnLAonVCAxMDAuMTAwLjEwMC4xIDEwMC4xMDAuMTAwLjMnLAonVCAxMDAuMTAwLjEwMC4xMCAxMDAuMTAwLjEwMC4yJywKJ1QgMTAwLjEwMC4xMDAuMTAgMTAwLjEwMC4xMDAuMTEnLAonQiAxMDAuMTAwLjEwMC4xMSAxMDAuMTAwLjEwMC4yJywKJ1QgMTAwLjEwMC4xMDAuMTAgMTAwLjEwMC4xMDAuMycsCidUIDEwMC4xMDAuMTAwLjEwMCAxMDAuMTAwLjEwMC4xMDMnCl0KZyA9IEdyYXBoKCkKCmZvciBsaW5lIGluIGluczoKCWxpbmUgPSBsaW5lLnN0cmlwKCkuc3BsaXQoKQoJaWYgbGluZVswXSA9PSAnVCc6CgkJcHJpbnQgJ1QnIGlmIGcudGVzdChsaW5lWzFdLCBsaW5lWzJdKSBlbHNlICdOJwoJZWxzZToKCQlnLmFkZF9jb25uZWN0aW9uKGxpbmVbMV0sIGxpbmVbMl0pCgo=