用Python编程BFS-最短路径

用Python编程BFS-最短路径,python,graph,shortest-path,breadth-first-search,Python,Graph,Shortest Path,Breadth First Search,我是Python新手,正在尝试编写BFS以返回图形的最短路径。每条边的长度为6 注意:这是HackerRank上的一个问题 我的代码适用于6个测试用例中的3个,但其他3个测试用例失败。我不知道为什么,也不能真正调试,因为测试用例太大了 我的代码是: # Enter your code here. Read input from STDIN. Print output to STDOUT def shortestPath(): testCases = int(raw_input(

我是Python新手,正在尝试编写BFS以返回图形的最短路径。每条边的长度为6

注意:这是HackerRank上的一个问题

我的代码适用于6个测试用例中的3个,但其他3个测试用例失败。我不知道为什么,也不能真正调试,因为测试用例太大了

我的代码是:

# Enter your code here. Read input from STDIN. Print output to STDOUT    

def shortestPath():
    testCases = int(raw_input())

    for a in range(testCases):
        nodes,edges = raw_input().strip().split(' ')
        numNodes,edges = [int(nodes), int(edges)]

        edgeList = []

        # input data
        for b in range(edges):
            a,b = raw_input().strip().split(' ')
            a,b = [int(a), int(b)]
            edgeList += [[a,b]]
        root = int(raw_input())

        marked = [] # what I've checked
        fringe = [root] # things to check
        distances = {} # what to return
        levels = {root: 0} # the level of each element
        counter = 1

        # do the BFS
        while fringe != []:
            node = fringe[0]
            fringe.remove(node)
            marked += [node]
            if counter > levels[node] + 1:
                counter = levels[node] + 1
            nbrsList = Nbrs(node, edgeList)
            for v in nbrsList:
                levels[v] = counter
                if v not in fringe and v not in marked:
                    distances[v] = 6*counter
                    fringe += [v]
            counter += 1

        listOfNodes = nodeList(edgeList, numNodes)

        for node in listOfNodes:
            if node != root:
                if node in distances:
                    print distances[node],
                else:
                    print -1,  
        print ""
    print ""

def nodeList(edges, numNodes):
    nodes = []
    for edge in edges:
        for element in edge:
            if element not in nodes:
                nodes += [element]
    nodes.sort()

    for x in range(1,numNodes+1):
        if x not in nodes:
            nodes += [x]
    nodes.sort()
    return nodes


def Nbrs(node, edges):
    tempList = []
    for edge in edges:
        if node in edge:
            for element in edge:
                if element != node:
                    tempList += [element]
    return tempList
例如,我使用了以下测试用例:

1
5.8
1.2
34
4.5
5.2
2.4
2.3
13
14
三,

其中第一行是测试用例的数量,第二行是节点的数量,边的数量,剩下的n-1行是边,最后一行是根

这非常有效。我试着把它改成我能想到的任何东西,它似乎起了作用。然而,对于站点的70个节点和1988个边缘的测试用例,我的答案对于许多节点来说太高了

我们将非常感谢您的任何帮助


提前感谢,

编辑:我发现的最初的“问题”状况是错误的,现在已更正

如何设置
计数器
级别
有问题

假设
R
是根节点,
A
B
C
是其他节点,则当前代码在

R <-> A
A <-> B
R <-> B
B <-> C

它究竟是如何失败的?超出语法、运行时、时间限制?为什么测试用例的大小会阻止调试?我们如何在没有看到测试用例的情况下知道哪里出了问题?我得到的答案是错误的。一定是某个地方有逻辑错误,但我不知道它在哪里。我曾经尝试过用循环创建更小的图,一个访问每个节点的根,但所有这些似乎都很好。很少有人会通读你所有的问题和代码。如果你想增加得到答案的机会,我建议你添加一个简单的例子来说明这个问题。非常感谢。
for v in nbrsList:
    if v not in fringe and v not in marked:
        levels[v] = counter
        distances[v] = 6*counter
        fringe += [v]