在学习最小生成树的两种算法前,先学下并查集。
并查集的思想是,对于一个集合,使用集合中的一个顶点作为特殊点,集合里所有的点都与此特殊点直接相连;而并查集的查询,就相当于查询两个两个顶点是否为同一个父亲,这也是findSet(x)里之所以有fa[x]==x时,fa[x]=x的原因。
并查集之查询、合并 模板如下:
int fa[30010]; void makeSet(int n) //初始化,n个元素,处于单独集合 { for(int i=0;i<n;i++) fa[i]=i; } int findSet(int x) //找到点x的父亲,递归 { return fa[x]=fa[x]==x?x:findSet(fa[x]); } void unionSet(int x,int y) //把父亲相同的合并成同一个集合 { int a=findSet(x),b=findSet(y); if(a!=b) fa[b]=a; //路径压缩;即在查询的时候,修改fa值 }