Python 2.7 优化广度优先搜索

Python 2.7 优化广度优先搜索,python-2.7,optimization,graph-theory,breadth-first-search,Python 2.7,Optimization,Graph Theory,Breadth First Search,对于这个特殊的图论,我得到了超时错误。我尽可能地优化我的代码,但它仍然没有达到针对这个问题的HackerRank性能标准。为了给你一个基本的概述,我首先假设一个完全连通的图,并在它上面运行一个BFS,避免了城市道路的边缘。但是,我没有为每个测试用例创建实际的图形,而是创建了一个生成器,让我的BFS函数只遍历当前节点通过村庄边缘连接到的节点。任何关于如何优化它的提示都将不胜感激 from collections import deque T = input() # BFS def return_

对于这个特殊的图论,我得到了超时错误。我尽可能地优化我的代码,但它仍然没有达到针对这个问题的HackerRank性能标准。为了给你一个基本的概述,我首先假设一个完全连通的图,并在它上面运行一个BFS,避免了城市道路的边缘。但是,我没有为每个测试用例创建实际的图形,而是创建了一个生成器,让我的BFS函数只遍历当前节点通过村庄边缘连接到的节点。任何关于如何优化它的提示都将不胜感激

from collections import deque
T = input()

# BFS
def return_nodes(N,a,edges):
    for i in xrange(1,N+1):
        if i != a and (i,a) not in edges and (a,i) not in edges:
            yield i

def bfs(start,N,edges):
    S,q,dist = set(),deque(),{}
    S.add(start)
    q.append(start)
    dist[start] = 0
    while q:
        current_node = q.popleft()
        for i in return_nodes(N,current_node,edges):
            if i in S: continue
            S.add(i)
            q.append(i)
            dist[i] = dist[current_node] + 1
    return dist

for i in xrange(T):
    N,M = map(int,raw_input().split())
    # Main roads/edges
    main_edges = set()
    for j in xrange(M):
        a,b = map(int,raw_input().split())
        main_edges.add((a,b))
    start = input()
    dist = bfs(start,N,main_edges)
    for k in dist:
        if k != start:
            print dist[k],
    print " "

N
顶点上生成一个完整的图,然后删除输入中经过的边(即城镇道路),这将留下一个只包含乡村道路的图-然后在这个稀疏图上运行BFS(或Dijkstra算法,没有终点)。我以前做过。这花费了O(N^2)个时间,我收到了更多的超时错误。请维护一组未访问的顶点和要访问的顶点优先级队列(按距离排序,最初,只有距离为零的起始顶点)然后,当每个顶点从优先级队列中移除并被访问时,将其从该未访问集中移除,并仅将那些剩余的未访问顶点(距离增加)添加到优先级队列中,这些顶点未通过道路连接。