def cria(G, pesos, pos):
"""
Descrição
mesma funçao de plot_weighted_graph, mas nao eh necessario calcular
os pesos das arestas, que ja foram definidos em plot_weighted_graph
e agora serão reutilizados.
tambem são reaproveitados as posiçoes dos vertices e arestas
definidas na outra função
"""
plt.figure();
# plotar vertices
nx.draw_networkx_nodes(G, pos);
# plotar rótulos dos vertices
nx.draw_networkx_labels(G, pos);
# plotar arestas
nx.draw_networkx_edges(G, pos);
# plotar rótulos das arestas
nx.draw_networkx_edge_labels(
G, pos, edge_labels=pesos, font_size=10, font_family='sans-serif');
# plotar G
plt.show();
a = np.loadtxt('cidades2.txt')
# Obtem as coordenadas em que o peso é não-nulo
rows, cols = np.where(a>0)
# Cria lista de arestas
edges = zip(rows.tolist(), cols.tolist())
# Cria um grafo vazio usando NetworkX
g = nx.Graph()
# Insere arestas (cria vértices automaticamente)
g.add_edges_from(edges)
G = nx.Graph()
G.add_edge(1,2 , weighted = 4)
G.add_edge(1,8 , weighted = 8)
G.add_edge(8,2, weighted = 11)
G.add_edge(8,9 , weighted = 7)
G.add_edge(8,7 , weighted = 1)
G.add_edge(9,3 , weighted = 2)
G.add_edge(9,7 , weighted = 6)
G.add_edge(2,3 , weighted = 8)
G.add_edge(3,4 , weighted = 7)
G.add_edge(3,6 , weighted = 4)
G.add_edge(4,6 , weighted = 14)
G.add_edge(4,5 , weighted = 9)
G.add_edge(5,6 , weighted = 10)
G.add_edge(6,7 , weighted = 2)
# Mostra vértices e arestas
x, pos = Prim_Algorithm(g, 1, a)
# x = MST, pos = posiçao definitiva dos vertices e arestas
pesos = { (u, v): data['weight'] for u, v, data in x.edges(data=True) }
#dicionario com os pesos das arestas da MST
p_ordenado = sorted(pesos.items(), key=operator.itemgetter(1))
# transforma em lista e ordena as arestas do menor para maior peso
#gera com 4 comudidades
#for x in range(1, 4):
# gera 3 comunidades
for x in range(1, 3):
# com tres grupos: range(1, 3) ---- com quatro grupos: range(1, 4)
del p_ordenado[len(p_ordenado) -1]
# retira as k arestas mais custosas
d = dict(p_ordenado)
# transforma novamente em dicionario após retirar as arestas
grafo = nx.Graph()
grafo.add_edges_from(d)
cria(grafo, d, pos)
# esse eh o grafo em que estão mostrados os grupos