void Find(int x){
if(pre[x] != x) pre[x] = Find(pre[x]);
return pre[x];
}
int Find(int x){
int p, tmp;
p = x;
while(x != pre[x]){
x = pre[x];
}
while(p != x){
tmp = pre[p];
pre[p] = x;
p = tmp;
}
return x;
}
并查集的应用有很多这里给大家推荐一道很好的题。http://120.78.128.11/Problem.jsp?pid=2144
这道题的代码如下:
int pre[maxn], maxx[maxn], num[maxn];
int Find(int x){
int p, tmp;
p = x;
while(x != pre[x]){
x = pre[x];
}
while(p != x){
tmp = pre[p];
pre[p] = x;
p = tmp;
}
return x;
}
void join(int x, int y){
int p, q;
p = Find(x);
q = Find(y);
if(p != q){
pre[p] = q;
maxx[q] = max(maxx[p], maxx[q]);
num[q] += num[p];
}
}
int main(){
int n, m;
char str[10];
while(~scanf("%d%d",&n, &m)){
for(int i = 1; i <= n; i++){
pre[i] = i;
num[i] = 1;
maxx[i] = i;
}
int Set = n;
while(m--){
getchar();
int x, y;
scanf("%s",str);
if(str[0] == 'u'){
scanf("%d%d",&x, &y);
if(Find(x) != Find(y)){
join(x,y);
Set--;
}
}
else if(str[0] == 's' && str[1] == 'a'){
scanf("%d%d",&x, &y);
if(Find(x) == Find(y)) puts("1");
else puts("0");
}
else if(str[0] == 'n'){
scanf("%d",&x);
printf("%d\n",num[Find(x)]);
}
else if(str[0] == 'm'){
scanf("%d", &x);
printf("%d\n", maxx[Find(x)]);
}else{
printf("%d\n",Set);
}
}
}
return 0;
}
这个题就很好的展示了并查集的一些基本操作。