博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1703 Find them, Catch them (并查集)
阅读量:5091 次
发布时间:2019-06-13

本文共 2633 字,大约阅读时间需要 8 分钟。

题意:是一个城市有两个帮派Gang Dragon 和 Gang Snake,A a b是询问a和b这两个人是不是一个帮派,D a b是这两个人不在一个帮派 每一次A就输出一次。

城市有只有3中人,要么属于S,要么属于D,还有一种未知

这题和奇偶游戏很相似,可以用扩展域并查集,也可以用边带权并查集,感觉扩展域更好写一些

扩展域:对于每个人x拆成x_d,x_s,分别表示x属于帮派D和帮派S,设x表示它属于帮派D,x+n表示属于S,那么对于每次询问D a b,a和b不同时属于一个集合,我们合并a_d和b_s,a_s和b_d,这说明它们是关联在一起的。

对于每次查询,我们如果a,b在一个集合中,说明他们属于同一派,如果a+n和b在同一个集合中说明他们不属于同一派,如果这两种都不满足,就是未知

#include
#include
using namespace std;const int N = 2e5 + 10;int fa[N],t,n,m;int get(int x){ if (fa[x] == x) return x; return fa[x] = get(fa[x]);}void merge(int x, int y){ fa[get(x)] = get(y);}bool same(int x, int y){ return get(x) == get(y);}int main(){ cin >> t; while (t--) { scanf("%d%d", &n, &m); for (int i = 0; i <=2* n; i++)//i表示D,i+n表示s fa[i] = i; getchar(); while (m--) { char op; int a, b; scanf("%c%d%d", &op, &a, &b); getchar(); if (op == 'D') { int a_d = a, a_s = a+n; int b_d = b, b_s = b + n; merge(a_d, b_s); merge(a_s, b_d); } else { if (same(a, b)) printf("In the same gang.\n"); else if (same(a + n, b)) printf("In different gangs.\n"); else printf("Not sure yet.\n"); } } } return 0;}

 

边带权:和奇偶游戏类似,不说了

#include
#include
using namespace std;const int N = 2e5 + 10;int fa[N],t,n,m,d[N];int get(int x){ if (fa[x] == x) return x; int root = get(fa[x]); d[x] ^= d[fa[x]]; return fa[x] = root;}void merge(int x, int y){ fa[get(x)] = get(y);}bool same(int x, int y){ return get(x) == get(y);}int main(){ cin >> t; while (t--) { scanf("%d%d", &n, &m); for (int i = 0; i <= n; i++)//i表示D,i+n表示s fa[i] = i,d[i]=0; getchar(); while (m--) { char op; int a, b; scanf("%c%d%d", &op, &a, &b); getchar(); if (op == 'D') { int p = get(a), q = get(b); fa[p] = q; d[p] = d[a] ^ d[b] ^ 1; } else { if (!same(a, b)) printf("Not sure yet.\n"); else if (d[a]^d[b]==1) printf("In different gangs.\n"); else printf("In the same gang.\n"); } } } return 0;}
View Code

 

转载于:https://www.cnblogs.com/xiaoguapi/p/10502489.html

你可能感兴趣的文章
Jzoj3170 挑选玩具
查看>>
测试随想
查看>>
JavaWeb_客户端相对/绝对路径和服务器端路径
查看>>
数组中方法some,every , reduce简单方法
查看>>
图形学-剔除
查看>>
人生哲学
查看>>
JAVA调用.NET的WEBSERVICE
查看>>
Selenium+Python浏览器调用:Firefox
查看>>
nohup 详解
查看>>
树莓派实现摄像头监控(使用motion和mjpg-streamer)
查看>>
《转》推荐系统经典论文文献及业界应用
查看>>
webpack的像素转vw单位的loader插件
查看>>
javascript高级程序设计一书----关于创建和对象继承的总结
查看>>
媒体电话
查看>>
Web开发者欣喜若狂的40个UI设计工具和资源
查看>>
整数拼数 C语言版
查看>>
在固定宽度 下计算出实际的行高
查看>>
hdu 1873 看病要排队
查看>>
scope_ref的实现
查看>>
从零开始系列之vue全家桶(1)安装前期准备nodejs+cnpm+webpack+vue-cli+vue-router
查看>>