networkx中求解平均度_NetworkX系列教程(10)-算法之一:最短路径问题

本文详细介绍了如何使用NetworkX库在无向图、无权图和有权图中实现最短路径算法,包括Dijkstra、Bellman-Ford、Johnson和Floyd-Warshall算法。通过实例展示了每种算法的使用方法和输出结果,帮助读者理解和应用这些经典算法。
摘要由CSDN通过智能技术生成

小书匠Graph图论

重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定先把图论中常用算法弄个明白在写这部分.

图论常用算法看我的博客:

下面我将使用NetworkX实现上面的算法,建议不清楚的部分打开两篇博客对照理解.

我将图论的经典问题及常用算法的总结写在下面两篇博客中:

图论---问题篇

图论---算法篇

目录:

注意:如果代码出现找不库,请返回第一个教程,把库文件导入.

11.Graph相关算法

11.1最短路径

11.1.1无向图和有向图

#定义并画出该图

G = nx.path_graph(5)

nx.add_path(G,[0,5,2])

nx.add_path(G,[0,6,4])

nx.draw(G,with_labels=True)

plt.title('无向图',fontproperties=myfont)

plt.axis('on')

plt.xticks([])

plt.yticks([])

plt.show()

#计算最短路径

print('0节点到4节点最短路径: ',nx.shortest_path(G, source=0, target=4))

p1 = nx.shortest_path(G, source=0)

print('0节点到所有节点最短路径: ',p1)

#计算图中所有的最短路径

print('计算图中节点0到节点2的所有最短路径: ',[p for p in nx.all_shortest_paths(G, source=0, target=2)])

#计算最短路径长度

p2=nx.shortest_path_length(G, source=0, target=2) #最短路径长度

p3=nx.average_shortest_path_length(G) #计算平均最短路径长度

print('节点0到节点2的最短路径长度:',p2,' 平均最短路径长度: ',p3)

#检测是否有路径

print('检测节点0到节点2是否有路径',nx.has_path(G,0,2))

无向图和有向图最短路径示例

输出:

0节点到4节点最短路径: [0, 6, 4]

0节点到所有节点最短路径: {0: [0], 1: [0, 1], 2: [0, 1, 2], 3: [0, 1, 2, 3], 4: [0, 6, 4], 5: [0, 5], 6: [0, 6]}

计算图中节点0到节点2的所有最短路径: [[0, 1, 2], [0, 5, 2]]

节点0到节点2的最短路径长度: 2 平均最短路径长度: 1.8095238095238095

检测节点0到节点2是否有路径 True

11.1.2无权图

G = nx.path_graph(3)

nx.draw(G,with_labels=True)

plt.title('无权图',fontproperties=myfont)

plt.axis('on')

plt.xticks([])

plt.yticks([])

plt.show()

path1 = nx.single_source_shortest_path(G, 0) #计算当前源与所有可达节点的最短路径

length1 = nx.single_source_shortest_path_length(G, 0) #计算当前源与所有可达节点的最短路径的长度

path2 = dict(nx.all_pairs_shortest_path(G)) #计算graph两两节点之间的最短路径

length2 = dict(nx.all_pairs_shortest_path_length(G)) #计算graph两两节点之间的最短路径的长度

prede1=nx.predecessor(G, 0) #返回G中从源到所有节点最短路径的前驱

print('当前源与所有可达节点的最短路径: ',path

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值