Walking a directed graph
我有一个有向无环图和一个原点顶点v。我如何访问从v可以访问的所有顶点,这样如果我访问v1,我就已经访问了所有具有v1的和边缘的顶点?
例子:
从A开始,C必须在B之后访问。我试着做一个bfs,检查每个顶点的父节点,如果他们没有被访问,稍后再添加它,但是这太慢了,我相信可以是O(v^2)。
这可能有助于了解图是某种二进制的,每个顶点最多由两个顶点指向。在另一个方向上,每个顶点指向许多顶点。
- @JonathonReinhart不,算法问题是这个主题中最完美的。示例1示例2示例3。它们可以翻译成任何语言,并直接连接到软件问题。该行动还表明了自己解决这一问题的努力。
- @Amit我觉得在Stack Overflow("软件算法")、Computer Science("算法,计算模型")和Programmer("算法和数据结构概念")这两个主题之间有很多重叠,都是从他们的"主题"页面中引用的。在我看来,如果你不能用编程语言(如C)或环境(如POSIX)来标记一个问题,那么它更适合其他站点。这个问题可以在不编写一行代码("编程")的情况下得到回答和证明。我已经撤回了对先例的投票,但我不同意。
- @JonathonReinhart有一个标签,上面有7K个问题,语言不可知论,这是我们讨论的话题。我的示例中的所有问题都与任何特定的编程语言无关,但是与编程非常相关,并且深受社区的喜爱,因此在这方面我真的不同意您的看法。
- 我相信有一个meta帖子可以引发这场争论,但我现在找不到它。
- @JonathonReinhart我们程序员用户喜欢链接到每个人的标准元帖子是meta.programmers.stackexchange.com/questions/7182/…,我个人的直觉是,这个问题是关于so和p.se的主题。
- @所以在你看来,你更喜欢在程序员那里这样吗?
- @JonathonReinhart如果我自己问这个问题,我会选择程序员,但我不认为有任何必要把它迁移掉。
- 这个问题在许多堆栈交换站点上都可以,包括堆栈溢出。不应该迁移它。
你可能在寻找一种拓扑类型。
首先,做一个拓扑排序,根据这个排序得到图中顶点的顺序,让它是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|)。