首页 > 代码库 > poj 食物链
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; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。