"编写程序以标记无向图的连接组件。 换句话说,第一个组件的所有顶点都被赋予第一个组件 标签,第二个组件的所有顶点都给出第二个 秒。 11.8项目403 组件的标签,等等。你的算法应该通过定义any来工作 由边连接的两个顶点是相同等价的成员 类。处理完所有边后,给定等效的所有顶点 课程将被连接。使用UNION / FIND实现 第6.2节实现等价类。"
/** General Tree class implementation for UNION/FIND */
class ParPtrTree {
private Integer [] array; // Node array
public ParPtrTree(int size) {
array = new Integer[size]; // Create node array
for (int i=0; i<size; i++)
array[i] = null;
}
/** Determine if nodes are in different trees */
public boolean differ(int a, int b) {
Integer root1 = FIND(a); // Find root of node a
Integer root2 = FIND(b); // Find root of node b
return root1 != root2; // Compare roots
}
/** Merge two subtrees */
public void UNION(int a, int b) {
Integer root1 = FIND(a); // Find root of node a
Integer root2 = FIND(b); // Find root of node b
if (root1 != root2)
array[root2] = root1; // Merge
}
/** @return The root of curr’s tree */
public Integer FIND(Integer curr) {
if (array[curr] == null)
return curr; // At root
while (array[curr] != null)
curr = array[curr];
return curr;
}
我和一些朋友一直在思考如何处理这个问题,我们还不清楚输入是如何表示的,我们考虑在Shaffer的数据结构中实现一般的图形结构。 Java中的算法分析,进行广度优先搜索以将其组织为树并反转指针以使其适合此数据结构但我不确定所有随机工作是否真正适用于试图完成的任务
以前有没有人曾经/做过这个问题?我们的教授没有触及这个问题,只是把它列在他的作业中。
答案 0 :(得分:0)
好吧,看起来ParPtrTree
实现了等价关系,但我无法弄清楚Par
和Ptr
代表什么。 UNION(a,b)
为关系添加了等效性a === b
,因此a
和b
已经等效的任何内容,现在都变得彼此相同。
没有给出太多细节:我认为分配只是建议:对于图中的每个节点 N ,找到所有节点 N i 从 N 到 N i 的边缘,并调用UNION( N < / EM>,名词<子> I 子> 的)。完成后,等价关系中的等价类对应于图的连通分量。如何从ParPtrTree
中获取这些课程,我认为您需要弄清楚,但考虑使用HashSet
来跟踪您已经完成某些事情的图形节点。最好是在ParPtrTree
添加方法以获取一些信息,因为该方法可以访问array
,但我不知道您是否允许要做到这一点。
另外,正如我在评论中提到的,在!=
对象上使用Integer
并不起作用,因为它会比较引用而不是值。但是,您无法盲目地将其更改为使用equals
,因为引用可能为null。要查看两个Integer
对象是否相等,您需要类似
a == b || (a != null && a.equals(b))
并测试它们是否不同,请在整个事情上使用!
。