BFS和强连通分量寻找

本文介绍了BFS(广度优先搜索)与DFS(深度优先搜索)的区别,并讨论了如何使用DFS找寻有向图的强连通分量(SCC)。在有向图中,如果两个顶点相互可达,则称它们强连通。通过拓扑排序和边的反向,可以有效地找出图中的强连通分量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

广度优先走索(BFS)与DFS的区别还是比较明显的:后者是首先朝着一个方向始终探索,直到“死路”才回溯去探索别的路口;后者则是稳步推进的方式,有点类似水纹扩散,一步一步向外扩散。在代码思想上,主要一个是运用FIFO队列一个是FILO队列。大致实现如下:

from collections import deque

def bfs(G, s, seq, ans):	# G是图,s是起始点,seq是FILO队列,ans是探索的所有点的列表
	if seq is None:
		seq == deque()
	seq.append(s)
	ans.append(s)
	while seq:
		s = seq.popleft()
		for u in G[s]:
			if u in seq: continue
			seq.append(u)
			ans.append(s)

学习了DFS和BFS后,对于遍历有了一定的认识,可以使用DFS来找强连通分量(SCC)。有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。(取自百度百科)
如果我们对一个有向图进行拓扑排序,就会得到一个这个图的扫描节点结束时间为准的列表之类的答案。一个节点扫描结束时间晚于另一个节点,就意味着前一个点可以到达后一个点,或者两者之间没有通路,是两个强连通分量。如果把

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值