POJ1703--Find them, Catch them
2015-08-23 19:14
375 查看
题目大意:有N个罪犯,分属于两个团伙。有两种操作,一、D表示两个罪犯不在同一个团伙,二、A表示判断两个罪犯是否属于同一个团伙。操作m次
分析:对每个罪犯创建2个元素,i-x,i-y,都用并查集维护。i-x表示i属于x类。查询的时候判断i-x与j-x,i-x与j-y的关系即可。合并的时候,合并i-x与j-y,j-x与i-y。
代码:
分析:对每个罪犯创建2个元素,i-x,i-y,都用并查集维护。i-x表示i属于x类。查询的时候判断i-x与j-x,i-x与j-y的关系即可。合并的时候,合并i-x与j-y,j-x与i-y。
代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 111111; int n, m; int fa[2*maxn+1]; int Find(int x) { return fa[x] == x ? x : fa[x] = Find(fa[x]); } void Union(int x, int y) { int p1 = Find(x); int p2 = Find(y); if(p1 != p2) fa[p1] = p2; } int main() { int T; scanf("%d", &T); while(T--) { scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) { fa[i] = i; fa[n+i] = n+i; } char op[2]; while(m--) { int a, b; scanf("%s%d%d", op, &a, &b); int p1 = Find(a); int p2 = Find(b); int p3 = Find(n+a); int p4 = Find(n+b); if(op[0] == 'A') { if(p1 != p2 && p1 != p4) printf("Not sure yet.\n"); else if(p1 != p2 || p3 != p4) printf("In different gangs.\n"); else printf("In the same gang.\n"); } else { Union(a, b+n); Union(a+n, b); } } } return 0; }
相关文章推荐
- cocos2d-x3.x屏蔽遮罩层屏蔽触摸button
- Meclipse 10 设置 new 菜单
- 【英语】Bingo口语笔记(57) - 常见的口语弱读
- 《iPhone高级编程—使用Mono Touch和.NET/C#》
- POJ3614--Sunscreen
- cocos2d-x-3.5 socket编程
- 母牛生小牛
- SublimeText更换皮肤
- Unrecognized Windows Sockets error: 0
- POJ2236--Wireless Network
- 黑马程序员----IO流以及文件的操作
- 蓝桥杯练习:基础练习 01字串
- uva 575
- cer证书签名验证
- TCP协议增强器的应用实践
- FLVplayback组件
- 【设计和算法分析】3、二进制搜索
- [Phalcon] Phalcon系统默认事件列表
- HDU5420 : Victor and Proposition
- 计算1至n中数字X出现的次数