POJ - 1703 Find them, Catch them(带权并查集)
2015-09-16 00:16
405 查看
题目大意:有两个帮派,N个人,现在有M个操作
A u v:表示询问,问u和v是不是属于同一个帮派的
D u v:表示u和v是在不同的帮派的
解题思路:带权并查集,刚开始都初始化为0,剩下的操作就是带权并查集模版了
如果u和v到根的权值不同的话,表示两个人帮派不同,如果相同的话,就表示帮派相同了
A u v:表示询问,问u和v是不是属于同一个帮派的
D u v:表示u和v是在不同的帮派的
解题思路:带权并查集,刚开始都初始化为0,剩下的操作就是带权并查集模版了
如果u和v到根的权值不同的话,表示两个人帮派不同,如果相同的话,就表示帮派相同了
[code]#include <cstdio> #include <cstring> const int N = 100010; int n, m; int f , r ; void init() { for (int i = 1; i <= n; i++) { f[i] = i; r[i] = 0; } } int find(int x) { if (x == f[x]) return x; int t = find(f[x]); r[x] = (r[x] + r[f[x]]) % 2; return f[x] = t; } void solve() { char str[10]; int x, y; while (m--) { scanf("%s%d%d", str, &x, &y); int tx = find(x); int ty = find(y); if (str[0] == 'A') { if (tx != ty) { printf("Not sure yet.\n"); } else if (r[x] != r[y]) { printf("In different gangs.\n"); } else printf("In the same gang.\n"); } else { f[tx] = ty; r[tx] = (-r[x] + 1 + r[y] + 2) % 2; } } } int main() { int test; scanf("%d", &test); while (test--) { scanf("%d%d", &n, &m); init(); solve(); } return 0; }
相关文章推荐
- Python中的Berkeley DB(1):Hello Berkeley DB
- C语言之位操作符
- hdoj 2842 Chinese Rings 【递推 + 矩阵快速幂】
- Hadoop(六)——子项目Pig
- 关于win7系统的Oracle安装时的[INS-30131]问题的解决方案
- 初识OS
- TestNG 入门教程
- Servlet获取请求参数、表单验证(2015.9.15)
- 求解最大子数组问题
- 面试中的Singleton【转】
- java中的多继承
- Understanding hibernate first level cache with example
- 9月10日课程作业(练习)
- 省市县三级联动
- [LeetCode] Single Number III
- 02 商品的增删改
- Getting Started With the NDK(Pro Android Apps Performance Optimization)
- 欢迎使用CSDN-markdown编辑器
- 360校园招聘2016笔试题
- 表达式求值及转换算法