import java.util.Scanner;
/**
* ClassName:UnionFindSet <br/>
* Function: 并查集. <br/>
* Reason: 并查集. <br/>
* Date: 2013年10月14日 下午4:37:42 <br/>
* @author
* @version
* @since JDK 1.6
* @see
*/
public class UnionFindSet {
private int[] father;
private int[] rank;
/**
*
* make_set:<br />
* 把每一个元素初始化为一个集合
* 初始化后每一个元素的父节点是它本身
*
* @author zhangzhaoyu
*/
public void make_set() {
for (int i=0; i<father.length; i++) {
father[i] = i;
rank[i] = 0;
}
}
/**
*
* find_set:<br />
* 查找一个元素所在的集合,其重点是找到这个元素所在的
* 结合的祖先
*
* @author zhangzhaoyu
* @param x
* 要查找的元素
* @return
* 查找到祖先
*/
public int find_set_recursion(int x) {
if (x != father[x]) {
father[x] = find_set(father[x]);
}
return father[x];
}
/**
*
* find_set:<br />
* 将查找路径的所有节点都指向根节点
*
* @author zhangzhaoyu
* @param x
* @return
*/
public int find_set(int x) {
int k, root;
root = x;
while (root != father[root]) {
root = father[root];
}
while (x != root) {
k = father[x];
father[x] = root;
x= k;
}
return x;
}
public void union(int x, int y) {
x = find_set_recursion(x);
y = find_set_recursion(y);
if (x == y) {
return ;
}
if (rank[x] > rank[y]) {
father[y] = x;
} else if (rank[x] < rank[y]) {
father[x] = y;
} else {
rank[y]++;
father[x] = y;
}
}
/**
*
* printSet:<br />
* 打印各个数据集
*
* @author zhangzhaoyu
*/
public void print_set() {
for (int i=1; i<father.length; i++) {
if (father[i] == i) {
System.out.print("[ ");
for (int j=1; j<father.length; j++) {
int z = find_set(j);
if (z == i) {
System.out.print(j + " ");
}
}
System.out.println(" ]");
}
}
}
public void readData() {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
father = new int[n+1];
rank = new int[n+1];
make_set();
for (int i=1; i<=m; i++) {
int a = in.nextInt();
int b = in.nextInt();
int x = find_set_recursion(a);
int y = find_set_recursion(b);
union(x, y);
}
print_set();
}
public static void main(String[] args) {
new UnionFindSet().readData();
}
}
Union_Find_set
最新推荐文章于 2024-08-05 11:45:26 发布