poj 1182 食物链 //带权并查集

来源:互联网 发布:时时彩服务器源码 编辑:程序博客网 时间:2024/05/16 09:41
<pre name="code" class="cpp">#include <stdio.h>int ani[55000], rel[55000];void init(int n){int i;for(i=0; i<=n; i++){ ani[i] = i; rel[i] = 0;}}int findd(int x)<span style="white-space:pre"></span>//回溯路径压缩,好好理解0.0{int fx;if(x == ani[x])return x;fx = ani[x];ani[x] = findd(fx);rel[x] = (rel[x]+rel[fx])%3;<span style="white-space:pre"></span>//向量法,高大上 x->y = x->fx + fx->fy + fy->yreturn ani[x];}int judge(int d, int x, int y, int n){int fx, fy;if( (x>n || y>n) || (x==y && d==1) ) return 0;fx = findd(x);fy = findd(y);if( (fx==fy) && ((rel[x]-rel[y]+3)%3 != d) )return 0;ani[fx] = fy;rel[fx] = (-rel[x] + d + rel[y] +3)%3;return 1;}int main(){int n, k, d, x, y, i;int sum = 0;scanf("%d%d", &n, &k);init(n);for(i=0; i<k; i++){scanf("%d%d%d", &d, &x, &y);if(!judge(d-1, x, y, n))sum++;}printf("%d\n", sum);return 0;}


                                             
0 0
原创粉丝点击