JAVA 并查集 举个例子
时间: 2023-09-07 16:04:21 浏览: 119
Java实现的并查集的代码示例
### 回答1:
并查集是一种常用的数据结构,用于解决联通性问题,通常应用于图论中。以下是一个使用Java实现并查集的示例。
假设我们有一个由10个节点构成的图,节点编号分别为0-9。现在我们需要将这10个节点分成3个集合,其中第一个集合包括节点0,1,2,第二个集合包括节点3,4,5,第三个集合包括节点6,7,8,9。我们可以使用并查集来实现这个目标。
下面是使用Java实现并查集的示例代码:
```java
public class UnionFind {
int[] parent;
public UnionFind(int n) {
parent = new int[n];
for (int i = 0; i < n; i++) {
parent[i] = i;
}
}
public int find(int x) {
if (parent[x] == x) {
return x;
}
return parent[x] = find(parent[x]);
}
public void union(int x, int y) {
int px = find(x);
int py = find(y);
parent[px] = py;
}
public static void main(String[] args) {
UnionFind uf = new UnionFind(10);
uf.union(0, 1);
uf.union(1, 2);
uf.union(3, 4);
uf.union(4, 5);
uf.union(6, 7);
uf.union(7, 8);
uf.union(8, 9);
System.out.println(uf.find(0) == uf.find(2));
System.out.println(uf.find(3) == uf.find(5));
System.out.println(uf.find(6) == uf.find(9));
}
}
```
这个示例中,我们首先创建一个长度为10的并查集,表示有10个节点。然后我们调用`union()`方法将节点分成3个集合。最后,我们可以使用`find()`方法查询两个节点是否在同一个集合中。
运行这个示例代码,可以看到输出结果为:
```
true
true
true
```
这说明节点0、1、2在同一个集合中,节点3、4、5在同一个集合中,节点6、7、8、9在同一个集合中,符合我们的预期。
### 回答2:
并查集是一种用于处理元素分组和查找的数据结构。在JAVA中,可以使用数组和指针实现一个并查集。
举个例子来说明,假设有5个元素{1, 2, 3, 4, 5},初始时每个元素都是独立的组,即每个元素是一个独立的集合。下面以操作序列为例,演示并查集的使用。
1. 初始化并查集,分别给每个元素设置一个集合代表元素。
假设初始时集合代表元素为{1, 2, 3, 4, 5}。
2. 根据需求进行合并操作,将元素合并到同一个组中。
假设合并操作为(1, 2),即将元素1和元素2合并到同一个组中。此时集合代表元素为{1, 2, 3, 4, 5},但元素1和元素2在同一个组。
3. 再进行合并操作,合并元素3和元素4到同一个组中。
合并操作为(3, 4),此时集合代表元素为{1, 2, 3, 3, 5},元素3和元素4在同一个组。
4. 进行查找操作,判断两个元素是否在同一个组。
查找操作为(2, 4),根据之前的合并操作,元素2和元素4应该在同一个组中。结果为true。
5. 再进行查找操作,判断元素1和元素5是否在同一个组。
查找操作为(1, 5),元素1和元素5没有进行过合并操作,所以不在同一个组中。结果为false。
通过以上例子可以看出,并查集可以快速判断两个元素是否在同一个组中,以及合并两个元素到同一个组中。并查集在图论、网络连通性等问题中有广泛应用。
### 回答3:
JAVA 并查集是一种用于处理不相交集合合并与查询问题的数据结构。它主要涉及两个基本操作:合并和查找。
举个例子来说明并查集的使用。假设有一个朋友圈的关系网,我们需要根据人们的好友关系构建一个并查集。
我们可以创建一个Person类来表示每个人,其中包含两个属性:id和parent。
```java
class Person {
int id;
int parent;
public Person(int id) {
this.id = id;
this.parent = id; // 初始化时每个人的父节点都是自己
}
}
```
然后我们创建一个并查集类,并实现合并和查找操作。
```java
class UnionFind {
Person[] people;
public UnionFind(int n) {
people = new Person[n];
for (int i = 0; i < n; i++) {
people[i] = new Person(i);
}
}
public int find(int x) {
if (people[x].parent != x) {
people[x].parent = find(people[x].parent); // 路径压缩
}
return people[x].parent;
}
public void union(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) {
people[rootX].parent = rootY; // 合并两个集合
}
}
}
```
接下来,我们可以使用并查集来处理好友关系,并查找某两个人是否属于同一个朋友圈。
```java
public class Main {
public static void main(String[] args) {
int n = 5; // 总共有5个人
UnionFind uf = new UnionFind(n);
uf.union(0, 2); // 将人0和人2合并到同一个朋友圈
uf.union(1, 3); // 将人1和人3合并到同一个朋友圈
System.out.println(uf.find(0) == uf.find(2)); // 输出true,说明人0和人2属于同一个朋友圈
System.out.println(uf.find(1) == uf.find(4)); // 输出false,说明人1和人4不属于同一个朋友圈
}
}
```
通过以上示例,我们可以看出JAVA 并查集可以帮助我们快速并且高效地处理不相交集合合并与查询问题。
阅读全文