问题规范在https://www.dropbox.com/s/lmwxcsp3lie0x3n/437.pdf?dl=0
我的解决方案位于http://ideone.com/3JsFCq
name = raw_input()
D = int(raw_input()) #degree of separation
N = int(raw_input()) #number of links
M = int(raw_input()) #book users
users = {}
books = {}
def build_edges(user1, user2):
if user1 not in users:
users[user1] = set([user2, ])
else:
users[user1].add(user2)
for i in xrange(N):
nw = raw_input()
us = nw.split('|')
build_edges(us[0], us[1])
build_edges(us[1], us[0])
def build_booklist(user1, book):
if user1 not in books:
users[user1] = []
else:
users[user1].append(user2)
for i in xrange(M):
bk = raw_input().split('|')
books[bk[0]] = []
for book in bk[1:]:
books[bk[0]].append(book)
rec = []
depth = [0,]
def bfs(graph, start):
visited, queue = set(), [start]
while queue:
vertex = queue.pop(0)
if vertex not in visited:
visited.add(vertex)
for book in books[vertex]:
if book not in books[start]:
rec.append(book)
queue.extend(graph[vertex] - visited)
depth[0] += 1
if depth[0] > D:
return
return visited
bfs(users, name)
print len(rec)
我找不到角落的情况。
它通过了示例案例,但它没有通过其他一些案例。
出了什么问题?
答案 0 :(得分:0)
您的问题是每次处理顶点时都会增加depth
。相反,您需要为每个顶点存储深度,并在遇到比给定的depth
更大的顶点时停止。
例如,如果Alice有两个朋友Bob和Carl,那么当您处理Alice时,您将深度设置为1.然后当您处理Bob时,您将其设置为2,并在处理Carl之前停止,距离爱丽丝有一段距离。相反,您应该将Alice的深度设置为0,然后在将Bob和Carl添加到队列时,将其深度设置为1,然后处理它们。当你处理它们的时候,你加入他们尚未见过的朋友,深度为2,一旦你在主循环中遇到任何一个(从队列中弹出),你就会停止。
更新:同样,在初始化时,将第一个顶点添加到访问集。否则,您将把它作为深度为2的顶点处理(您将添加Alice的朋友Bob深度为1,然后Alice作为Bob的距离为2的朋友)。它在这个特定的问题上并没有什么坏处,但如果你在其他BFS问题的解决方案中犯了类似的错误,可能会有问题。