【发布时间】:2014-01-21 10:27:42
【问题描述】:
有人可以提供有关如何检查图形边缘是否形成循环的信息吗? 任何信息都会非常有帮助。 非常感谢。
【问题讨论】:
-
对我来说听起来像是欧拉路径。除非 Q 没有要求“算法来检查图形的所有边缘是否形成循环”。
标签: algorithm greedy kruskals-algorithm
有人可以提供有关如何检查图形边缘是否形成循环的信息吗? 任何信息都会非常有帮助。 非常感谢。
【问题讨论】:
标签: algorithm greedy kruskals-algorithm
Kruskal 算法(您用它来标记问题)使用 disjoint set data structure 初始化每个顶点的不相交集。然后,对于每条边,边的顶点所属的两个集合被合并。如果这两个顶点已经在同一个集合中,那么您已经找到了一个循环。如果每次发生边缘时都删除它,您将得到一棵生成树。如果按照权重升序对边进行排序,那将是最小生成树。
如果您只需要知道图是否包含循环,请使用更简单的 DFS - 如果任何节点具有已访问过的相邻节点(父节点除外) - 您已找到循环。
【讨论】:
在图上做一个完整的 DFS。为图中的每个节点维护两个布尔变量,“已访问”和“已完成”。 “visited”表示顶点是否已被访问,“completed”表示从该特定节点开始的 DFS 是否已完成。如果在做 DFS 时碰到了一个已经被访问过但 DFS 还没有完成的节点,那么图中存在一个循环。
【讨论】:
它是使用快速联合查找数据结构来检查要连接的边是否不在同一个集群的顶点之间。
【讨论】: