poj 1182 食物链

点击打开链接 poj 1182

1思路:带权并查集
2分析:
           1 对于这道题,我们可以用权值0表示两个动物是属于同类,用权值1表示两个动物是属于捕食关系,用权值2表示两个动物属于竞争关系。那么这样就可以利用带权并查集的关系,如果当前的输入的两个动物编号在同一个集合那么我们利用权值的关系就可以很快的判断出关系,如果不在同一个集合则合并。
           2 注意对于rank要mod 3,这样rank数组的值才能够是0 1 2这三个值。还有如果在求rank的时候,它的值如果可能变为负数要通过加上3来保证值非负,如果值可能超过等于3就要mod 3,但是这不影响结果。
           3 这一题只有一组,如果写成while(scanf("%d%d" , &n , &m) != EOF),则会WA。

           4 判断关系的时候,如果是不同的集合那就合并,否则判断是否有rank[x] == (rank[y]+val)%3

3 代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int MAXN = 50010;

int n , m , ans;
int father[MAXN];
int rank[MAXN];

void init(){
    ans = 0;
    memset(rank , 0 , sizeof(rank));
    for(int i = 1 ; i <= n ; i++)
        father[i] = i;
}

int find(int x){
    if(x != father[x]){
        int fa = father[x];
        father[x] = find(father[x]);
        rank[x] += rank[fa];
        rank[x] %= 3;
    }
    return father[x];
}

void solve(int mark , int x , int y){
    if(x > n || y > n){
        ans++;
        return;
    }
    int fx = find(x);
    int fy = find(y);
    int v = mark == 1 ? 0 : 1;
    if(fx != fy){
       father[fx] = fy;
       rank[fx] = (rank[y]+v-rank[x]+3)%3;
    }
    else{
       if(rank[x] != (rank[y]+v)%3)
         ans++;
    }
}

int main(){
    int mark , x , y;
    scanf("%d%d" , &n , &m);
    init();
    ans = 0;
    for(int i = 0 ; i < m ; i++){
        scanf("%d%d%d" , &mark , &x , &y);
        solve(mark , x , y);
    }
    printf("%d\n" , ans);
    return 0;
}
时间: 2024-09-17 05:41:00

poj 1182 食物链的相关文章

poj 1182 食物链:经典!种类并查集

链接: http://poj.org/problem?id=1182 原题: Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类. 第二种说法是"2 X Y",表示X吃Y. 此人对N个动物,用上述两种说法,

【POJ 1182 食物链】并查集

此题按照<挑战程序设计竞赛(第2版)>P89的解法,不容易想到,但想清楚了代码还是比较直观的. 并查集模板(包含了记录高度的rank数组和查询时状态压缩) 1 const int MAX_N=50002*3; 2 int par[MAX_N]; 3 int rank[MAX_N]; 4 //初始化,根为自身,高度为0 5 void init(int scab) 6 { 7 for(int i=1;i<=scab;i++) 8 { 9 par[i]=i; 10 rank[i]=0; 11

并查集专题【完结】

个人整理 并查集 [poj] 第一题 poj 1182 食物链 点击打开链接poj 1182 思路: 带权并查集 分析: 1 典型的带权并查集的题目 2 如果x和y是同类的关系认为是0,如果是x吃y那么关系认为是1,那么x和y的关系为2就说明y吃x 3 那么如果x和y同类则rank[x] == rank[y] , 如果x吃y那么rank[x] == (rank[y]+1)%3 , 注意mod3的使用 点击查看代码 第二题 poj 1308 Is It A Tree? 点击打开链接 poj 130

A题常用数据结构

  基本结构 高级结构 题单 集合结构   幷查集 POJ 1182 POJ 1308 POJ 1611 POJ 1986 POJ 1988 线性结构 数组 栈 队列 双端队列 POJ POJ POJ POJ POJ 树状结构 二叉树 BST AVL树 splay树(伸展树) Treap Cartesian Tree Size Balance Tree POJ 3580(splay tree) POJ 2761(Treap) POJ 2201(Cartesian Tree) POJ 3481(S

POJ题目分类

初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford

poj 2912 Rochambeau

链接: http://poj.org/problem?id=2912 题目: Description N children are playing Rochambeau (scissors-rock-cloth) game with you. One of them is the judge. The rest children are divided into three groups (it is possible that some group is empty). You don't k

poj分类

初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford

POJ:DNA Sorting 特殊的排序

Description One measure of ``unsortedness'' in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence ``DAABEC'', this measure is 5, since D is greater than four letters to

POJ 1001 Exponentiation 无限大数的指数乘法 题解

POJ做的很好,本题就是要求一个无限位大的指数乘法结果. 要求基础:无限大数位相乘 额外要求:处理特殊情况的能力 -- 关键是考这个能力了. 所以本题的用例特别重要,再聪明的人也会疏忽某些用例的. 本题对程序健壮性的考查到达了变态级别了. 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/ 某人贴出的测试用例数据地址: http://poj.org/showmessage?message_id=76017 有