【问题标题】:Find if two nodes are connected in a directed graph查找两个节点是否在有向图中连接
【发布时间】:2017-06-16 03:40:20
【问题描述】:

给定一个使用HashMap<String, String> 实现的有向图,判断两个节点是否相连。

例如:

"b"--->"a"<---"c"

Map<String, String> graph = new HashMap<>();
map.put("b", "a");
map.put("c", "a");

"b""c" 已连接。

我找到了一个post,其中的图是有向图,但解决方案是查找两个节点之间是否存在路径。我的问题有所不同,因为即使"b""c" 之间没有路径,上面示例中的"b""c" 也被认为是连接的。

【问题讨论】:

  • 在第二个示例中,bc 未连接。从ac 有一条边。您在第二次 put 调用中更改了 a 的映射。
  • @NeilLocketz 哎呀,对不起,我删除了那个例子。
  • 您链接的“解决方案”决定了(有向)图中是否存在从一个节点到另一个节点的路径。这与您提出的问题不同:在您的示例中,没有从“b”到“c”的路径,但您仍然认为它们是连接的。对于您的实际问题的任何解决方案都比您所链接的非解决方案更好。
  • 您可以随时将其转换为双向图,并且可以从bc 开始。
  • 嗨,我已经更新了我的问题。在我的示例中,"b""c" 被视为已连接。

标签: java algorithm graph


【解决方案1】:

您的陈述与您提供的链接中使用的陈述没有真正的区别。他们使用了LinkedList&lt;Integer&gt; 的数组,它映射到每个节点的所有相邻节点。 你也有这个信息,你的地图的每个键都链接到所有相邻的节点。

但首先请注意,您的代表权非常有限。您将节点限制为只有一个邻居。例如,您可以通过将 value 类的类型更改为 Set&lt;String&gt; 而不是 String 来更改此设置。

只需使用您的结构重新实现 BFS 或 DFS,或将您的版本转换为他们的版本并直接使用他们的代码。然而,第一个解决方案会更快,但需要您了解这些搜索是如何工作的。 但不要害怕,它们很简单,而且网上有很好的文章,例如在 Wikipedia:

【讨论】:

  • 在链接的示例中它说:“作为另一个示例,没有从 3 到 0 的路径。”但根据 OP,它需要有从 3 到 0 的路径。
  • 我明白了。这意味着 OP 想要解释图形 undirected 而不是 directed?然后他需要为每条边添加另一个方向的伪边。否则一个节点不能从另一个方向知道他的邻居。
  • 是的,@Zabuza,显然 OP 希望通过将他的有向图转换为无向图来评估图中的连通性。可能有比“添加[ing]伪边”更多的选择,具体取决于您的意思。
  • 嗨,我已经更新了我的问题。在我的示例中,"b""c" 被视为已连接。
  • 是的,这意味着您将有向图解释为无向图(您不关心边指向的方向)。通常情况并非如此,因此如果不进行修改,搜索将无法进行,因为a 应该如何知道c 指向它?只有c 在你的结构中知道它。一个非常简单的解决方法是创建指向另一个方向的所有边的副本,因此if b ---&gt; a 然后还要添加a ---&gt; b。不过可能有更好的解决方案,请搜索reachability undirected graph。但我认为他们都会要求你改变你的模型。
猜你喜欢
  • 1970-01-01
  • 2022-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多