题目地址:POJ1703【Find them, Catch them】

题目描述:
Tadu市的警察局决定结束混乱,因此要采取行动,根除城市中的两大帮派:龙帮和蛇帮。然而,警方首先需要确定某个罪犯是属于哪个帮派。目前的问题是,给出两个罪犯,他们是属于同一个帮派吗?您要基于不完全的信息给出您的判断,因为歹徒总是在暗中行事。假设在Tadu市现在有N(N≤105)个罪犯,编号从1到N。当然,至少有一个罪犯属于龙帮,也至少有一个罪犯属于蛇帮。给出M(M≤105)条消息组成的序列,消息有下列两种形式:

  1. D [a] [b]
    其中[a]和[b]是两个犯罪分子的编号,他们属于不同的帮派;
  2. A [a] [b]
    其中[a]和[b]是两个犯罪分子的编号,您要确定a和b是否属于同一帮派。

输入描述:
输入的第一行给出给出一个整数T(1≤T≤20),表示测试用例的个数。后面跟着T个测试用例,每个测试用例的第一行给出两个整数N和M,后面的M行每行给出一条如上面所描述的消息。

输出描述:
对于在测试用例中的每条“A [a] [b]”消息,您的程序要基于此前给出的信息做出判断。回答是如下之一 “In the same gang.”,“In different gangs.”或“Not sure yet.”。

输入样例:

1
5 5
A 1 2
D 1 2
A 1 2
D 2 4
A 1 4

输出样例:

Not sure yet.
In different gangs.
In the same gang.

思路:
龙帮和蛇帮的罪犯各组成一个集合,设set[d]为罪犯d所属集合的代表元,set[d+n]为另一集合的代表元,1≤d≤n。函数set_find(i)查找罪犯i所属并查集的代表元,同时进行路径压缩,1≤i≤2n。
初始时set[d]=-1,即每个罪犯自成一个帮派。按照如下方法处理每条消息s:
确定a和b是否属于同一帮派(s[0]==‘A’)

  • 如果a和b不属同一帮派(set_find(a)!=set_find(b)),且a所属的帮派与b的另一帮派也不相同(set_find(a)!=set_find(b+n)),则不能确定a和b是否属于同一帮派;
  • 否则,如果罪犯a所属集合的代表元与罪犯b所属集合的代表元相同(set_find(a)=set_find(b)),则确定a和b同属一个帮派;
  • 否则,可以确定a和b属于不同的帮派。

题记:
find_set函数中返回的是set[p] = find_set(set[p]),而不是find_set(set[p])

参考链接:并查集讲解

代码:

#include<cstdio>
#include<cstring>
const int maxn = 1e5+5;
int set[maxn + maxn];
int find_set(int p)// 查找p所在集合的代表元,用路径压缩优化
{if(set[p] < 0) return p;return set[p] = find_set(set[p]);
}
void join_set(int p,int q)// 将p所在的集合并入q所在的集合
{p = find_set(p);q = find_set(q);if(p != q)set[p] = q;
}
int main()
{int t;char str[5]; scanf("%d",&t);while(t--){int n,m,a,b;memset(set,-1,sizeof(set));scanf("%d %d",&n,&m);while(m--){scanf("%s%d%d",str,&a,&b);if(str[0] == 'A'){if(find_set(a) != find_set(b))//如果a 不属于 b 组织 if(find_set(a) != find_set(b+n))//如果a 不属于 b 的另一组织printf("Not sure yet.\n");else// a 属于 b 的另一组织printf("In different gangs.\n");else//a b 属于同一个组织printf("In the same gang.\n");}else{join_set(a,b+n);//a 属于 b 的另一组织组织join_set(b,a+n);//b 属于 a 的另一组织组织}}}return 0;
}

POJ1703【Find them, Catch them】(并查集模板题)相关推荐

  1. 【SCAU 新生赛】18247 aler的旅游计划 并查集模板题

    18247 aler的旅游计划 该题有题解 时间限制:1000MS 代码长度限制:10KB 提交次数:15 通过次数:0 收入:10 题型: 编程题 语言: 不限定 Description aler想 ...

  2. 战争来临(并查集模板题)

    战争来临(并查集模板题) 描述   那一个骑单车卖报纸的少年 恐慌的眼泪慢慢布满了侧脸----<战争世界>   B国对A国发动了侵略战争,A国不得不全力抵御.A国幅员辽阔,后方群众的支援补 ...

  3. 并查集模板题(stl 中map的运用)

    DongDong认亲戚 DongDong每年过春节都要回到老家探亲,然而DongDong记性并不好,没法想起谁是谁的亲戚(定义:若A和B是亲戚,B和C是亲戚,那么A和C也是亲戚),她只好求助于会编程的 ...

  4. PAT题解-1118. Birds in Forest (25)-(并查集模板题)

    如题... #include <iostream> #include <cstdio> #include <algorithm> #include <stri ...

  5. POJ1703 Find them, Catch them 并查集

    点击打开链接 Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 50757   Ac ...

  6. 【畅通工程 HDU - 1232 】【并查集模板题】

    并查集讲解和模板 有一个博文对此分析的很透彻,附链接 为避免原链接失效,现摘录如下: 为了解释并查集的原理,我将举一个更有爱的例子. 话说江湖上散落着各式各样的大侠,有上千个之多.他们没有什么正当职业 ...

  7. 洛谷P1536村村通(并查集模板题)

    问题出处: https://www.luogu.com.cn/problem/P1536 题目描述: 某市调查城镇交通状况,得到现有城镇道路统计表.表中列出了每条道路直接连通的城镇.市政府 " ...

  8. HDU 1213 How Many Tables(并查集模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1213 题意: 这个问题的一个重要规则是,如果我告诉你A知道B,B知道C,这意味着A,B,C知道对方,所以他们可以 ...

  9. 强盗团伙(啊哈-并查集[模板])

    题目 快过年了,犯罪分子们也开始为年终奖"奋斗"了,小哼的家乡出现了多次抢劫事件.由于强盗人数过于庞大,作案频繁,警方想查清楚到底有几个犯罪团伙实在是太不容易了,不过警察叔叔还是搜 ...

最新文章

  1. spring Ioc本质
  2. Java环境变量的配置 (Win10环境下)
  3. jcenter和maven下载失败Can't connect to SOCKS proxy:Connection refused: connect
  4. 改logback logstash-logback-encoder 框架本身的日志级别
  5. 查看iis的log日志,并按访问量最大的天数倒排序
  6. mysql数据库访问组件_mysql数据库访问组件
  7. 大学计算机 学生成绩表格,学生成绩分析系统的设计与实现
  8. 感觉中国程序员前景一片灰暗,是这样吗?Android开发工程师为你答疑解惑
  9. 微信公众号开发 获取openid时报错40163:code been used问题的解决
  10. C语言递归解决水洼问题
  11. Java逐行读取fasta文件
  12. 转载和积累系列 - linux 生成KEY的方法与使用
  13. 推荐一款过滤百度广告的神器
  14. 图片文件如何批量改名,分享批量改名小技巧
  15. 流媒体2020最新研究场景与ideal
  16. 结合使用katex html2canvas 将LaTeX公式保存为图片
  17. oracle crm系统叫什么,目前市场上的CRM系统有哪些
  18. 网站怎么赚钱? 靠流量赚钱吗? 广告吗? 建什么网站赚钱
  19. 基于thinkphp校园二手交易网站#毕业设计
  20. 北京大学2009年4月18日计算机会场QA

热门文章

  1. Xcode 使用github
  2. 2022大厂面试合集,2022年Android大厂面试
  3. 外籍团队工作有感:4、关于文档
  4. java 绘制长方形_Java如何使用GUI绘制一个实心的矩形?
  5. 智能数字橱窗投影广告——让橱窗玻璃变身数字高清大屏
  6. maven项目进行单元测试时报错:Method initializationError not found;Openning the test class
  7. iOS——内购支付详解后台操作(一)
  8. Trie 树——Golang实现
  9. The Game of iGameGuardian7.3.1
  10. qrcode.js使用js生成二维码(并下载)的实践