PAT知识点-并查集
定义
1 2
| const int MAX=1010; int father[MAX];
|
初始化
1 2 3 4 5 6 7
| void init(int n) { for(int i=1;i<=n;i++) { father[i]=i; } }
|
查
1 2 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]; } }
|
并
1 2 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)
表示图
并查集可以用来表示图,一个例子如下:
1 2 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); }
|
统计图的连通分量个数
在并查集表示的图当中,根节点的个数就是连通分量的个数
1 2 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; }
|