PAT知识点-并查集
定义
| 12
 
 | const int MAX=1010;int father[MAX];
 
 | 
初始化
| 12
 3
 4
 5
 6
 7
 
 | void init(int n){
 for(int i=1;i<=n;i++)
 {
 father[i]=i;
 }
 }
 
 | 
查
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | int findFather(int x){
 int a=x;
 while(x!=father[x])
 {
 x=father[x];
 }
 
 
 while(a!=father[a])
 {
 int z=a;
 father[a]=x;
 a=father[z];
 }
 }
 
 | 
并
| 12
 3
 4
 5
 6
 7
 
 | void Union(int a,int b){
 int fa=findFather(a);
 int fb=findFather(b);
 if(fa!=fb)
 father[fa]=fb;
 }
 
 | 
应用
分类
根据题目要求,将一些元素归到特定集合里。比如有元素a,b,在符合给定的条件下,将a,b归到同一集合。用Union(a,b)
表示图
并查集可以用来表示图,一个例子如下:
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | int n;
 scanf("%d",&n);
 int a,b;
 for(int i=0;i<n;i++)
 {
 scanf("%d%d",&a,&b);
 Union(a,b);
 }
 
 | 
统计图的连通分量个数
在并查集表示的图当中,根节点的个数就是连通分量的个数
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | const int MAXN=10010;bool isRoot[MAXN];
 
 
 
 int main()
 {
 
 
 
 for(int i=1;i<=n;i++)
 {
 isRoot[findFather[i]]=true;
 }
 int count=0;
 for(int i=1;i<=n;i++)
 {
 count+=isRoot[i];
 }
 printf("图的连通分量个数为:%d",count);
 return 0;
 }
 
 |