for neighbour in G[current]: # Для соседа этой вершины if neighbour not in fired: # Если он не пройден fired.append(neighbour) queue.append(neighbour) edge = (current, neighbour) # Ребро - кортеж вершины и ее соседа edge_list.append(edge) return edge_list, fired # Вернуть первый для дальнейшей отрисовки, второй для проверки связности G = getter.get_graph() edge_list, woken = bfs(G, 'Апельсиновый') # Ребра основного дерева и список пройденных вершин n = 1 # Кол-во компонент связности while len(woken) != len(G.nodes()): # Пока не все вершины пройдены for node in G.nodes(): if node not in woken: edge_part, woken_part = bfs(G, node, [], []) # Часть ребер и вершин, которые не были пройдены ранее # По идее функция должна вызываться по умолчанию с пустыми массивами, но почему-то запоминает прежние значения edge_list += edge_part woken += woken_part n += 1 print('Кол-во компонент связности:', n) if n == 1: print('Граф связный') else: print('Граф несвязный') nx.draw_networkx_edges(G, getter.rendering(G), edge_list, width=8, alpha=0.5, edge_color='g') # Отрисовываем основное дерево plt.axis('off') plt.show()
import matplotlib.pyplot as plt import networkx as nx import getter import dijkstra as d G = getter.get_graph() short_paths_list = {} for node in G.nodes(): short_paths_list[node] = d.dijkstra(G,node) town_1 = input('Ищем кратчайший путь от ') town_2 = input('до ') current = town_2 edge_list = [] # Массив ребер кратчайшего пути (для отрисовки этих ребер) while current != town_1: for neighbour in G[current]: path_to_current = short_paths_list[town_1][current] path_to_neighbour = short_paths_list[town_1][neighbour] weight = int(G[current][neighbour]['weight']) if path_to_current - path_to_neighbour == weight: edge_list.append((current, neighbour)) current = neighbour break if current == town_2: print('Пути не существует') break nx.draw_networkx_edges(G, getter.rendering(G), edge_list, width=6, alpha=1, edge_color='r') # Отрисовываем кратчайший путь plt.axis('off') plt.show()