poj 食物链
比基础的并查集有些进步。
在以下这个链接中有详解:
http://blog.csdn.net/ditian1027/article/details/20804911
对于每两个动物的关系,都是先推与终于的关系,在逆推与还有一个的关系;
num中存的都是与终于节点的关系;
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; const int maxn=50000+10; struct node{ int q,num; }s[maxn]; void qq(int n) { for(int i=1;i<=n;i++) { s[i].q=i; s[i].num=0; } } int find(int y) { if(y==s[y].q) return y; int t=s[y].q; s[y].q=find(s[y].q); s[y].num=(s[t].num+s[y].num)%3; return s[y].q; } void show(int q,int w,int e)//合并集合 { int tt=find(q); int rr=find(w); s[rr].q=tt; s[rr].num=(s[q].num-s[w].num+3+(e-1))%3; } int main() { int a,b,n,m,g; scanf("%d %d",&a,&b); qq(a); int ans=0; while(b--) { scanf("%d%d%d",&n,&m,&g); if(m>a||g>a) {ans++;continue;} if(n==2&&m==g) {ans++;continue;} if(find(m)==find(g)) { if(n==1&&s[m].num!=s[g].num) ans++; if(n==2&&(s[m].num+1)%3!=s[g].num) ans++; } else show(m,g,n); } printf("%d\n",ans); return 0; }
posted on 2017-04-17 16:40 cynchanpin 阅读(303) 评论(0) 编辑 收藏 举报