poj 1182 食物链 并查集
2011-07-24 17:32
435 查看
/* 和一个城市两个帮差不多,那个是只有两个状态,这道题成三个了 找一下合并集合的时候的公式就行了 本代码中:rel[i]表示i的等级,集合根的等级是0,2级可以吃1级,1级吃0级,0级吃2级 */ #include<stdio.h> int ji[50010],rel[50010]; int root(int x) { int t; if(x==ji[x]) return x; t=ji[x]; ji[x]=root(ji[x]); rel[x]=(rel[t]+rel[x])%3; return ji[x]; } void bing(int o,int x,int y,int xx,int yy) { if(o==1) { ji[yy]=xx; rel[yy]=(rel[x]-rel[y]+3)%3; } else { ji[yy]=xx; rel[yy]=(rel[x]-rel[y]+2)%3; } } int jia(int o,int x,int y,int xx,int yy) { if(o==1) { if(xx==yy) { if(rel[x]==rel[y]) return 0; else return 1; } else return 0; } else { if(xx==yy) { if((rel[y]+1)%3==rel[x]) return 0; else return 1; } else return 0; } } int main() { int n,m,i,o,x,xx,yy,y,lie=0;; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { ji[i]=i; rel[i]=0; } for(i=1;i<=m;i++) { scanf("%d%d%d",&o,&x,&y); if(x>n||y>n) { lie++; continue; } if(o==2&&x==y) { lie++; continue; } xx=root(x); yy=root(y); if(jia(o,x,y,xx,yy)) { lie++; continue; } if(xx!=yy) bing(o,x,y,xx,yy); } printf("%d\n",lie); return 0; }
相关文章推荐
- POJ 1182 食物链 (经典带权并查集)
- POJ1182---食物链(带权并查集~技巧性超强的解法)
- POJ 1182 食物链(种类并查集)
- POJ 1182 食物链 (分类并查集)
- POJ 1182 食物链 (种类并查集)
- POJ1182 - 食物链(带权并查集)
- poj1182 食物链(并查集)
- POJ-1182 食物链 经典并查集
- 【并查集】poj 1182 食物链
- poj 1182 食物链(并查集)
- poj 1182 食物链 并查集扩展--带权并查集
- poj 1182 食物链 并查集
- POJ 1182 食物链 并查集
- POJ 1182 食物链【并查集】
- ACM--POJ-1182-食物链-并查集
- POJ 1182 食物链 (并查集)
- poj 1182 食物链 (带权并查集升级版)
- POJ 1182 食物链 带权并查集
- poj 1182_食物链_并查集
- POJ 1182 食物链【并查集】