食物链

这次做食物链这个题目感觉真的好懵逼,先总结出现的错误,第一个是没有注意输入形式和输出格式,直接以为输入0 0就会结束,然后又是属于输入多组数据,但是题目并没有给出这样的提示,所以wa很正常,然后就是超时,想了一下昨天有人提到把cin改成scanf就AC了,所以我也试了一下;果然AC了,真的不容易啊。然后谈一下我做这个题目的各种懵逼,最开始连题目没看懂,感觉我就没有看懂几道题目过,然后条件2和3都很好理解,一就不同了,是指和前面的有出入,就有一个为假,我居然想去知道谁真谁假,这就不可能做出来了,手动再见。但是这个条件一就是要让我们用并查集了,真为一颗树 ,假为一棵树,然后find 函数,在判断吃与被吃关系就只能参考别人的代码了,因为这里真的好懵逼。所以我也不讲解什么,继续贴网址。

http://blog.csdn.net/niushuai666/article/details/6981689

#include<cstdio>
using namespace std;
struct node{
int fa,r;
}p[50010];
int find(int x)
{
    int temp;
    if(x==p[x].fa)
        return x;
    temp=p[x].fa;
    p[x].fa=find(temp);
    p[x].r=(p[x].r+p[temp].r)%3;
    return p[x].fa;
}
int main()
{
    int n,m,num=0;int r1,r2;
    scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
    {
        p[i].fa=i;
        p[i].r=0;
    }
        for(int i=0;i<m;i++)
        {
            int d,x,y;
            scanf("%d%d%d",&d,&x,&y);
            if(d==2&&x==y)
                {num++;continue;}
            if(x>n||y>n) {num++;continue;}
            r1=find(x);r2=find(y);
            if(r1!=r2)
            {
                p[r2].fa=r1;
                p[r2].r=(3+(d-1)+p[x].r-p[y].r)%3;
            }
            else
            {
                if(d==1&&p[x].r!=p[y].r)
                {

                    num++;
                    continue;
                }
                if(d==2&&((3-p[x].r+p[y].r)%3!=d-1))
                {
                    num++;
                    continue;
                }
            }
        }printf("%d",num);
    return 0;
}

  

posted @ 2016-07-21 11:25  阿银家的小贰  阅读(216)  评论(0编辑  收藏  举报