hdu - 1829 A Bug's Life (并查集)&&poj - 2492 A Bug's Life && poj 1703 Find them, Catch them
2015-05-07 14:18
513 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1829
http://poj.org/problem?id=2492
臭虫有两种性别,并且只有异性相吸,给定n条臭虫(编号1-n)和m对关系,判断是否是出现同性恋的情况。
这题跟食物链的题类似,这里只有两种关系,关系是同性或者异性。
对于每只动物创建两个元素 同性或异性,并用这 2×n个元素建立并查集。
首先判断输入的x和y是否是一个组的。是就flag=1.
然后,如果x和y是一对,那么合并x和y+n,x+n和y。
http://poj.org/problem?id=1703
给你两个罪犯,判断他们是否属于同一帮派,输入n个罪犯和m条关系,n个罪犯中至少有一个属于帮派Dragon,有一个属于 帮派Snake,m条关系中A表示询问着两个人是否属于同一帮派,D表示这两个人不属于同一帮派。
这题思路跟上面一样,但开始wa了几次,对并查集的理解还是不够深。
定义并查集为:并查集里的元素i-x表示i属于帮派x(这里面有3种关系,要么是同一帮派,要么是不同帮派,要么是不能确定。)同一个并查集的元素同时成立。
初始化并查集为 2*N,如果i表示属于帮派A,那么i+N表示属于帮派B,输入两个元素不在同一帮派的时候,就合并两个帮派的元素。
这题跟上面两题一样,都是不确定元素i属于集合A还是集合B,所以要保留所有的可能性。
http://poj.org/problem?id=2492
臭虫有两种性别,并且只有异性相吸,给定n条臭虫(编号1-n)和m对关系,判断是否是出现同性恋的情况。
这题跟食物链的题类似,这里只有两种关系,关系是同性或者异性。
对于每只动物创建两个元素 同性或异性,并用这 2×n个元素建立并查集。
首先判断输入的x和y是否是一个组的。是就flag=1.
然后,如果x和y是一对,那么合并x和y+n,x+n和y。
#include <cstdio> const int maxn = 2010; int par[2*maxn]; void init(int n) { for(int i=1;i<=n;i++) par[i]=i; } int find(int x) { return x==par[x]?x:par[x]=find(par[x]); } void unite(int x,int y) { x=find(x); y=find(y); if(x!=y) par[x]=y; } int main() { //freopen("a.txt","r",stdin); int t,n,m,a,b,j=1; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); init(n*2); bool flag=0; for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); if(find(a)==find(b)) flag=1; else { unite(a+n,b); unite(a,b+n); } } printf("Scenario #%d:\n",j++); if(flag) printf("Suspicious bugs found!\n"); else printf("No suspicious bugs found!\n"); printf("\n"); } return 0; }
http://poj.org/problem?id=1703
给你两个罪犯,判断他们是否属于同一帮派,输入n个罪犯和m条关系,n个罪犯中至少有一个属于帮派Dragon,有一个属于 帮派Snake,m条关系中A表示询问着两个人是否属于同一帮派,D表示这两个人不属于同一帮派。
这题思路跟上面一样,但开始wa了几次,对并查集的理解还是不够深。
定义并查集为:并查集里的元素i-x表示i属于帮派x(这里面有3种关系,要么是同一帮派,要么是不同帮派,要么是不能确定。)同一个并查集的元素同时成立。
初始化并查集为 2*N,如果i表示属于帮派A,那么i+N表示属于帮派B,输入两个元素不在同一帮派的时候,就合并两个帮派的元素。
这题跟上面两题一样,都是不确定元素i属于集合A还是集合B,所以要保留所有的可能性。
#include <cstdio> const int maxn = 100010; int par[maxn*2]; void init(int n) { for(int i=1;i<=n;i++) { par[i]=i; } } int find(int x) { return x==par[x]?x:par[x]=find(par[x]); } void unite(int x,int y) { x=find(x); y=find(y); if(x!=y) { par[x]=y; } } int main() { // freopen("a.txt","r",stdin); int t,n,m,a,b; char s[5]; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); init(n*2); for(int i=0;i<m;i++) { scanf("%s%d%d",s,&a,&b); if(s[0]=='A') { if(find(a)==find(b)) printf("In the same gang.\n"); else if(find(a)==find(b+n)) printf("In different gangs.\n"); //这里开始没想到 唉 else printf("Not sure yet.\n"); } else if(s[0]=='D') { unite(a,b+n); unite(a+n,b); } } } return 0; }
相关文章推荐
- HDU 1829 && POJ 2492 A Bug's Life(种类并查集)
- POJ 2492 A Bug's Life and POJ 1703 Find them, Catch them
- HDU 1829 & POJ 2492 A Bug's Life (并查集)
- hdu 1829 &poj 2492 A Bug's Life(推断二分图、带权并查集)
- POJ 2492 || HDU 1829:A Bug's Life(并查集)
- hdu 1829 &poj 2492 A Bug's Life(判断二分图、带权并查集)
- hdu-1829 & poj-2492 并查集
- [并查集]HDU 1829/POJ 2492/HOJ 2319 A Bug's Life
- HDU 1829/POJ 2492 A Bug's Life
- Hdu 1892&&Poj 2492 A Bug's Life[判断二分图 || 种类并查集]
- POJ 2492/hdu 1829 A Bug's Life【带权并查集】
- poj 1703 Find them, Catch them(并查集)
- poj 2492 A Bug's Life(并查集)分组并查集
- POJ 1703 Find them, Catch them(带权并查集)
- poj2492_A Bug's Life_并查集
- poj 2492 A Bug's Life(带权并查集)
- POJ 1703 Find them, Catch them(关系并查集)
- poj1703 Find them,Catch them 【并查集】
- POJ 1703 Find them, Catch them【带种类的并查集】
- POJ 1703 Find them, Catch them(带权并查集)