我转过一篇写的非常棒的并查集算法具体解释
地址:http://blog.csdn.net/a2459956664/article/details/50614096
int par[maxn] //父亲 int rank[maxn] //树的高度 //初始化n个元素 void init(int n) { for (int i= 0; i < n; i++){ par[i] = i; rank[i] = 0; } } //查询树的根 int find(int x) { if (par[x] == x){ return x; } else{ return par[x] = find(par[x]); } } //合并x和y所属的集合 void unite(int x, int y) { x = find(x); y = find(y); if (x == y) return; if (rank[x] < rank[y]){ par[x] = y; } else{ par[y] = x; if (rank[x] == rank[y]) rank[x]++; } } //推断x和y是否属于同一个集合 bool same(int x, int y) { return find(x) == find(y); }