接着上次的深度优先遍历继续做:
G=[{1,2,3},#0
{0,4,6},#1
{0,3},#2
{2,0,4},#3
{3,1,6,5},#4
{4,7},#5
{1,4},#6
{5}#7
]
from collections import deque
#传入图和起始点v
def bfs(G,v):
#把起始点放在队列中
q=deque([v])
#集合检测哪些元素被访问过,入队的元素被访问过
visited={v}
#只要队列非空,就做循环
while q:
#出队一个元素
u=q.popleft()
print(u)
#考察u的邻接节点
for w in G[u]:
if w not in visited:
#将其添加到队尾
q.append(w)
visited.add(w)
bfs(G,0)
2最小生成树算法(
G=[{1:28,5:10},#0
{0:28,2:16,6:14},#1
{1:16,3:12},#2
{2:12,4:22,6:18},#3
{3:22,5:25,6:24},#4
{0:10,4:25},#5
{1:14,3:18,4:24}#6
]
#使用优先级队列
import heapq
def prim(G):
#顶点数
n=len(G)
v=0
#不能产生回环,因为是个树
s={v}
edges=[]
res=[]
for _ in range(n-1):
#对键和值同时做循环
for u,w in G[v].items():
#v,u两个顶点,v,u连接,权重是w
heapq.heappush(edges,(w,v,u))
while edges:
w,p,q=heapq.heappop(edges)
if q not in s:
s.add(q)
res.append(((p,q),w))
#v=你找到的q
v=q
break
#对于有孤立点的情况
#else:
#raise Exception('不是连通图!')
return res
prim(G)