【问题标题】:Reach all nodes in a graph datastructure到达图数据结构中的所有节点
【发布时间】:2012-09-10 08:57:39
【问题描述】:

说,我有一个分别包含顶点和边列表的图形对象。 G={V,E}

G={[3, 4, 1, 2, 5, 6],[3->4, 1->2, 1->5, 5->4, 5->6]}

假设图表是unweighted and undirected,我需要找出是否所有Vertices are interconnected with eachother,即没有单独的节点或相互连接的节点是孤立的。

1 -- 2

|

5 -- 4 -- 3

| 

6

是否与使用 DFS 或 BFS 遍历图有关?请帮我解决这个问题,谢谢。

【问题讨论】:

  • 如果图是无向的,DFS/BFS 将为您提供从给定起始节点可到达的所有节点。此运行期间未访问的节点未连接到此组件。阅读有关 connected components 的 wiki 页面了解更多信息。

标签: java algorithm data-structures graph graph-algorithm


【解决方案1】:
  1. 以一个verticle为起点
  2. 从该 Verticle 启动 BFS/DFS
  3. 检查是否所有的verticles都被访问过

【讨论】:

    【解决方案2】:

    是的,可以使用 BFS/DFS 解决该问题。 您可以在这两个和任何起始节点中选择任何搜索算法,如果通过搜索技术(DFS 或 BFS)您没有到达至少一个节点,则意味着存在一个或多个断开连接的组件以及一些单独的节点或互连节点被隔离。但这并不能告诉您存在多少断开连接的组件,为此您必须使用其他一些未访问的节点再次开始遍历。

    【讨论】:

      【解决方案3】:

      您也可以使用spanning tree 来实现此结果。在wiki中它被定义为:

      In the mathematical field of graph theory, a spanning tree T of a connected, undirected graph G is a tree composed of all the vertices and some (or perhaps all) of the edges of G.

      图:生成树(来源:wikipedia

      如果你想找minimum spanning treePrim's algorithm可以是一个不错的选择。 示例代码 sn -p :

      MST-Prim(G,r)
      01 for each vertex u element of G.V
      02    u.key :=infinity
      03    u.parent := NIL
      04 r.key := 0
      05 init(Q, G.V)   // Q is a priority queue
      06 while not isEmpty(Q)
      07    u := extractMin(Q)   // add u to T
      08    for each v element of u.adj do
      09        if v element of Q and w(u,v) < v.key then
      10        v.key := w(u,v)
      11          modifyKey(Q,v)
      12          v.parent := u
      

      更新:

      Prim算法的解释可以在here找到。

      有关最小生成树的更多信息,请访问here

      【讨论】:

      • 如果OP只是想检查图是否连通,那不是有点复杂吗?
      • @Baz 是的,这是真的。但它是为此目的最流行的算法之一。如果他/她想编写图形问题,迟早要学会这一点。
      • 连通图 G 的生成树也可以定义为 G 的不包含环的最大边集,或者as a minimal set of edges that connect all vertices.-Spanning tree 所以这实际上是一个有效的答案OP的问题。
      • 谁说这不是一个有效的答案?
      • 最有可能投反对票并澄清没有理由的人:)
      【解决方案4】:

      Algorithm for counting connected components of a graph in Python 已经回答了一个类似的问题。

      由于您要询问图形是否已连接,因此您将以下函数添加到脚本中:

      def isGraphConnected(graph):
          return get_connected_components_number(graph)==1
      

      【讨论】:

      • 他的问题更多是关于实施的想法,而不是实际实施。代码可以很容易地转入java。
      • 是的,如果有人理解 python :) 我一般不会这么认为。
      • 我同意你的观点 :) 但我认为 python 几乎是伪代码。也许 OP 应该对此发表评论。
      猜你喜欢
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      相关资源
      最近更新 更多