Graph algorithm 寻找一种算法来确定可达顶点的差异

Graph algorithm 寻找一种算法来确定可达顶点的差异,graph-algorithm,directed-acyclic-graphs,Graph Algorithm,Directed Acyclic Graphs,对于一个项目,我需要知道在有向无环图中哪些顶点可以从一个顶点到达,而不是从另一个顶点 对于图表,可以做出以下假设: 每个顶点只有一个或两个输出边(可能有更多但不太可能) 传入边的数量不受限制 图形在深度上增长快,但在广度上增长慢 基本上,您可以想象图形是git存储库中的关系。顶点是提交,边是与父提交的关系 现在我只计算两个顶点的邻域(无限深),并计算两个结果集之间的差异。然而,一开始这是一种昂贵的方法,当图形变大时,它会变慢 图形示例(边从上到下排列): 可从A访问:A、B、C、D、E、F

对于一个项目,我需要知道在有向无环图中哪些顶点可以从一个顶点到达,而不是从另一个顶点

对于图表,可以做出以下假设:

  • 每个顶点只有一个或两个输出边(可能有更多但不太可能)
  • 传入边的数量不受限制
  • 图形在深度上增长快,但在广度上增长慢
  • 基本上,您可以想象图形是git存储库中的关系。顶点是提交,边是与父提交的关系
现在我只计算两个顶点的邻域(无限深),并计算两个结果集之间的差异。然而,一开始这是一种昂贵的方法,当图形变大时,它会变慢

图形示例(边从上到下排列):
  • 可从A访问:A、B、C、D、E、F、G、H、I
  • 可从C访问:C、E、F、G、H、I

所以AC之间的区别是:A,B,D

如果你真的想要从A到达所有顶点,但不想从B到达所有顶点,那么你必须找到至少一个顶点的所有退化(即具有全深度的邻域),但是如果你只想从A到达一组特定的节点,B或者两者都有,可能有更快的方法。另外:你想用同一张图做一次还是多次这样的事情?如果您想多次这样做,可能值得制作一个字典,其中每个节点都有一组与其关联的所有子节点。@Chris“您必须为它们找到至少一个的所有后代”我不认为这是真的,因为如果您知道节点C可以从a和B到达,那么您可以跳过节点C的所有后代C@Chris:经常对同一个图形执行此操作。但图表正在不断修改。它目前也有150万个顶点和200万条边,因此存储每个顶点的后代可能有点过头了。如果你真的想要从a而不是从B到达所有顶点,那么你必须为它们找到至少一个的所有退化(即具有全深度的邻域)但是,如果您只是想知道是否可以从a、B或两者中访问特定的一组节点,那么可能有一种更快的方法。另外:你想用同一张图做一次还是多次这样的事情?如果您想多次这样做,可能值得制作一个字典,其中每个节点都有一组与其关联的所有子节点。@Chris“您必须为它们找到至少一个的所有后代”我不认为这是真的,因为如果您知道节点C可以从a和B到达,那么您可以跳过节点C的所有后代C@Chris:经常对同一个图形执行此操作。但图表正在不断修改。它目前还有150万个顶点和200万条边,因此存储每个顶点的后代可能有点过头了。
* A
|\
| * B
* |   C
| | 
| |
| * D
* |   E
|\ \
| |/
| * F
* |   G
|\ \
| |/
| * H
|/
* I