POJ 1182:食物链

并查集

想法很简单

开两个数组

吃 与 被吃

然而 炸了我一下午

mlgb

贴个错误代码

吃饭去了

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;

const int maxn=55555;
int fa[maxn];
int eat[maxn];
int ate[maxn];

int find(int x)
{
 return fa[x]==x?x:fa[x]=find(fa[x]);
}

void merge(int x,int y)
{
 int fx,fy;
 fx=find(x);
 fy=find(y);
 if(fx!=fy)
 fa[fy]=fx;
}

int main()
{
    int n,k;
    int com,n1,n2;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
    {
            eat[i]=0;
            ate[i]=0;
            fa[i]=i;
    }
    int num=0;
    for(int i=0;i<k;i++)
    {
            scanf("%d%d%d",&com,&n1,&n2);
            if(com==1)
            {
                if(n1>n||n2>n)
                        {num++;continue;}
                if(find(n1)==find(eat[n2])||find(n2)==find(eat[n1]))
                        {num++;continue;}
                if(!(eat[n1]==0&&ate[n2]==0))
                {
                   if(find(eat[n1])==find(ate[n2]))
                        {num++;continue;}
                }

//                if(find(n2)==find(ate[n1])||find(n1)==find(ate[n2]))
//                        {num++;continue;}

                        merge(n1,n2);

            }

            else if(com==2)
            {
                if(n1>n||n2>n)
                        {num++;continue;}
//                else
//                {
                        if(n1==n2)
                                {num++;continue;}
                        if(find(n1)==find(n2))
                                {num++;continue;}
//                        if(find(ate[n1])==find(n2))
//                                {num++;continue;}
                        if(find(n1)==find(eat[n2]))
                                {num++;continue;}

                          if(!(eat[n1]==0&&ate[n2]==0))
                {
                   if(find(eat[n1])==find(ate[n2]))
                        {num++;continue;}
                }
                        if(!(eat[n1]==0&&eat[n2]==0))
                                //if(eat[n1]==find(eat[n2])||eat[n2]==find(eat[n1]))
                        {
                                if(find(eat[n1])==find(eat[n2]))
                                        {num++;continue;}
                        }

                        if(eat[n1]==0)
                                eat[n1]=n2;
                        else
                                merge(eat[n1],n2);

                        if(ate[n2]==0)
                                ate[n2]=n1;
                        else
                                merge(ate[n2],n1);

               // }
            }
    }
    printf("%d\n",num);

    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-29 21:13:14

POJ 1182:食物链的相关文章

又见关系并查集 以POJ 1182 食物链为例

简单的关系并查集一般很容易根据给出的关系搞出一个有向的环,那么两者之间的关系就变成了两者之间的距离. 对于此题: 若u,v不在一个集合内,则显然此条语句会合法(暂且忽略后两条,下同). 那么将fu 变为 fv的儿子时需加一条权值为 w 的边,w 满足(w + ru)%3 = (rv+ (D == 1? 0 : 1))%3(ru,rv分别为u,v与fv的关系,即距离). 之所以在D == 2时加 1,是因为u吃v表明着u到fv的距离比v到fv的距离大1. 同理,D == 1时,表明两者到fv的距离

poj 1182 食物链 (带关系的并查集)

  食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44835 Accepted: 13069 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类.

POJ 1182 食物链 Union Find题解

Union Find就是所谓的并查集. 本题做的很无语,最后发现居然是输入搞错,一直WA. 不能使用循环接受输入,否则是WA的,气死人,浪费那么多时间就为了这个. 难点: 1 构建关系树 2 构建公式 3 快速更新公式 要抽象思维出什么对应什么的关系和上面是逆关系,就是利用0,1,2构建出父子节点之间的关系值,我是这样去思考构建出准确无误的公式的. 这样的抽象度是挺高的,需要多多训练. 关系到数学和Union Find,难度还是挺高的,网上很多人解法了. 我这里就增加一个按权值更新的优化算法,和

POJ 1182 食物链【并查集】

题目链接:http://poj.org/problem?id=1182 此题利用并查集解决. 对于每只动物i创建3个元素i-A,i-B,i-C,并用这3*N个元素建立并查集. 1·i-x表示"i属于种类x" 2·并查集你的每一组表示组内所有元素代表的情况同时发生或不发生. 对于每一条信息,只需要按照下列操作即可: 1.第一种:x,y同类,合并x-A和y-A.x-B和y-B.x-C和y-C. 2.第二种:x吃y,,,合并x-A和y-B.x-B和y-C.x-C和y-A. 当然,在合并之前,

poj 1182:食物链(并查集,食物链问题)

食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44168   Accepted: 12878 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同

带权并查集(含种类并查集)【经典模板】 例题:①POJ 1182 食物链(经典)②HDU - 1829 A bug&#39;s life(简单) ③hihoCoder 1515 : 分数调查

带权并查集: 增加一个 value 值,并且每次合并和查找的时候需要去维护这个 value 例题一 :POJ 1182 食物链(经典) 题目链接:https://vjudge.net/contest/339425#problem/E 带权并查集的解法 定义两个数组fa[ ]和rela[ ],fa用来判断集合关系,rela用来描述其与根节点的关系.因为关系满足传递性,所以可以推导出给出条件下的当前关系,在判断与之前已有关系是否矛盾. 本题的解法巧妙地利用了模运算,rela数组用0表示同类,1表示当

POJ 1182 食物链 [并查集 带权并查集 开拓思路]

传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1182 Appoint description:  System Crawler  (2015-01-27) Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物

POJ 1182——食物链——————【种类并查集】

食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1182 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一

POJ 1182食物链

题目来源:http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 45355   Accepted: 13229 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食

POJ 1182 食物链(经典带权并查集 向量思维模式 很重要)

传送门: http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 90562   Accepted: 27216 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食