poj 食物链

来源:互联网 发布:sql获取当前系统时间 编辑:程序博客网 时间:2024/06/06 03:22

比基础的并查集有些进步。

在下面这个链接中有详细解释:

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;}


0 0
原创粉丝点击