def topo_sort_bfs(g:Graph): #建立入度表 in_degrees = {} for v in g: if v.id not in in_degrees: in_degrees[v.id] = 0 for nbr in v.getConnections(): in_degrees[nbr.id] = in_degrees.get(nbr.id,0) + 1 # print(in_degrees) #找起始节点 queue = [] for key,value in in_degrees.items(): if value == 0: queue.append(key) #拓扑排序 tuopu = [] while queue: cur_id = queue.pop(0) tuopu.append(cur_id) for nbr in g.getVertex(cur_id).getConnections(): in_degrees[nbr.id] = in_degrees.get(nbr.id) - 1 if in_degrees[nbr.id] == 0: queue.append(nbr.id) #返回结果 return tuopu if len(tuopu) == len(g.getVertices()) else []
def topo_sort_dfs(g:Graph): #找出有入度的节点 in_nodes = set() for v in g: for nbr in v.getConnections(): in_nodes.add(nbr.id) #找出起始节点 start_nodes = [] for node in g.getVertices(): if node not in list(in_nodes): start_nodes.append(node) ''' 对递归版dfs做点改变 ''' def dfs(node:Vertex,path=''): if not node.getConnections(): paths.append(path + node.id) return for nbr in node.getConnections(): dfs(nbr,path + node.id) return paths = [] for node in start_nodes: dfs(g.getVertex(node)) #打印结果 for str in paths: for char in str: print(char,end=' ') print()
n.setPred(closest) n.setDistance(newCost) pq.decreaseKey(n, newCost) return G g = Graph() g.addVertex(0) g.addVertex(1) g.addVertex(2) g.addVertex(3) g.addEdge(0, 1, 10) g.addEdge(1, 0, 10) g.addEdge(0, 2, 6) g.addEdge(2, 0, 6) g.addEdge(0, 3, 5) g.addEdge(3, 0, 5) g.addEdge(1, 3, 15) g.addEdge(3, 1, 15) g.addEdge(2, 3, 4) g.addEdge(3, 2, 4) p = prim(g, g.getVertex(0)) for v in p: if v.getDistance() != sys.maxsize and v.getPred() is not None: print( f'src={v.getPred().getId()}, dest={v.getId()}, weight={v.getDistance()}' )
if new_distance < n.getDistance(): n.setDistance(new_distance) n.setPred(closest) # O(E*logV) pq.decreaseKey(n, new_distance) g = Graph() g.addVertex(0) g.addVertex(1) g.addVertex(2) g.addVertex(3) g.addEdge(0, 1, 10) g.addEdge(0, 2, 6) g.addEdge(0, 3, 5) g.addEdge(1, 3, 15) g.addEdge(2, 3, 4) d = dijsktras(g, g.getVertex(0)) print('Distances from {}: '.format(0), end="\n") print("********************") for v in d: print('Distance to {}: {}'.format(v.getId(), d[v])) print() d_p = dijkstras_pq(g, g.getVertex(0)) print('Distances from {}: '.format(0), end="\n") print("********************") for v in g: print('Distance to {}: {}'.format(v.getId(), v.getDistance())) print()
from pythonds import Graph import timeit from algorithms import Prims from Stats import Display graph = Graph() Display.creategraph(Display, graph) v = graph.getVertex(1) testing = 10 exe = 0 exe2 = 0 # Prim 1 for i in range(testing): start_time = timeit.default_timer() Prims.prim1(Prims, graph, v) time = timeit.default_timer() - start_time exe += time average = exe / testing print("Prim 1 took:", average, 'on average') ''' # Prim 2 for x in range(testing): start_time = timeit.default_timer() Prims.prim2(Prims, graph, v) time = timeit.default_timer() - start_time exe2 += time average = exe2 / testing print("Prim 2 took:", average, 'on average')