关于算法:浏览有向图

Walking a directed graph

我有一个有向无环图和一个原点顶点v。我如何访问从v可以访问的所有顶点,这样如果我访问v1,我就已经访问了所有具有v1的和边缘的顶点?

例子:

1
2
/-----V
A->B->C

A开始,C必须在B之后访问。我试着做一个bfs,检查每个顶点的父节点,如果他们没有被访问,稍后再添加它,但是这太慢了,我相信可以是O(v^2)

这可能有助于了解图是某种二进制的,每个顶点最多由两个顶点指向。在另一个方向上,每个顶点指向许多顶点。


你可能在寻找一种拓扑类型。

首先,做一个拓扑排序,根据这个排序得到图中顶点的顺序,让它是v1,v2,...,vn

使用bfs,可以只保留可以从v访问的顶点(过滤掉其他顶点),并按拓扑排序的顺序迭代它们。

这是O(|V|+|E|),在你的例子中是O(|V|)(放松each vertex will be pointed to by at most two vertices表示|E| <= 2|V|,因此O(|V|+|E|) <= O|V|+2|V|) = O(3|V|) = O(|V|)