图的深度优先遍历和广度优先遍历算法流程图

图的存储结构:邻接表表示方法,适用于有向图和无向图

图的遍历:

从图的某顶点出发,访问图中所有顶点,并且每个顶点仅访问一次。
图中可能有回路,遍历可能沿回路又回到已遍历过的结点。为避免同一顶点被多次访问,必须为每个被访问的顶点作一标志。为此引入一辅助数组, 记录每个顶点是否被访问过。
有两种遍历方法:深度优先遍历和广度优先遍历算法
(它们对无向图,有向图都适用)

深度优先遍历:(可以用来判断图中是否存在环)

思路:从图的某一顶点V0出发,访问此顶点;然后依次从V0的未被访问的邻接点出发,深度优先遍历图,直至图中所有和V0相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止。
在深度优先遍历中,由于没为有规定访问邻接点的顺序,所以深度优先序列不是唯一的。

补充:如果存储结构确定了则图的深度优先遍历是唯一的。如下:
在这里插入图片描述
无向图:
在这里插入图片描述
有向图:

深度优先遍历(DFS)和广度优先遍历(BFS)是两种常用的遍历算法。下面是它们的具体实现方式和流程。 假设我们有一个用邻接表表示的,其中顶点编号从0到n-1,其中n为顶点数。邻接表用一个数组adj来表示,其中adj[i]表示与顶点i相邻的所有顶点。例如,如果adj[3]={1,2,4},则表示顶点3与顶点1、2、4相邻。 ## 深度优先遍历(DFS) 深度优先遍历使用栈来实现,其基本流程如下: 1. 将起始顶点压入栈中,标记已访问。 2. 当栈非空时,弹出栈顶元素v。 3. 遍历v的所有相邻顶点,如果该顶点未被访问过,则将其压入栈中并标记已访问。 4. 重复步骤2和3,直到栈为空。 以下是深度优先遍历的Python实现: ```python def DFS(adj, start): visited = [False] * len(adj) # 记录每个顶点是否已访问 stack = [start] # 栈中初始只有起始顶点 visited[start] = True # 标记起始顶点已访问 while stack: v = stack.pop() # 弹出栈顶元素 print(v, end=' ') # 访问该顶点 for u in adj[v]: # 遍历该顶点的相邻顶点 if not visited[u]: # 如果相邻顶点未被访问过 stack.append(u) # 将其压入栈中 visited[u] = True # 标记已访问 ``` ## 广度优先遍历(BFS) 广度优先遍历使用队列来实现,其基本流程如下: 1. 将起始顶点入队,标记已访问。 2. 当队列非空时,出队队头元素v。 3. 遍历v的所有相邻顶点,如果该顶点未被访问过,则将其入队并标记已访问。 4. 重复步骤2和3,直到队列为空。 以下是广度优先遍历的Python实现: ```python from collections import deque def BFS(adj, start): visited = [False] * len(adj) # 记录每个顶点是否已访问 queue = deque([start]) # 队列中初始只有起始顶点 visited[start] = True # 标记起始顶点已访问 while queue: v = queue.popleft() # 出队队头元素 print(v, end=' ') # 访问该顶点 for u in adj[v]: # 遍历该顶点的相邻顶点 if not visited[u]: # 如果相邻顶点未被访问过 queue.append(u) # 将其入队 visited[u] = True# 标记已访问 ``` 以上就是深度优先遍历广度优先遍历的实现方式和流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值