并查集模板

来源:互联网 发布:linux系统find命令 编辑:程序博客网 时间:2024/06/05 11:56
#include<cstdio>#define MAX 1000struct UnionFind{    int fa[MAX];    void make_set()//初始化    {        for (int i = 0; i < MAX; i++)fa[i] = i;    }    int find_set(int x)//查    {        return x == fa[x] ? x : fa[x] = find_set(fa[x]);    }    void union_set(int a, int b)//合并    {        int x = find_set(a);        int y = find_set(b);        if (x != y)        {            fa[y] = x;        }    }};int main(){}

[map版]

#include<cstdio>#include<map>using namespace std;struct UnionFind{    map<int,int>mp;    UnionFind()    {        mp.clear();    }    int find_set(int x)//查    {        return x == mp[x] ? x : mp[x] = find_set(mp[x]);    }    void union_set(int a, int b)//合并    {        int x = find_set(a);        int y = find_set(b);        if (x != y)        {            mp[y] = x;        }    }};

[可计数]

struct UnionFind{    int fa[MAX];    int num[MAX];    UnionFind()    {        make_set();    }    void make_set()//初始化    {        for (int i = 0; i < MAX; i++)        {            fa[i] = i;            num[i] = 1;        }    }    int find_set(int x)//查    {        return x == fa[x] ? x : fa[x] = find_set(fa[x]);    }    void union_set(int a, int b)//合并    {        int x = find_set(a);        int y = find_set(b);        if (x != y)        {            fa[y] = x;            num[x] += num[y];        }    }};