树:并查集

      在学习最小生成树的两种算法前,先学下并查集。

      并查集的思想是,对于一个集合,使用集合中的一个顶点作为特殊点集合里所有的点都与此特殊点直接相连;而并查集的查询,就相当于查询两个两个顶点是否为同一个父亲,这也是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值
}
原文地址:https://www.cnblogs.com/atmacmer/p/5177902.html