用Python编程BFS-最短路径
我是Python新手,正在尝试编写BFS以返回图形的最短路径。每条边的长度为6 注意:这是HackerRank上的一个问题 我的代码适用于6个测试用例中的3个,但其他3个测试用例失败。我不知道为什么,也不能真正调试,因为测试用例太大了 我的代码是:用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(
# 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
例如,我使用了以下测试用例:
15.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]