在图中查找多个环

时间:2016-07-14 10:28:48

标签: c# algorithm search nodes diagram

我正面临一个我似乎无法解决的问题, 我有一个节点的数字,这些节点形成形状,如图片所示。

enter image description here

该图包含15个节点。该图还有2个环。我需要找到一个解决方案,在其中我可以找到在图中形成环的元素。因此,从该图中我得到2个元素列表{A,Z,B,O,F},{T, H,R,M,P,F},每个节点将被视为一个元素,而忽略未包含在环{Q,N,C,V}中的其余元素。请记住,对于我的目的,图表将始终包含多个环。

我所拥有的是一个节点对象列表,每个节点都有一个名为ConnectedNodes的属性,这是一个包含连接到它的节点的列表,没有订购或任何东西。连接器节点{F,P}连接到3个节点。它们是共享的,它们连接到环节点和非环节点,而其余节点严格连接到2个节点。 有人可以给我一些想法,或者建议可能适用于这个问题的算法。

更新: - 这是有效的,您可以将多个环形元素作为连接器节点{V,P,D}。对于更新的图表,我现在有4个环而不是2个和4个连接器节点。 enter image description here

1 个答案:

答案 0 :(得分:1)

我不清楚你到底想做什么。据我所知,你想要其中一个:

  1. 您想找到任何特定的戒指(例如:{A,Z,B,O,F})。
  2. 你可以使用DFS来做 - 只需从任何顶点 v 启动它,直到你到达已经访问过的顶点 u 。由于您已离开 u ,所以使用您访问过的顶点创建环。

    1. 你想在第一个测试案例中找到图中的每个环({A,Z,B,O,F},{T,H,R,M,P,F})
    2. 这也可以使用DFS完成 - 从任何顶点 v 开始,并从 v <开始查找每个单顶点路径(每个顶点最多出现一次的路径) / em>的。每当从路径末端到路径内的任何顶点都有边缘(u,w)时,就会有环。

      此算法会发现每次响铃两次,但这只是技术问题。

      该算法的悲观时间复杂度为 O(n!)。但请注意,在一般情况下,人们无法找到更好的解决方案,因为一般情况下的响铃次数是 n!(例如在完整图表中)。

      1. 你想找到图中的每个顶点,它们是某个环的一部分({A,Z,B,O,F,T,H,R,M,P}在第一个测试用例中)
      2. 您可以先查看图表中的每个桥接。 https://en.wikipedia.org/wiki/Bridge_(graph_theory)

        当且仅当来自 u 的每个边都是桥时,顶点 u 不是任何环的一部分。

        你可以在线性时间内完成。