并查集Union-Find Sets

来源:互联网 发布:如何制作常用算法演示 编辑:程序博客网 时间:2024/06/06 04:16
vector<int> father(n);vector<int> rank(n);/***   并查集初始化:*   数组father中的元素初始为独立的树,father的下标i表示节点。*   father[i]的值表示i节点的父节点。*   rank[i]=1表示初始时所有结点的高度为1.*/void init(){    for (int i = 0; i < n; i++)    {        father[i] = i;        rank[i] = 1;    }}/***   路径压缩:*   每次调用getFather()时将元素压缩成最原始父节点的直接子节点。*/int getFather(int son){    if (father[son] == son)        return son;    else    {        father[son] = getFather(father[son]);        return father[son];    }}/***   合并两不相交的集合:*/void union1(int x, int y){    int fx = getFather(x);    int fy = getFather(y);    if (fx != fy)        father[fx] = fy;}/***   利用rank数组启发式合并:*/void Union2(int x, int y){    int fx = getFather(x);    int fy = getFather(y);    if (fx == fy)   return;    //rank[fx]越大,说明越靠近根节点    if (rank[fx] > rank[fy])        father[fy] = fx;    else    {        if (rank[fx] == rank[fy])            rank[fx]++;        father[fx] = fy;    }}
0 0
原创粉丝点击