题目描述

并查集,顾名思义有两个操作:合并和查询。

并就是把两个集合合并到一起。

查就是查询两个节点是否属于同一个集合。

每个节点有一个父节点。一个集合内存在一个唯一的根,判断根的条件就是节点的父节点是不是该节点本身。

合并操作就是把一个集合的根接到另一个集合的根上。

而查询操作就是找两个对象是否有同一个根。

查询过程中可以顺便进行路径压缩以优化后续查询:即让查找路径上所有节点的父节点直接等于根节点。

#include <iostream>
#include <algorithm>
#include <cstring>#define MAX 200005using namespace std;int root[MAX];
char names[MAX][50];unsigned int BKDRHash(char *str)
{unsigned int seed = 131;unsigned int hash = 0;while (*str){hash = hash * seed + (*str++);}return (hash & 0x7FFFFFFF) % MAX;
}int get_index(char *str) {int res = BKDRHash(str);while (strlen(names[res]) != 0 && strcmp(str, names[res])) {res++;res %= MAX;}if (strlen(names[res]) == 0) {strcpy(names[res], str);}return res;
}int get_root(int a) {if (root[a] == -1) root[a] = a;if (a != root[a]) {root[a] = get_root(root[a]);}return root[a];
}int main() {int n;int op;char s1[50], s2[50];int a, b;memset(root, -1, sizeof(root));cin >> n;while (n--) {cin >> op >> s1 >> s2;a = get_index(s1);b = get_index(s2);if (op == 0) {int fa = get_root(a), fb = get_root(b);root[fa] = fb;} else {int fa = get_root(a), fb = get_root(b);if (fa == fb) {cout << "yes" << endl;}else {cout << "no" << endl;}}}return 0;
}

转载于:https://www.cnblogs.com/xblade/p/4483306.html

[hiho 14]并查集相关推荐

  1. 2019.7.14 并查集P1197 [JSOI2008]星球大战 说能过那是假的(动态规划) cometoj #c6 双倍快乐

    星球大战 这题是使用了一个total变量持续记录连通块数目,极大减少了判断时间 一开始我直接用从0到n-1遍历找连通块,这样绝对超时 通过代码如下 #include<bits/stdc++.h& ...

  2. Codeforces Global Round 14 F. Phoenix and Earthquake 思维 + 并查集

    传送门 文章目录 题意: 思路: 题意: 给你nnn个点,mmm条边,限制xxx,每个点都有沥青aia_iai​,定义合并两个点即两点之间有边且au+av≥xa_u+a_v\ge xau​+av​≥x ...

  3. 挑战程序设计竞赛(算法和数据结构)——14.1互质的集合(并查集)的JAVA实现

    题目与思路: 代码: import java.util.Scanner; import java.util.Vector;public class DisjointSet {public static ...

  4. hiho#1066 : 无间道之并查集

    #1066 : 无间道之并查集 时间限制: 20000ms 单点时限: 1000ms 内存限制: 256MB

  5. 并查集 HDOJ 1232 畅通工程

    题目传送门 1 /* 2 并查集(Union-Find)裸题 3 并查集三个函数:初始化Init,寻找根节点Find,连通Union 4 考察:连通边数问题 5 */ 6 #include <c ...

  6. poj1256(贪心+并查集)

    题目链接:http://poj.org/problem?id=1456 题意:给n件商品的价格和卖出截至时间,每一个单位时间最多只能卖出一件商品,求能获得的最大利润. 思路:首先是贪心,为获得最大利润 ...

  7. hdu-----(4514)湫湫系列故事——设计风景线(树形DP+并查集)

    湫湫系列故事--设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  8. BZOJ-1854-[Scoi2010]游戏(并查集)

    Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性 ...

  9. codeforces 400D Dima and Bacteria 并查集+floyd

    题目链接:http://codeforces.com/problemset/problem/400/D 题目大意: 给定n个集合,m步操作,k个种类的细菌, 第二行给出k个数表示连续的xi个数属于i集 ...

最新文章

  1. system generator学习笔记【02】
  2. 创建linux启动盘,linux系统中如何创建windows启动盘的详细介绍
  3. python 利用matplotlib中imshow()函数绘图
  4. Linux下的简单好用的计算器bc
  5. Ubuntu16.04下安装cuda和cudnn的三种方法(亲测全部有效)
  6. Python编程一定要注意的那些“坑”(九):0与False
  7. 如何获取字符的ASCII值
  8. 很全很强大的官方API集合
  9. 推荐一个互联网电子书免费下载网站
  10. 指针数组与二维数组指针的本质区别
  11. 自动化框架到底是什么?
  12. 移动定位业务之“A-GPS(辅助全球卫星定位系统)”
  13. python网页搜索脚本_bing搜索引擎子域名收集(Python脚本)
  14. zmq pub/sub使用详解
  15. 计算机对操作系统函数的调用失败,win8系统电脑弹出提示“远程过程调用失败且未执行”的修复方法...
  16. 不要熬夜肝PPT了!络绎科学一键生成科研PPT工具Slidebot来啦!
  17. (23)Linux基础-系统磁盘阵列raid
  18. 当页面有缓存 路由传参无法更新试图
  19. 为什么用企业微信做私域运营
  20. Nett源码剖析ServerBootstrap的设置2021SC@SDUSC

热门文章

  1. 孩子学习arduino好还是单片机好
  2. mysql中图片的属性名是啥_数据库属性名
  3. office2003、2010、2013下载资源
  4. Docker基础命令学习
  5. 【全局盘点】华为云政企全栈技术创新能力图谱
  6. 如何批量重命名为不同文件名?
  7. 小菜鸟之HTML第二课
  8. 第一次开发EOS区块链的经验总结
  9. 会议OA之我的会议(排座送审)
  10. 这是我见过最接地气的PCB设计指南了!