图学的有点自闭,再加上用到了并查集、模拟栈、搜索,先补一下这些相对基础的东西
跟普通并查集区别:
1、数组开两倍
2、union_set(a+n,b)和union_set(a,b+n);
3、判断:
find(a)==find(b)同队
find(a)==find(b+n)不同队
不需要再"||f(a+n)==f(b+n)"了

警方决定捣毁两大犯罪团伙:龙帮和蛇帮,显然一个帮派至少有一人。该城有N个罪犯,编号从1至N(N<=100000。将有M(M<=100000)次操作。
D a b 表示a、b是不同帮派 A a b 询问a、b关系 Input 多组数据。第一行是数据总数 T (1 <= T <=
20)每组数据第一行是N、M,接下来M行是操作 Output 对于每一个A操作,回答"In the same gang.“或"In
different gangs.” 或"Not sure yet."

最开始思路是两个数组,跟这个有点相似,不过没分析明白,转而更加偏向用结构体,不过写不出来。
思路参考别人的题解,学习到了种类并查集。感觉像是找了个跳板。自己重新写了一遍。代码简洁明了。

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <map>
#include <vector>using namespace std;
const int MAXN = 100005;
int S[2 * MAXN];
int find(int x) {int r = x;while (S[r] != -1)r = S[r];int i = x, j;while (i != r) {j = S[i];S[i] = r;i = j;}return r;
}
void union_set(int a, int b) {int u = find(a), v = find(b);if (u != v) S[v] = u;
}
int main() {#ifdef LOCALfreopen("zz_in.txt", "r", stdin);freopen("zz_op.txt", "w", stdout);
#endifint t, i, j, k, n, m, a, b;char flag;cin >> t;while (t--) {memset(S, -1, sizeof(S));scanf("%d %d", &n, &m);for (i = 0; i < m; i++) {getchar();scanf("%c %d %d", &flag, &a, &b);if (flag == 'D') {union_set(a + n, b);union_set(a, b + n);}if (flag == 'A') {if (find(a) == find(b))printf("In the same gang.\n");else if (find(a) == find(b + n))printf("In different gangs.\n");elseprintf("Not sure yet.\n");}}}#ifdef LOCALprintf("Time used = %.2f\n", (double) clock() / CLOCKS_PER_SEC);
#endifreturn 0;
}

种类并查集(POJ1703)相关推荐

  1. Poj(1703),种类并查集

    题目链接:http://poj.org/problem?id=1703 已经不是第一次接触种类并查集了,直到今天才搞懂. 感谢红黑联盟,感谢杰哥!!! 每个节点只要关系确定,不管是不是同一个集合里面, ...

  2. BZOJ 1370: [Baltic2003]Gang团伙 [并查集 拆点 | 种类并查集WA]

    题意: 朋友的朋友是朋友,敌人的敌人是朋友:朋友形成团伙,求最多有多少团伙 种类并查集WA了一节课,原因是,只有那两种关系才成立,诸如朋友的敌人是朋友之类的都不成立! 所以拆点做吧 #include ...

  3. poj 1703(种类并查集)

    题目大意:在这个城市里有两个黑帮团伙,现在给出N个人,问任意两个人他们是否在同一个团伙 输入D x y代表x于y不在一个团伙里 输入A x y要输出x与y是否在同一团伙或者不确定他们在同一个团伙里 解 ...

  4. Find them, Catch them POJ - 1703(种类并查集)

    题意: 在这个城市里有两个黑帮团伙,现在给出N个人,问任意两个人他们是否在同一个团伙 1.输入D x y代表x于y不在一个团伙里 2.输入A x y要输出x与y是否在同一团伙或者不确定他们在同一个团伙 ...

  5. 2016陕西省ACM 热身体B 种类并查集

    Energy 发布时间: 2017年3月27日 11:31   最后更新: 2017年3月27日 18:30   时间限制: 1000ms   内存限制: 256M 描述 人类准备发射载人飞船前往火星 ...

  6. Mahmoud and a Dictionary CodeForces - 766D 种类并查集

    题意 给出多个字符串 然后再输入多个字符串之间的关系 让我们判断这其中是否存在矛盾的关系 有矛盾输出NO 没矛盾输出 YES 然后再输入多个询问 每个询问 两个字符串 让我们判断其中的关系 同义词输出 ...

  7. POJ 1703 Find them, Catch them 种类并查集

    题意 给出一堆点和关系 D为两点不同集合 A为查询两点是否不同集合 n<=1e5 code #include<cstdio> #include<iostream> #in ...

  8. 【POJ - 1703】Find them, Catch them(带权并查集之--种类并查集 权为与父节点关系)

    题干: Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 36176   Accep ...

  9. POJ1182 食物链---(经典种类并查集)

    题目链接:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...

最新文章

  1. python scrapy 入门,10分钟完成一个爬虫
  2. 简单的图片处理servlet
  3. mysql保留2位小数字段如何设置 浮点数
  4. 安装ipvsadm 用make编译出现错误解决方法
  5. CTFshow 反序列化 web254
  6. PYPL 7月榜单公布:Java份额出现下降趋势
  7. git/ssh捋不清的几个问题
  8. 什么是条件组合覆盖_什么是综合评价?高中生报名有哪些好处?
  9. mp.weixin.php,GitHub - temberature/mp-php-sdk: 微信公众平台第三方授权php开发包, weixin mp developer SDK....
  10. mysql 基本操作和问题
  11. 相克军_Oracle体系_随堂笔记011-事物
  12. JAVA处理字符串压缩以及文件压缩
  13. 独家干货|基于大数据的人体组织微结构的解析与构建
  14. python计算复数模_python 模拟casio复数计算器【施工中】
  15. 移动端rem字体大小适配
  16. ios工程广告添加:广告sdk、广告中介添加(出海App)
  17. 《计算机操作系统》重点知识笔记整理(一)
  18. 关于机械系2011年硕士生复试有关事…
  19. JAVA String时间转化为数据库Date类型
  20. 【Appium学习总结1】----原理

热门文章

  1. 【Swift 60秒】51 - Closures as parameters
  2. 10G SR光模块取消ER调试可行性分析
  3. DDR从channel/rank/chip/bank/row/col/cell,DDR/GDDR/HBM
  4. 宝宝培养 IOS APP 上线
  5. Python基础学习第七天
  6. 银行数字化转型导师坚鹏:基于招商银行案例研究的银行APP运营
  7. ping检测整个网段地址在线
  8. html图片用什么软件打开,.svg是什么文件 用什么软件打开
  9. Win10系统彻底关闭自动更新方法——亲测有效
  10. 网站地图是什么?该如何生成