【问题标题】:Finding All Paths in this Directed Graph查找此有向图中的所有路径
【发布时间】:2012-12-06 00:44:05
【问题描述】:

我最近发现了图形和算法,并试图解决一个涉及两种不同类型顶点的特定问题:用户和实体。详情如下:

  • 图形是有向的
  • 我正在尝试查找从 A 到 B 的所有路径
  • A 始终是用户
  • B 可以是用户或实体
  • 如果 B 是用户,则搜索的最大深度为 3 条边
  • 如果 B 是实体,则最大深度为 2 条边
  • 我无法遍历从用户出站的任何边,除非用户是 A

虽然图有两种类型的顶点,但它不是二分的。

到目前为止,我已经设法创建了一个图形对象,该对象包含一个顶点索引的邻接列表数组。邻接表是基于链表的。

我认为我需要对所有路径算法进行某种变体,但我不太确定。此外,不确定我应该关注 DFS 还是 BFS。

我正在使用 PHP,这使事情变得复杂,因为大多数示例都是用 Java 编写的。我真正想要的是伪代码。

有什么想法吗?谢谢!

【问题讨论】:

  • 安德鲁,输入将是一个边列表,u->v。输出将是路径列表,例如 A->B、A->X->B、...

标签: algorithm graph-algorithm


【解决方案1】:

听起来您正在遍历某种 LDAP 实现。如果您需要通用算法,只需使用 DFS,因为它更容易编码。除非深度会改变,否则这样做是大材小用。

最通用的方式

 dfs(A,B):
     return dfs(A,B,1);

 dfs_(u,B,depth):
     if u == B:
          return u;

     if (u is User and depth > 3) or (u is Group and depth > 2):
          return None;       

     out = [];
     for children of thing:
          return max( dfs_(children,depth+1) ) # take the non-null one
     out.append(u);
     return out;

【讨论】:

  • 感谢 dfb。逻辑上类似于 LDAP,但使用关系数据库。除非深度会改变,否则你的意思是过度杀伤?当图表不深时,是否有更好的方法来解决问题?
  • 我可能只是硬编码遍历或做一些更具体的任务,因为逻辑相当简单......只是一个想法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
  • 2022-01-21
  • 2017-08-21
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
相关资源
最近更新 更多