应用挑战程序设计那本书上的话:

  对于每只动物i创建3个元素i—A,i—B,i—C,并用3xN个元素建立并查集。这个并查集维护如下信息:

    (1)i—x表示“i属于种类x”

    (2)并查集里的每一个组表示组内所有元素代表的情况都相同都同时发生或不发生

for example,如果i—A和j—B在同一个组里,就表示如果i属于种类A那么j一定属于种类B,如果j属于种类B那么i一定属于种类A。因此,对于每一条信息,只需要按照以下进行操作就可以了。

第一种,x和y属于同一类......合并x—A和y—A,x—B和y—B,x—C和y—C。

第二种,x吃y....................合并x—A和y—B,x—B和y—C,x—C和y—A。

不过在合并之前,需要先判断合并是否产生矛盾。例如在第一种信息的情况下,需要检查比如x—A和y—B或者y—C是否在同一组等信息

#include<cstdio>
#include<cstring>
const int N=50000+10;
int pre[N*3];
void init(int n)
{
for(int i=0;i<=n*3;++i)
pre[i]=i;
}
int find(int x)
{
if(x==pre[x])
return x;
else
return pre[x]=find(pre[x]);
}
bool same(int a,int b)
{
return find(a)==find(b);
}
void un(int a,int b)
{
int x=find(a);
int y=find(b);
if(x==y)
return;
else
pre[x]=y;
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
int ans=0;
init(n);
for(int i=0;i<k;++i){
int r,x,y;
scanf("%d%d%d",&r,&x,&y);
if(x>n||y>n||x<=0||y<=0){
++ans;
continue;
}
if(r==1){
if(same(x,y+n)||same(x,y+2*n))
++ans;
else{
un(x,y);
un(x+n,y+n);
un(x+2*n,y+2*n);
}
}
else{
if(same(x,y)||same(x,y+2*n))
++ans;
else{
un(x,y+n);
un(x+n,y+2*n);
un(x+2*n,y);
}
}
}
printf("%d\n",ans);
return 0;
}

接下来应用这种思路写POJ的2492

题意:就是说有N个虫子,异性交配,但现在不知道虫子的性别,现在给出M个事件,问会不会出现同性交配的现象

思路:创建两个组,维护(x,y+n),(y,x+n)

#include<cstdio>
#include<cstring>
#include<cmath>
const int qq=2000+5;
int pre[qq*2];
void init(int n)
{
for(int i=0;i<=n*2;++i)
pre[i]=i;
}
int find(int x)
{
if(x==pre[x])
return x;
else
return pre[x]=find(pre[x]);
}
bool same(int a,int b)
{
return find(a)==find(b);
}
void un(int a,int b)
{
int x=find(a);
int y=find(b);
if(x==y)
return;
else
pre[x]=y;
}
int main()
{
int t;scanf("%d",&t);
int p=1;
while(t--){
printf("Scenario #%d:\n",p++);
int x,y,n,k;
scanf("%d%d",&n,&k);
init(n);
int flag=1;
for(int i=0;i<k;++i){
scanf("%d%d",&x,&y);
if(same(x,y)||same(y,x))
flag=0;
else{
if(flag){
un(x,y+n);
un(y,x+n);
}
}
}
if(flag)
printf("No suspicious bugs found!\n");
else
printf("Suspicious bugs found!\n");
if(t) printf("\n");
}
return 0;
}

POJ上刷题留心,题目如何给你一定要按照它的做,比如他只有一组数据输入,你别while(scanf("")!=EOF)  我就以为这样纠结了一个下午,

总之刷POJ一定要多留心,要多相信自己的代码,剩下的可能就是题目细节方面的错误了

POJ 1182食物链、的更多相关文章

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

      食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44835 Accepted: 13069 Description 动 ...

  2. poj 1182:食物链(种类并查集,食物链问题)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44168   Accepted: 12878 Description ...

  3. POJ 1182 食物链

    G - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Stat ...

  4. POJ 1182 食物链(种类并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 63592   Accepted: 18670 Description ...

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

    传送门: http://poj.org/problem?id=1182 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...

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

    食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status P ...

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

    传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit  ...

  8. 【原创】poj ----- 1182 食物链 解题报告

    题目地址: http://poj.org/problem?id=1182 题目内容: 食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submi ...

  9. poj 1182 食物链 (并查集)

    http://poj.org/problem?id=1182 关于并查集 很好的一道题,开始也看了一直没懂.这次是因为<挑战程序设计竞赛>书上有讲解看了几遍终于懂了.是一种很好的思路,跟网 ...

  10. POJ 1182 食物链(并查集拆点)

    [题目链接] http://poj.org/problem?id=1182 [题目大意] 草原上有三种物种,分别为A,B,C A吃B,B吃C,C吃A. 1 x y表示x和y是同类,2 x y表示x吃y ...

随机推荐

  1. web前端学习(四)JavaScript学习笔记部分(2)-- JavaScript语法详解

    2.1.Javascript语法-运算符(1) 复数运算符 %取余 ++ -- 赋值运算符 += -= *= /= %= 字符串操作 <!DOCTYPE html> <html la ...

  2. 双系统删除ubuntu

    我的电脑安装了双系统,Windows和Linux,不过由于Linux在最近一段时间内不会使用,所以我打算删除Linux.    删除Linux最需要注意的地方,就是MBR(Master Boot Re ...

  3. 从0开始学习 GitHub 系列之「01.初识 GitHub

    转载:http://blog.csdn.net/googdev/article/details/52787516 1. 写在前面 我一直认为 GitHub 是程序员必备技能,程序员应该没有不知道 Gi ...

  4. WPF e.Systemkey的一个坑

    当用代码去控制按键盘F10按钮的时候,切换TabControl的标签页,然后再按其余的键盘键,无法响应 原因就是这个systemkey,是因为F10为系统的按键,用e.key==key.f10是无效的 ...

  5. 如何成功安装旧版本火狐,成功安装firebug

    1.下载一个老版本火狐浏览器: 历史版本下载 2.下载安装完成后,立即在火狐浏览器的选项设置里面把自动更新关闭 3.手动安装firebug:最后搜到可以下载成功的地址:http://www.onlin ...

  6. 使用SQLyog将Mysql中的表导出为Excel

    有时会有这样的需求:将MYSQL数据库中的某个表格导出,存为Excel文件.下面介绍步骤: 1.打开SQLyog,选中要导出的表 2.右键--备份/导出--导出表数据作为... 3.如图选择 Exce ...

  7. Linux之软件包安装管理

    软件包分类: 源码包:脚本安装包(源C代码) 二进制包(rpm包,系统默认包) 源码包 1.源码包优点 开源,如果有足够的能力,完全可以修改源代码 可以自己选择所需要安装的功能 软件是编译安装,所以更 ...

  8. IOC容器和注入方式

    IOC和DI IOC: 反转资源获取的方向 DI: IOC的另一种表述反式,即组件以一些预先定义好的方式(例如:setter方法)接收来自如容器的资源注入 IOC容器对象的关联关系 IOC前生--分离 ...

  9. 【JZOJ4799】【NOIP2016提高A组模拟9.24】我的快乐时代

    题目描述 输入 一行,两个整数l,r . 输出 一行,一个整数,表示第l 天到第r 天的愉悦值的和. 样例输入 64 89 样例输出 1818 数据范围 解法 可以参考数位动态规划的想法. 从个位开始 ...

  10. cocos2dX 之CCAnimation/CCAnimate

    我们今天来学习cocos2dX里面的动画的制作, 有人说, 不是前面CCAction已经学过了吗? 怎么还要学, CCAction是动作, 而我们今天要学的是动画哦, 是让一个东西动起来哦, 好了进入 ...