关闭

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

标签: 并查集
105人阅读 评论(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网站的观点或立场

[算法系列之二十八]并查集(不相交集合)

一 概述并查集(Disjoint set或者Union-find set)是一种树型的数据结构,常用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。有一个联合-查找算法(union...
  • SunnyYoona
  • SunnyYoona
  • 2015-03-14 22:29
  • 2341

集合运算(并集、交集、余集)

问题描述   给出两个整数集合A、B,求出他们的交集、并集以及B在A中的余集。 输入格式   第一行为一个整数n,表示集合A中的元素个数。   第二行有n个互不相同的用空格隔开的整数,...
  • Tao_222
  • Tao_222
  • 2016-03-19 15:30
  • 2717

并查集的一些基本概念以及基本操作(初始化,合并,查询等操作)

首先要明白的是为什么会有并查集这种数据结构的出现,我们知道,对于一些比较常见的实际问题,举个简单的例子 比如说,我们要在一个无重复数据的数组中寻找一个指定的元素,那么最简单的方法就是直接for循环一遍...
  • liujian20150808
  • liujian20150808
  • 2016-03-11 20:29
  • 2063

九度OJ-1444:More is better(用并查集求集合大小)

本题可抽象为求各个连通子图的顶点数的最大值。进一步抽象为求各个集合的个数的最大值。同样采用并查集实现集合的合并。   以下有两个版本。改进版是看完《机试指南》后启发,将统计集合元素数的操作封装进了un...
  • u012963208
  • u012963208
  • 2017-02-09 01:16
  • 88

并查集和DFA——北京大学暑期课《ACM/ICPC竞赛训练》

  • 2017-05-14 20:22
  • 1.57MB
  • 下载

可持久化并查集(外传)——[按秩启发式合并]

重新开坑奉上最近觉得的神作(至少从小说与这首曲子来说是这样的)。之前写到过可持久化并查集三部曲,现在想来,唯独没有提到按秩合并,在研习了启发式合并后,决定重新为并查集写一份外传,记录并查集的另一作用。...
  • lemonoil
  • lemonoil
  • 2017-07-09 20:49
  • 364

NOJ——1508火烧赤壁2(并查集+启发式合并+逆序加边)

[1508] 火烧赤壁2 时间限制: 1000 ms 内存限制: 65535 K 问题描述 上次出了一道火烧赤壁的题目给当时的新生,也就是你们的上一届学长们做,那么这次,我又想到了另一个想法。 上...
  • a88770202
  • a88770202
  • 2016-05-23 23:56
  • 743

HDU——1213How Many Tables(并查集按秩合并)

J - How Many Tables Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d &...
  • a88770202
  • a88770202
  • 2016-05-21 09:46
  • 167

【算法与数据结构】不相交集合——并查集

来自coursera的课程:普林斯顿大学的算法。 通俗地讲,在一堆item上进行两种操作,一是合并,即将某两个item所在的集合合并为一个大集合;二是查询,即给定的两个item是否属于同一个集合...
  • beiyouyu
  • beiyouyu
  • 2012-08-13 13:18
  • 3469

hdoj 4514 湫湫系列故事——设计风景线 【并查集 + 非连通图 求多棵树的最大直径】

湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015-08-03 21:05
  • 368
    个人资料
    • 访问:5023次
    • 积分:843
    • 等级:
    • 排名:千里之外
    • 原创:82篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条