我正在尝试解决SPOJ上的问题"is it a tree"。
您将获得一个未加权的无向图。编写程序以检查它是否是树形拓扑。 该图表最多可包含10,000个节点和最多20,000个边缘。
我知道树的属性,但我无法找出正确的数据结构/算法来检测周期。任何人都可以提供最佳方法的暗示。
我只需要一个方向,而不是代码。
请建议一个基本的数据结构,而不是语言库中提供的一些内置结构。
由于
答案 0 :(得分:3)
检测循环的最简单方法是使用深度优先搜索。它具有O(V + E)
时间复杂度,因此它是最佳的,因为您至少需要O(V + E)
时间来阅读图表。
答案 1 :(得分:1)
至少有两种方法,但都基于1个基本想法: N
个节点的树必须有N - 1
个边,没有周期。
因此,您需要检查的第一件事是给定的E
和V
是否满足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)