POJ 1703 Find them, Catch them
2013-11-26 09:47
281 查看
题意:罪犯有两个帮派,有两种命令,D a b,a,b表示罪犯的编号,这句话表示a和b来自不同的帮派。A a b,a,b表示罪犯的编号,这句话是问你a和b是否来自同一个帮派,可以有三种回答,“目前不确定“,”是“,”不是“。罪犯最多10^5个,命令最多10^5个。
解法:并查集基础题。用一个struct node表示每一个罪犯,node.f表示该罪犯的父亲节点,node.r表示该罪犯与父亲节点对应的罪犯的关系(0表示来自同一个帮派,1表示不同)。然后写find函数注意更新node.r就行。具体见代码吧。
Ps:另外,本题是POJ 1182的简化版,题解见POJ 1182 食物链。
tag:并查集
View Code
解法:并查集基础题。用一个struct node表示每一个罪犯,node.f表示该罪犯的父亲节点,node.r表示该罪犯与父亲节点对应的罪犯的关系(0表示来自同一个帮派,1表示不同)。然后写find函数注意更新node.r就行。具体见代码吧。
Ps:另外,本题是POJ 1182的简化版,题解见POJ 1182 食物链。
tag:并查集
/* * Author: Plumrain * Created Time: 2013-11-26 09:19 * File Name: G-POJ-1703.cpp */ #include <iostream> #include <cstdio> using namespace std; const int maxn = 100005; struct node{ int f, r; }; char s[10]; int n, m; node a[maxn]; void init() { for (int i = 0; i < n; ++ i){ a[i].f = i; a[i].r = 0; } } int find(int x) { if (x == a[x].f){ a[x].r = 0; return x; } int y = a[x].f; a[x].f = find(a[x].f); a[x].r = (a[y].r + a[x].r) % 2; return a[x].f; } void merge(int x, int y) { int t1 = find(x), t2 = find(y); a[t1].f = t2; a[t1].r = (a[y].r + a[x].r + 1) % 2; } int main() { int T; scanf ("%d", &T); while (T --){ scanf ("%d%d", &n, &m); init(); int x, y; while (m --){ scanf ("%s%d%d", s, &x, &y); int t1 = find(x), t2 = find(y); if (s[0] == 'D') merge(x, y); else{ if (t1 != t2) printf ("Not sure yet.\n"); else{ if (a[x].r == a[y].r) printf ("In the same gang.\n"); else printf ("In different gangs.\n"); } } } } return 0; }
View Code
相关文章推荐
- js 弹出框只弹一次
- Oracle_PL/SQL的基本写法_BEGIN_END块结构及简单的事务实现
- 新书《iOS应用逆向工程:分析与实战》
- 账号和权限管理
- 首例互联网垄断案-360诉腾讯垄断案今日9时开审
- 每天一个linux命令(57):ss命令
- 新书《iOS应用逆向工程:分析与实战》
- 新书《iOS应用逆向工程:分析与实战》
- 回溯算法解迷宫问题(C语言)
- iOS 7系列译文:认识 TextKit
- “泛魔”识别模型
- 使用cvCanny函数时注意的问题
- 每天一个linux命令(55):traceroute命令
- 每天一个linux命令(56):netstat命令
- 人生目标
- 15条JavaScript最佳实践
- ORACLE错误一览表
- pthread_cleanup_push/pop
- 安装及管理程序
- hibernate+java+sql 之间数据类型转换关系