HDOJ-1213(并查集)

并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。

How Many Tables

题目大意:

  有一个人生日,找了很多个好友吃饭,假设好友A认识好友B,好友B认识好友C,那么ABC可以作为一桌吃饭。求请所有朋友需要多少张桌子。

采用并查集,用一个数组保存每一个人的认识好友,比如A认识B,那么A数组保存的是B,B认识C,那么B又指向C,因为A保存的是B,那么将A也指向C,然后统计数组中有多少个不同的数字。


import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main{
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		int n = cin.nextInt();
		while (n-- > 0) {
			int size = cin.nextInt();
			int c = cin.nextInt();
			UnionFind unionFind = new UnionFind(size);
			while (c-- > 0) {
				unionFind.union(cin.nextInt(), cin.nextInt());
			}
			System.out.println(unionFind.count());
		}
	}
}

class UnionFind {

	private int value[];

	public UnionFind(int n) {
		value = new int[n + 1];
		for (int i = 1; i < n; i++) {
			value[i] = i;
		}
	}

	public void union(int x, int y) {
		int xV = value[x];
		int yV = value[y];
		if (xV != yV) {
			for (int i = 1; i < value.length; i++) {
				if (value[i] == xV) {
					value[i] = yV;
				}
			}
		}
	}

	public int find(int x) {
		return value[x];
	}

	public int count() {
		Set set = new HashSet();
		for (int i = 1; i < value.length; i++) {
			set.add(value[i]);
		}
		return set.size();
	}
}

 

你可能感兴趣的:(并查集,HDOJ-1213,并查集)