POJ1182 - 食物链 - 并查集
2014-08-13 12:28
381 查看
这道题总共分三个级别,A级别,B级别,C级别
总体是这个样子的,那么接收进来一个数字,这里假设成C级别,那么设C+n为B级别,C+2*n为A级别,这样就不会有重复的。
比如接受进来是吃,如果成立的话,设X是图中的C级别(左),Y是图中的A级别(右),那么如果Y是C级或者B级(Y+n,Y+2*n)就不成立了
比如接受进来是相同,如果成立的话,设X是图中的C级别(左),Y是图中的C级别(右),那么如果Y是B级或者A级(Y+n,Y+2*n)就不成立了
AC代码:
总体是这个样子的,那么接收进来一个数字,这里假设成C级别,那么设C+n为B级别,C+2*n为A级别,这样就不会有重复的。
比如接受进来是吃,如果成立的话,设X是图中的C级别(左),Y是图中的A级别(右),那么如果Y是C级或者B级(Y+n,Y+2*n)就不成立了
比如接受进来是相同,如果成立的话,设X是图中的C级别(左),Y是图中的C级别(右),那么如果Y是B级或者A级(Y+n,Y+2*n)就不成立了
AC代码:
#include<stdio.h> int p[200000]; int find(int n) { if(p !=n) { p =find(p ); } return p ; } int same(int x,int y) { x=find(x); y=find(y); if(x==y) { return 1; } else { return 0; } } void set(int x,int y) { x=find(x); y=find(y); if(x==y) return ; else p[x]=y; } int main() { int n,k; scanf("%d%d",&n,&k); int t,x,y; for(int i=0;i<=n*3;i++) { p[i]=i; } int cnt=0; for(int i=0;i<k;i++) { scanf("%d%d%d",&t,&x,&y); if(x<=0||y<=0||x>n||y>n) { cnt++; continue; } if(t==2&&x==y) { cnt++; continue; } if(t==1)//同类 { if(same(x,y+n)==1||same(x,y+2*n)==1) { cnt++; } else { set(x,y); set(x+n,y+n); set(x+2*n,y+2*n); } } else//吃掉 { if(same(x,y)==1||same(x,y+2*n)==1) { cnt++; } else { set(x,y+n); set(x+n,y+2*n); set(x+2*n,y); } } } printf("%d\n",cnt); }
相关文章推荐
- POJ 1182 食物链 带权并查集入门
- poj 1182 食物链 【带权并查集】
- poj 1182 食物链(带权并查集)
- POJ 1182 食物链(带权并查集)
- [ACM] poj 1182 食物链(并查集)
- POJ - 1182 食物链(带权并查集)
- kuangbin专题五 并查集 POJ 1182食物链(带权并查集)重要
- poj 1182 食物链(带权并查集)
- poj 1182 食物链 (并查集)
- poj 1182 食物链 并查集
- POJ 1182 食物链 并查集
- 【带权并查集】POJ1182 [NOI2001]食物链
- poj 1182 食物链(数据结构:并查集+路径压缩)
- 又见关系并查集 以POJ 1182 食物链为例
- POJ1182-食物链(经典并查集)
- poj 1182食物链(带权并查集)
- poj 1182 食物链(种类并查集)
- POJ 1182 食物链 带权并查集
- POJ1182 食物链 (并查集)*新方法
- POJ 1182 食物链【带种类并查集】