最短路径问题:
dijkstra算法求解最短路径:由于这个算法采取的是贪心策略,求的是每一步中的最优解,所以总的解并不一定是全局最优解,这个算法不能处理负权边
'''图的临接链表
0 1 2 3 4 5 6 7 8
0 0, 1, inf, 3, inf, inf, inf, inf, inf
1 1, 0, 5, inf, 2, inf, inf, inf, inf
2 inf, inf, 0, 1, inf, 6, inf, inf, inf
3 inf, inf, inf, 0, inf, 7, inf, 9, inf
4 inf, 2, 3, inf, 0, 4, 2, inf, 8
5 inf, inf, 6, 7, inf, 0, inf, 2, inf
6 inf, inf, inf, inf, inf, 1, 0, inf, 3
7 inf, inf, inf, inf, inf, inf, 1, 0, 2
8 inf, inf, inf, inf, 8, inf, 3, 2, 0
'''
import networkx as nx
import matplotlib.pyplot as plt
G = nx.DiGraph() #先创建一个无向图
G.add_weighted_edges_from([(0, 1, 1), (1, 0, 1), (1, 4, 2), (2, 1, 5), (2, 4, 3), (2, 5, 6), (3, 0, 3), (3, 2,1),
(3, 5, 7), (4, 1, 2), (4, 8, 8), (5, 2, 6), (5, 3, 7), (5, 4, 4), (5, 6, 1), (6, 4, 2),
(6, 7, 1), (6, 8, 3), (7, 3, 9), (7, 5, 2), (7, 8, 2), (8, 4, 8), (8, 6, 3), (8, 7, 2)])
min_path = nx.dijkstra_path(G, source=0, target=7) #计算最短加权路径,开始于0点,结束于点7
min_path_len = nx.dijkstra_path_length(G, source=0, target=7) #计算最短路径的权的和
print(min_path)
print(min_path_len)
pos = nx.spring_layout(G) #这个函数接收一个图对象,返回图中每一个点在可视化中的位置,用于图的可视化绘制
labels = nx.get_edge_attributes(G, "weight")
#图的可视化
nx.draw(G, pos, with_labels=True, font_color='red') #这里的pos参数也可以自己定义,格式为{节点:(节点要在的x轴,节点要在的y轴)}
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels, font_color="red")
plt.show()
#对于有负权的计算,可以使用Bellman-Ford算法,计算最短路径的函数为
#bellman_ford_path(G, source, target, weight=‘weight’)
#bellman_ford_path_length(G, source, target, weight=‘weight’)