题目:
数据输入、输出:
代码:
#include<stdio.h>
int bin[1002];
int findx(int x){
int r=x;
while(bin[r]!=r)
r=bin[r];
return r;
}
void merge(int x,int y)
{
int fx,fy;
fx=findx(x);
fy=findx(y);
if(fx!=fy)
bin[fx]=fy;
}
int main(){
int n,m,i,x,y,count;
while(scanf("%d",&n),n){
for(i=1;i<=n;i++)
bin[i]=i;
for(scanf("%d",&m);m>0;m--){
scanf("%d %d",&x,&y);
merge(x,y);
}
for(count=-1,i=1;i<=n;i++)
if(bin[i]==i)count++;
printf("%d\n",count);
}
return 0;
}
运用知识点:
并查集 :在一些有N个元素的集合应用中,按一定的顺序把集合合并,并查找所需的那个数在那个集合中。
1、合并集合;
2、查找数组
代码实现:
重点在于find函数;
int find(int x) //返回x的祖宗结点 + 路径优化
{
if(p[x]!=x) p[x] = find(p[x]); // p[x]!=x,说明不是祖宗结点
return p[x];
}
或者可以更简单理解为:
int find (int x)
{
if(p[x] != x)
{
int t = find(p[x]); //寻找祖宗结点
p[x] = t; //路径压缩
}
return p[x];
}
练题:https://www.luogu.com.cn/problem/P3367