从给定的边缘集合确定树的算法

时间:2014-08-21 10:58:36

标签: algorithm tree

我正在尝试解决SPOJ上的问题"is it a tree"

  

您将获得一个未加权的无向图。编写程序以检查它是否是树形拓扑。   该图表最多可包含10,000个节点和最多20,000个边缘。

我知道树的属性,但我无法找出正确的数据结构/算法来检测周期。任何人都可以提供最佳方法的暗示。

我只需要一个方向,而不是代码。

请建议一个基本的数据结构,而不是语言库中提供的一些内置结构。

由于

2 个答案:

答案 0 :(得分:3)

检测循环的最简单方法是使用深度优先搜索。它具有O(V + E)时间复杂度,因此它是最佳的,因为您至少需要O(V + E)时间来阅读图表。

答案 1 :(得分:1)

至少有两种方法,但都基于1个基本想法: N个节点的树必须有N - 1个边,没有周期。

因此,您需要检查的第一件事是给定的EV是否满足E = V - 1。如果他们不只是返回false,否则你可以开始检查周期是否存在。

正如我所提到的,至少有两种方法:做一个简单的深度优先搜索(DFS)或使用联盟查找集

DFS方法: 这个想法很简单:当我们正在进行DFS并遇到后沿时,会发现一个循环。有关循环检测的详细信息,请查看this article

此方法的时间复杂性是DFS的复杂性,即O(V + E)

联盟查找数据结构方法 首先,您需要知道什么是Union Find Data Structure

  

它是一种数据结构,用于跟踪分割为多个不相交(非重叠)子集的一组元素。它支持...特定元素所在的子集。

至于实现,我们最初将所有顶点视为不同的子集。对于每个边缘,我们检查2个末端是否在同一组中。如果它们已经在同一组中,我们检测到一个周期;如果没有,我们一起加入他们。

检查this article有关如何使用联合查找数据结构来检测循环的信息。

考虑到Inverse Ackermann function could be treated as a small constant (less than 5)

,此方法的时间复杂度约为O(E)