并查集找gangs
来源:互联网 发布:m2同比增速 数据 编辑:程序博客网 时间:2024/05/21 10:24
题目大意是有两个gangs,每次给你两个来自不同gangs的人,然后再问你任两个人的gangs关系。
解题思路是:将数据的最大范围扩大两倍,a 与 b 来自不同的gans,则a 与 b +n 来自相同的gangs,b 与 a+n来自相同的gangs.
判断相同gangs的条件是:findfather(a) == findfather(b);
判断不相同gangs的条件是: findfather(a) == findfather(b+n) || findfather(b) == findfather(a+n);
不确定关系的条件是:findfather(a) != findfather(b) && findfather(a)!=findfather(b+n) ;
代码如下:
#include <iostream>#include <cstdio>using namespace std;const int maxn = 100000+100;int Set[2 * maxn] ;int n , m ;int t , fx , fy;void init(){ for(int i = 0; i < 2 * maxn ; i ++){ Set[i] = i ; }}int findfather(int x){ if(x == Set[x]) return x ; return Set[x] = findfather(Set[x]) ;}void union_ab(int x , int y){ int fx = findfather(x) ; int fy = findfather(y) ; if(fx != fy) Set[fx] = fy ;}int main(){ int a , b ; char c[3] ; scanf("%d",&t); while(t --){ init(); scanf("%d%d",&n , &m); for(int i = 0; i < m; i ++){ scanf("%s%d%d",c,&a,&b); if(c[0] =='D') { union_ab(a , b + n); union_ab(a + n , b); } else { if(findfather(a) == findfather(b)) printf("In the same gang.\n"); else if(findfather(a) == findfather(b+n) || findfather(a) == findfather(b)) printf("In different gangs.\n"); else if(findfather(a+n)!=findfather(b) && findfather(b) != findfather(a)) printf("Not sure yet.\n"); } } } return 0;}
方法二:
#include <iostream>#include <cstdio>using namespace std;const int maxn = 100005;typedef struct{ int root, relation;}gang;gang data[maxn];int t , n , m ;void init(){ for(int i = 0; i < maxn; i ++) { data[i].root = i; data[i].relation = 0; }}int findfather(int x){ if(x == data[x].root) return x; int t = findfather(data[x].root); data[x].relation = (data[x].relation + data[data[x].root].relation)%2; data[x].root = t; return t;}void union_ab(int x , int y ){ int fx = findfather(x); int fy = findfather(y); if(fx != fy){ if(data[x].relation == data[y].relation) { data[fx].relation = 1; data[fx].root = fy; } if(data[x].relation != data[y].relation) { data[fx].root = fy; } }}int main(){ scanf("%d",&t); char c[10]; int a , b; while(t --) { init(); scanf("%d %d",&n ,&m); for(int i = 0; i < m; i ++) { scanf("%s",c); if(c[0] == 'D') { scanf("%d%d",&a,&b); union_ab(a , b); } if(c[0] == 'A'){ scanf("%d%d",&a , &b); findfather(a); findfather(b); if(data[a].root != data[b].root) printf("Not sure yet.\n"); else { if(data[a].relation == data[b].relation) printf("In the same gang.\n"); else if(data[a].relation != data[b].relation) printf("In different gangs.\n"); } } } } return 0;}
0 0
- 并查集找gangs
- gangs
- 丐帮 beggar gangs
- 【USACO】帮派(gangs)
- 电影 纽约黑帮 Gangs of New York
- uva 11290 - Gangs(卡特兰数)
- 并查集找亲戚
- 并查集找连通分量的个数
- HDU1856 - More is better 利用并查集找最大群体数目
- HDU 1232 畅通工程 (并查集找连通块)
- hdu 1856 More is better 并查集找最大集合
- 并查集三
- 并查集刷题
- 并查
- 并查集略解
- 并查集小练
- 并发网
- 并查集题集
- UVa 216 Getting in Line
- jquery判断小数点两位跟自动删除小数两位后的数字
- 开源许可证
- POJ 1228 凸包惟一性判断(多边形模板)
- [HOJ]HIT's Powerstation
- 并查集找gangs
- OCM_session0手动建库实验
- 安装使用RGBDSLAM_Freiburg
- Best of Vim Tips 中文版
- css和js学习的体会
- 我们什么时候应该使用动态内存
- 一个新的开始
- php连接mysql数据库
- HDU 2608 0 or 1 规律