class QNode: def __init__(self,p,pre): self.vno = p self.pre = pre def Shortpath(G, u, v): visited = [0] * len(G) res = [] qu = deque() qu.append(QNode(u, None)) visited[u] = 1 while len(qu) > 0: p = qu.popleft() if p.vno == v: q = p.pre while q != None: res.append(q.vno) q = q.pre res.reverse() return res for j in range(len(G.adjlist[p.vno])): w = G.adjlist[p.vno][j].adjvex if visited[w] == 0: qu.append(QNode(w, p)) visited[w] = 1完善代码
时间: 2024-02-14 08:15:54 浏览: 63
ROS与QT的那些事--1 实现发布者PUB-ros_gui代码简化
5星 · 资源好评率100%
这段代码是一个基于广度优先搜索(BFS)的无权图最短路径算法实现。下面是完整的代码:
```
from collections import deque
class QNode:
def __init__(self, p, pre):
self.vno = p
self.pre = pre
def Shortpath(G, u, v):
visited = [0] * len(G.adjlist)
res = []
qu = deque()
qu.append(QNode(u, None))
visited[u] = 1
while len(qu) > 0:
p = qu.popleft()
if p.vno == v:
q = p.pre
while q != None:
res.append(q.vno)
q = q.pre
res.reverse()
return res
for j in range(len(G.adjlist[p.vno])):
w = G.adjlist[p.vno][j].adjvex
if visited[w] == 0:
qu.append(QNode(w, p))
visited[w] = 1
return None
```
其中,`G` 是图的邻接表表示,`u` 和 `v` 分别是起点和终点的编号。`visited` 数组表示节点是否已经被访问过,`res` 数组保存最短路径的节点序列,`qu` 是一个队列,用于存储待访问的节点。`QNode` 类表示队列中的元素,包括节点编号和前驱节点。
算法的核心部分是 `while` 循环,每次从队列中取出一个节点 `p`,然后遍历 `p` 的邻接点。如果邻接点 `w` 还没有被访问过,就将其加入队列,并将 `p` 设为其前驱节点。当遍历到终点 `v` 时,就可以通过前驱链回溯得到最短路径节点序列。
需要注意的是,如果起点和终点之间没有路径,算法会返回 `None`。此外,由于本算法是基于 BFS 的,因此它只适用于无权图。如果图中存在负权边,需要使用其他算法,比如 Dijkstra 或 Bellman-Ford。
阅读全文