图的宽度优先搜索和最短路径实现——python

  1. 课本上的是手动造轮子,尽管不完善,但是挺好用。这里就不记录课本上的了,通俗易懂,我们主要看看用库函数实现课本上的这俩功能,开阔下思路。
  2. 主要用到了网络分析库和绘图库,看代码:
import networkx as nx
import matplotlib.pyplot as plt

G = nx.Graph()
nodes = ['s', 'a', 'z', 'x', 'd', 'c', 'f', 'v']
G.add_nodes_from(nodes)
ebunch = [('a', 'z'), ('a', 's'), ('s', 'x'), ('x', 'd'),
          ('d', 'c'), ('x', 'c'), ('d', 'f'), ('c', 'f'),
          ('c', 'v'), ('f', 'v')]
G.add_edges_from(ebunch)
nx.draw(G, pos=nx.spring_layout(G), with_labels=True, font_size=24, node_size=2640)
plt.show()
print(nx.bfs_predecessors(G, 's'))
print(nx.shortest_path(G, 's'))
  1. 打印出来的结果,看下图和课本图7.4即可,我们这里稍微解释下输出,和课本上的类似:
    图的宽度优先搜索和最短路径实现——python_第1张图片
{'a': 's', 'c': 'x', 'd': 'x', 'f': 'c', 'v': 'c', 'x': 's', 'z': 'a'}
{'a': ['s', 'a'], 'c': ['s', 'x', 'c'], 'd': ['s', 'x', 'd'], 'f': ['s', 'x', 'c', 'f'], 's': ['s'], 'v': ['s', 'x', 'c', 'v'], 'x': ['s', 'x'], 'z': ['s', 'a', 'z']}

  1. 共3个输出:
  • 构造好的图(不解释)
  • 输出的宽度优先搜索结果(注意以字典存放,键表示节点,值表示其先前节点,要表示课本上的宽度搜索结果,只需要将上述代码的结果整理为:{'a': 's','x': 's', 'z': 'a','c': 'x', 'd': 'x', 'f': 'c', 'v': 'c'},可以得出遍历流程为s->(a and x)->(z and c and d)->(f and v)。也即:frontier0={s}, fronter1={a,x}, frontier2={z,c,d}, frontier3={f,v},和课本一样
  • 从源点s出发找到的所有最短路径,也是字典存放,键和值分别对应的是从s到键的最短路径是值。这里要注意上述算法得出的’f’: [‘s’, ‘x’, ‘c’, ‘f’],表示从s到f最短路径和课本的s->x->d->f不同,但都是正确的,对于无向图,最短路径可能不止一条,条条大路通罗马么。
  1. 提醒下,有空学习下库函数,写法忒复杂,不过考虑的很全面,编写风格非常好。

你可能感兴趣的:(作业题)