1、概念
1.1 图
图(Graph)是由顶点的集合和顶点之间边的集合组成,通常表示为:
G
(
V
,
E
)
G(V,E)
G(V,E)
其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。在图中的数据元素,我们称之为顶点(Vertex),顶点集合有穷非空。在图中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以是空的。
2、图的存储
2.1 邻接矩阵
2.2 邻接表
3、图的遍历
3.1 基本思路
从图中某一个顶点出发遍历途中其余顶点,每一个顶点仅被访问一次
(1)树有四种遍历方式,因为根节点只有一个。而图的复杂情况是的顺着一个点向下寻找,极有可能最后又找到自己,形成回路导致死循环。
(2)所以要设置一个数组voisited[n],n是图中顶点个数,初值为0,当该顶点被遍历后,修改数组元素的值为1
(3)基于此,形成了2种遍历方案:深度优先遍历和广度优先遍历
3.2 广度优先遍历BFS
3.3 深度优先遍历DFS
https://visualgo.net/zh/dfsbfs
# 图的深度优先遍历
# 1.利用栈实现
# 2.从源节点开始把节点按照深度放入栈,然后弹出
# 3.每弹出一个点,把该节点下一个没有进过栈的邻接点放入栈
# 4.直到栈变空
DFS(u)
for each neighbor v of u
if v is unvisited, tree edge, DFS(v)
else if v is explored, bidirectional/back edge
else if v is visited, forward/cross edge
或者用python的
# 图的深度优先遍历
# 1.利用栈实现
# 2.从源节点开始把节点按照深度放入栈,然后弹出
# 3.每弹出一个点,把该节点下一个没有进过栈的邻接点放入栈
# 4.直到栈变空
def dfs(node):
if node is None:
return
nodeSet = set()
stack = []
print(node.value)
nodeSet.add(node)
stack.append(node)
while len(stack) > 0:
cur = stack.pop() # 弹出最近入栈的节点
for next in cur.nexts: # 遍历该节点的邻接节点
if next not in nodeSet: # 如果邻接节点不重复
stack.append(cur) # 把节点压入
stack.append(next) # 把邻接节点压入
set.add(next) # 登记节点
print(next.value) # 打印节点值
break # 退出,保持深度优先