Algorithm_Union Find - xwu36/LeetCode GitHub Wiki

Disjoint Set (Or Union-Find)

A disjoint-set data structure is a data structure that keeps track of a set of elements partitioned into a number of disjoint (non-overlapping) subsets. A union-find algorithm is an algorithm that performs two useful operations on such a data structure:

Find: Determine which subset a particular element is in. This can be used for determining if two elements are in the same subset.

Union: Join two subsets into a single subset.

1. Use Array Data Structure

input graph shown as below:

     0
    |  \
    |   \
    1-----2

output should be: find a cycle

public static void main(String[] args) {
	// TODO Auto-generated method stub
	int[][] edges = {{0, 1}, {1, 2}};
	int[] parent = new int[3];
	for(int i = 0; i < parent.length; i++)
		parent[i] = i;
	for(int i = 0; i < edges.length; i++){
		int lParent = find(parent, edges[i][0]);
		int rParent = find(parent, edges[i][1]);
		if(lParent == rParent){
			System.out.println("find a cycle");
			return;
		}
		union(parent, lParent, rParent);
	}
	System.out.println("no cycle");
}

private static int find(int[] parent, int i){
	if(parent[i] == i)
		return i;
	return find(parent, parent[i]);
}

private static void union(int parent[], int x, int y){
	int xSet = find(parent, x);
	int ySet = find(parent, y);
	parent[xSet] = ySet;
}

See Problem #547. Friend Circles, Problem #130. Surrounded Regions. Problem #261. Graph Valid Tree