看的这个博客学习,一看就懂。。
并查集的实现
int par[maxn];
int rank[maxn];
void init(int n) {
for (int i=0; i<n; i++) {
par[i]=i;
rank[i]=0;
}
}
int find(int root) {
int son,tmp;
son=root;
while (root!=par[root])
root=par[root];
while (son!=root) {
tmp=par[son];
par[son]=root;
root=tmp;
}
return root;
}
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]++;
}
}
bool same(int x, int y) {
return find(x)==find(y);
}