algorithm - 用于收集两个节点之间任何路径上的所有边的图形算法

标签 algorithm graph graph-algorithm

我需要找到有向图中两个节点 [src, dest] 之间任何路径上的所有边。

意味着每条边(从基到头)都必须满足:

  • 有一条从src到base的路径
  • 有一条从头到尾的路

我可以收集所有连接到 src 的边,收集所有反向连接到 dest 的边,并计算它们的交集。

但必须有一个算法,对吗? (不知道有没有效率更高的)所以我正在搜索名称,或者用现有算法解决它的巧妙解决方案。

最佳答案

如果您只回答一次问题,那么对您的问题发表评论的人是正确的:您提出的解决方案是正确且快速的。但是,如果您在固定图表中针对不同的 src 和 dest 多次回答您的问题,则有一种方法可以“索引”信息以加快查询速度。

Tarjan's algorithm将在 O(V+E) 时间内将有向图分解为强连通分量 (SCC)。强连通分量是一组顶点,它们都可以通过有向图相互到达。

强连通分量集本身将形成一个有向无环图 (DAG)。

如果src和dest在同一个SCC中,那么你要找的边集就是SCC中的边集。

如果DAG中包含dest的SCC无法从包含src的SCC到达,则没有从src到dest的路径,所以你要找的边集是空的。

如果包含dest的SCC从包含src的SCC可达,则需要在DAG中找到从src SCC到dest SCC的所有路径,这是一个非常简单的动态规划问题。那么你想要的边集就是src SCC和dest SCC之间的所有SCC中的边集,加上DAG中相关路径的边到原始图中边的“回拉”。

这听起来可能令人困惑,但维基百科页面上的图表可能有助于澄清。

关于algorithm - 用于收集两个节点之间任何路径上的所有边的图形算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30813218/

相关文章:

algorithm - 找到一条通过最大点数的直线

php - 我需要一个图的数组缩减算法

csv - 将 csv 导入到 Neo4j 缺失节点

algorithm - "Who to follow"算法

c++ - 使用 BFS 找到 2 个节点之间的最短路径

arrays - 考虑一个快速排序的版本,其中枢轴总是被选择为相关子数组的第一个元素

java - 改进计算余数的递归

algorithm - 使用 Map/Reduce 从多个 Sets 创建 Map

c++ - 完成图形检查

java - 在最小的 Big O 中找到不同对的乘积之和