while queue: vertex = queue.popleft() print(vertex) for neighbour in graph[vertex]: if neighbour notin visited: visited.add(neighbour) queue.append(neighbour)
defdijkstra(graph, start): distances = {node: float('infinity') for node in graph} distances[start] = 0 pq = [(0, start)] while pq: current_distance, current_node = heapq.heappop(pq) if current_distance > distances[current_node]: continue for neighbor, weight in graph[current_node].items(): distance = current_distance + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(pq, (distance, neighbor)) return distances
Floyd-Warshall算法
用于找到图中所有顶点对之间的最短路径。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
deffloyd_warshall(graph): dist = {node: {node: float('inf') for node in graph} for node in graph} for node in graph: dist[node][node] = 0 for neighbor, weight in graph[node].items(): dist[node][neighbor] = weight for k in graph: for i in graph: for j in graph: dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]) return dist
defkruskal(graph): result = [] i, e = 0, 0 graph = sorted(graph, key=lambda item: item[2]) parent = [] rank = [] for node inrange(len(graph)): parent.append(node) rank.append(0) while e < len(graph) - 1: u, v, w = graph[i] i = i + 1 x = find(parent, u) y = find(parent, v) if x != y: e = e + 1 result.append([u, v, w]) union(parent, rank, x, y) return result
deftopological_sort(graph): in_degree = {u: 0for u in graph} for u in graph: for v in graph[u]: in_degree[v] += 1 queue = deque([u for u in in_degree if in_degree[u] == 0]) result = [] while queue: u = queue.popleft() result.append(u) for v in graph[u]: in_degree[v] -= 1 if in_degree[v] == 0: queue.append(v) iflen(result) != len(graph): returnNone# Graph has a cycle return result