poj 1182 食物链

食物链

题意:"1 X Y",表示X和Y是同类;"2 X Y",表示X吃Y;输入N(1 <= N <= 50,000),(0 <= K <= 100,000)表示最多有N个动物,同时有K句话。

如果当前的话与前面的话不矛盾就说当前的话是正确的;(无罪判定)问这K句话中有几句是假话;

思路:很裸的种类并查集,只是里面穿插了三种关系,即同类,A吃B,B吃A;其实看了数组的范围[3*N]和x+N,x+2*N就知道思路了;即x吃x+N;类推

对于判定是否是同类时,不要直接求解,因为这与初始化违背;这是利用无罪假设,不冲突即可,即x不与y+N,y+2*N同类即可合并x和y;

同理判断x是否吃y,不要直接判断x是否与y+2*n在同一个集合中,而是看反面是否成立;每次处理合并三种关系即可;

ps:千万别开始就陷入思维定式,认为要将每种同类弄成0,1,2然后0吃1..这种,因为这种初始化很难,并且对于开始输入很多同类时,不知道给这些同类赋几;

Memory: 1280K        Time: 297MS
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<time.h>
using namespace std;
#define rep0(i,l,r) for(int i = (l);i < (r);i++)
#define rep1(i,l,r) for(int i = (l);i <= (r);i++)
#define rep_0(i,r,l) for(int i = (r);i > (l);i--)
#define rep_1(i,r,l) for(int i = (r);i >= (l);i--)
#define MS0(a) memset(a,0,sizeof(a))
#define MS1(a) memset(a,-1,sizeof(a))
const int MAXN = 50050;
int f[MAXN*3];
int Find(int a)
{
    return a==f[a]?f[a]:f[a]=Find(f[a]);
}
bool sample(int a,int b)
{
    return Find(a) == Find(b);
}
void _union(int a,int b)
{
    a = Find(a),b = Find(b);
    f[a] = b;
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int tot = 3*n,ans = 0;
    rep1(i,0,tot) f[i] = i;
    rep1(i,1,m){
        int D,x,y;
        scanf("%d%d%d",&D,&x,&y);
        if(x > n || y > n) ans++;
        else{
            if(D&1){
                if(sample(x+n,y) || sample(x+n+n,y)) ans++;
                else{
                    _union(x,y);
                    _union(x+n,y+n);
                    _union(x+n+n,y+n+n);
                }
            }
            else{
                if(sample(x,y) || sample(x+n+n,y)) ans++;
                else{
                    _union(x+n,y);
                    _union(x+n+n,y+n);
                    _union(x,y+n+n);
                }
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}

时间: 2024-12-22 03:41:50

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个动物所构成的食