我找不到角落的情况

时间:2015-01-30 02:38:32

标签: python algorithm

问题规范在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)

我找不到角落的情况。

它通过了示例案例,但它没有通过其他一些案例。

出了什么问题?

1 个答案:

答案 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问题的解决方案中犯了类似的错误,可能会有问题。