CDOJ1927 爱吃瓜的伊卡洛斯(2) 【并查集】启发式合并+set
2018-06-14 20:20
357 查看
伊卡洛斯很爱吃西瓜。一次,他来到一个西瓜摊旁,发现水果摊有N个西瓜,西瓜有红色、黄色、绿色、蓝色……等等数不清的颜色。 伊卡洛斯很想知道知道一些信息,便于老板交谈了起来。 当老板的话的第一个字符为”
A”时,老板会告诉伊卡洛斯一些信息,格式如下: A x y 1 这句话表示第x个西瓜和第y个西瓜是同一种颜色的。 A x y 2这句话表示第x个西瓜和第y个西瓜是不同种颜色的。
当然,为了考验伊卡洛斯有没有认真听, 老板也会时不时问伊卡洛斯一些问题,格式如下: Q x y 这句话表示询问第x个西瓜和第y个西瓜是不是同一种颜色,如果确定为同一种颜色,伊卡洛斯需要回答
1;确定为不同种颜色,伊卡洛斯需要回答
2;无法确定时伊卡洛斯回答
3。 注意,伊卡洛斯是根据已获得的信息来回答的。也就是只有这个问题之前的信息才为已知信息。
老板说,只有回答对他全部的问题,伊卡洛斯才能吃到瓜,他聪明的想到了让你来帮助他。
Input
第一行包含两个整数N和M,N是西瓜总数,M是以A或Q开头的老板的话总和。
以下M行,每行包含一条老板的话。形式有A x y 1或A x y 2或Q x y。 1≤N≤100000 1≤M≤200000 1≤X,Y≤N 数据保证没有矛盾
Output
对于每一条Q指令,输出
1/
2/
3代表两个西瓜颜色的关系。
Hint
西瓜的颜色可以有无数多种!
思路:这题颜色有无穷多种,所以不能按照普通的并查集分块求对立。
可以用set存每一个集合的对立(不同颜色)集合,如果两个x,y颜色相同时,合并两个集合的对立集合。
合并的时候尽量将小的集合合并到大的集合中去。
#include <algorithm> #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <set> using namespace std; const int N = 1e5+6; int f ; set<int> s ; int find(int x) { if(x==f[x])return x; else return f[x]=find(f[x]); } void unite(int x,int y) { x = find(x); y = find(y); if(x!=y) { if(s[x].size()>s[y].size())swap(x,y); // s[x] size is small f[x]=y; if(s[x].size()) { set<int>:: iterator it; for(it = s[x].begin(); it != s[x].end(); it++) s[y].insert(find(*it)); } } return; } int main() { int n,m; char op[6]; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) f[i]=i; while(m--) { scanf("%s",&op); int x,y,z; if(op[0] =='A') { scanf("%d%d%d",&x,&y,&z); if(z==1) unite(x,y); else { s[find(x)].insert(find(y)); s[find(y)].insert(find(x)); } } else { scanf("%d%d",&x,&y); int xx = find(x); int yy = find(y); if(xx==yy)printf("1\n"); else if(s[xx].find(yy)!=s[xx].end() || s[yy].find(xx)!=s[yy].end()) printf("2\n"); else printf("3\n"); } } return 0; }
相关文章推荐
- 51nod 1515 明辨是非 并查集 + set + 启发式合并
- [并查集][排序][dfs][启发式合并] JZOJ P3635 Peaks
- BZOJ 2733: [HNOI2012]永无乡(treap + 启发式合并 + 并查集)
- 并查集的启发式合并 和 路径压缩
- [bzoj4919]大根堆——set启发式合并
- BZOJ.3673/3674.可持久化并查集(可持久化线段树 按秩合并/启发式合并)
- loj516 DP一般看规律(set启发式合并)
- HDU - 4424 Conquer a New Region 思维+并查集启发式合并
- COCI 2017/2018 Round #3,November 25th,2017 Pictionary [带权并查集+启发式合并]
- 【bzoj4537】【HNOI2016】【最小公倍数】【并查集+启发式合并+分块】
- BZOJ 4668 冷战 [并查集][按秩合并&启发式合并]
- hiho 1561 观光旅行 [set启发式合并+想法]
- 可持久化并查集(外传)——[按秩启发式合并]
- 并查集路径压缩与启发式合并
- 图论算法----并查集中的启发式合并
- [广义后缀自动机 set启发式合并 || dfs序 树状数组 离线] BZOJ 2780 [Spoj]8093 Sevenk Love Oimaster
- 【CF932F】Escape Through Leaf 启发式合并set维护凸包
- 并查集的启发式合并
- Bzoj 3673: 可持久化并查集 by zky(主席树+启发式合并)
- 【[Offer收割]编程练习赛23 D】【最小生成树+set的启发式合并】观光旅行