import networkx as nx
import matplotlib.pyplot as plt
第一种方式画图
nodes = [0,1,2,3,4,5,6,7,8]
edgess = [(0,1,3), (0,7,8), (1,7,3), (1,2,8), (7,8,1), (7,6,6), (8,2,2),
(8,6,6), (2,5,4), (6,5,2), (2,3,7), (3,5,14), (3,4,9), (5,4,10)]
G = nx.Graph()
G.add_nodes_from(nodes)
G.add_weighted_edges_from(edgess)
nx.draw_networkx(G, node_color='b', font_color='w', font_weight='bold')
plt.show()
0-4间的最短路径及距离(无向图)
p = nx.shortest_path(G, source=0, weight='weight', method='dijkstra')
print('0到4的最短路径为:',p[4])
d = nx.shortest_path_length(G, source=0, target=4, weight='weight')
print('0到4的最短距离为:',d)
0到4的最短路径为: [0, 1, 7, 8, 2, 5, 4]
0到4的最短距离为: 23
方法二
path=nx.single_source_dijkstra_path(G,4)
length=nx.single_source_dijkstra_path_length(G,4)
print(path)
print('----------------------------------------------------')
print(length)
{4: [4], 3: [4, 3], 5: [4, 5], 2: [4, 5, 2], 6: [4, 5, 6], 7: [4, 5, 2, 8, 7], 8: [4, 5, 2, 8], 1: [4, 5, 2, 8, 7, 1], 0: [4, 5, 2, 8, 7, 1, 0]}
----------------------------------------------------
{4: 0, 3: 9, 5: 10, 6: 12, 2: 14, 8: 16, 7: 17, 1: 20, 0: 23}
高亮最短路径
Y = nx.Graph()
for i in edgess:
Y.add_edge(i[0], i[1], weight=i[2])
edgelists = []
point = p[4]
for i in range(len(point) - 1):
edgelists.append((point[i], point[i+1]))
pos=nx.spring_layout(Y)
nx.draw_networkx_nodes(Y,pos,node_size=700)
nx.draw_networkx_edges(Y, pos)
nx.draw_networkx_edges(Y, pos, edgelist=edgelists, edge_color='y', width=3)
nx.draw_networkx_labels(Y,pos,font_size=15,font_family='sans-serif', font_color='w')
plt.axis('off')
plt.show()
Floyd-Warshall算法
predecessors, _ = nx.floyd_warshall_predecessor_and_distance(G)
pred = nx.reconstruct_path(0,4,predecessors)
print('0到4的最短路径为:', pred)
0到4的最短路径为: [0, 1, 7, 8, 2, 5, 4]
distance = nx.floyd_warshall_numpy(G)
dist = distance[4,0]
print('0到4的最短距离为:', dist)
0到4的最短距离为: 23.0