并查集 食物链 POJ1182

来源:互联网 发布:飞行服夹克淘宝 编辑:程序博客网 时间:2024/05/01 08:25

#include <stdio.h>#include <string.h>int f[50005];int rank[50005];              //rank[x]值为0,则与父节点同级,为1则被父节点吃,为2则吃父节点int find(int i){if(i==f[i])return f[i];int a=f[i];f[i]=find(f[i]);rank[i]=(rank[i]+rank[a])%3;return f[i];}int main(){int n,k;int i;int d,x,y;int sum;int fr,ed;scanf("%d%d",&n,&k);                     //注意不能打while,会WA{sum=0;for(i=0;i<=n;i++){f[i]=i;rank[i]=0;}for(i=0;i<k;i++){scanf("%d%d%d",&d,&x,&y);if(x>n||y>n||(d==2&&x==y)){sum++;continue;}d-=1;fr=find(x);ed=find(y);if(fr==ed){if((rank[y]-rank[x]+3)%3!=d)         //归纳所有情况得出的结论{sum++;continue;}}else{f[ed]=fr;rank[ed]=(rank[x]-rank[y]+3+d)%3;           //若两点不在同一集合,则合并父节点 }}printf("%d\n",sum);}return 0;}


0 0
原创粉丝点击