关闭

并查集——求合并后集合 的大小

标签: 并查集
56人阅读 评论(0) 收藏 举报
分类:

输入n对关系,没对关系用两个不超过20的字符串表示……说明s1和s2是一个集合……求合并到最后的集合大小

#include<bits/stdc++.h>
using namespace std;
struct d{
    string s;
    int num;
};
int tot=0;
map<string,int> a;
d father[10002];
d size[10002];
int n,i=0;
void init(){                    //1.初始化
    for(int i=1;i<=2*n;i++)
    {
        father[i].num=i;
        size[i].num=1;
    }
}
//2.查找
int get(int x){
    if(father[x].num==x) return x;
    int y=father[x].num;
    father[x].num=get(y);
    return father[x].num;
}
void merge(int a,int b){//带路径压缩
    a=get(a);           //找根结点的编号
    b=get(b);   
    if(a!=b){   //a,b不是同一集合
        father[a].num=b;            //将前一个集合与后一个集合合并
        size[b].num+=size[a].num;           //将a合并到b

    }
}
int main(){
    cin>>n;
    init();
    for(int i=1;i<=n;i++)
    {
        string s1,s2;
        cin>>s1>>s2;
        if(!a.count(s1)){   //如果s1不在集合中 集合的元素个数增加,s1获得编号tot+1
            a[s1]=tot+1;                   //将s1入栈,编号tot+1
            father[tot+1].s=s1;         //father数组里新增一个集合s1.其num为tot+1
            size[tot+1].s=s1;           //第tot+1个集合
            tot++;
        }
        if(!a.count(s2))
        {
            a[s2]=tot+1;
            father[tot+1].s=s2;
            size[tot+1].s=s2;
            tot++;
        }
        merge(a[s1],a[s2]);
        cout<<size[get(a[s2])].num<<endl;
    }
    return 0;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1505次
    • 积分:362
    • 等级:
    • 排名:千里之外
    • 原创:36篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档