算法竞赛模板 并查集

①基础并查集算法

#define MAX 100005
int p[MAX];
int find(int r)
{
    if(p[r]!=r)
        p[r]=find(p[r]);
    return p[r];
}
void join(int x,int y)
{
    int fx=find(x),fy=find(y);
    if(fx!=fy)p[fx]=fy;
}
void init()
{
    for(int i=1;i<=MAX;i++)
        p[i]=i;
}

 


②并查集加秩数组算法(计算每个家族里的总人数)

#define MAX 100005
int p[MAX],rank[MAX]; 
int find(int r)
{
    if(p[r]!=r)
        p[r]=find(p[r]);
    return p[r];
}
void join(int x,int y)
{
    int fx=find(x),fy=find(y);
    if(fx!=fy)
    {
        p[fx]=fy;
        rank[fy]+=rank[fx];
        rank[fx]=0;
    }
}
void init()
{
    for(int i=1;i<=MAX;i++)
        p[i]=i;
}

 

posted @ 2018-03-05 09:15  真想不出名字了  阅读(244)  评论(0编辑  收藏  举报