题意:
给出N条虫子,让a和b交配,
给出M对a和b交配后问,
有没有性别矛盾的虫子,
即和一只虫子和男的交配完之后又和女的交配
题解:
1.压缩路径关系转化,r[x] = (r[x]+r[f[x]])%2,很好理解//r[x]表示x和fx的关系,0同性,1异性
若x和fx为同性(r[x] = 0):
    fx和ffx为异性(r[fx] = 1),则x和ffx为异性,x和ffx的关系r[x]更新为0+1=1
    fx和ffx为同性(r[fx] = 0),则x和ffx为同性,x和ffx的关系r[x]更新为0+0=0
若x和fx为异性(r[x] = 1):
    fx和ffx为异性(r[fx] = 1),则x和ffx为同性,x和ffx的关系r[x]更新为(1+1)%2=0
    fx和ffx为同性(r[fx] = 0),则x和ffx为异性,x和ffx的关系r[x]更新为1+0=1
2.并查集联合若父节点相同
if(r[x] == r[y]) mark = true; //x和y性别不同,因为父节点相同,所以x,y和父节点关系相同就是假话
3.并查集联合若父节点不同,这句话为真话,把fy的父节点设置为fx
f[fy] = fx;
r[fy] = (1+r[x]-r[y])%2;

 #include <iostream>#include <cstdio>#include <cstring>using namespace std;int f[2010], r[2010];//f数组指向与它交配的bug,初始化自交//r表示他的父节点与它是同性还是异性,0同性,1异性bool mark;int find_head(int x){int fx = x;if(x != f[x]){fx = find_head(f[x]);r[x] = (r[x]+r[f[x]])%2;f[x] = fx;}return fx;}void union_set(int x, int y){int fx = find_head(x);int fy = find_head(y);if(fx == fy)//父亲结点相同{if(r[x] == r[y]) //x和y性别不同,因为父节点相同,所以x,y和父节点关系相同就是假话{mark = true;}}else//父亲结点不同,这句话为真话,把fy的父节点设置为fx{f[fy] = fx;r[fy] = (1+r[x]-r[y])%2;}}int main(){int t;cin>>t;for(int i = 1; i <= t; i++){int n, m;mark = false;scanf("%d%d", &n,&m);memset(r, 0, sizeof(r));for(int k = 1; k <= 2010; k++){f[k] = k;}for(int j = 1; j <= m; j++){int x, y;scanf("%d%d", &x,&y);if(!mark){union_set(x, y);}}cout<<"Scenario #"<<i<<":"<<endl;if(mark) cout<<"Suspicious bugs found!"<<endl;else cout<<"No suspicious bugs found!"<<endl;cout<<endl;}}

并查集-A Bug's Life(poj2492)相关推荐

  1. A Bug‘s Life POJ 2492 加权并查集

    A Bug's Life POJ 2492 加权并查集 传送门:http://poj.org/problem?id=2492 Description Background Professor Hopp ...

  2. poj 2492A Bug's Life(并查集)

    /* 目大意:输入一个数t,表示测试组数.然后每组第一行两个数字n,m,n表示有n只昆虫,编号从1-n,m表示下面要输入m行交配情况,每行两个整数,表示这两个编号的昆虫为异性,要交配. 要求统计交配过 ...

  3. 【分组并查集讲解】A Bug‘s Life(例题)

    举例: 我们开一个两倍大小的并查集.例如,假如我们要维护4个元素的并查集,我们改为开8个单位的空间: 我们用14维护朋友关系(就这道题而言,是指关在同一个监狱的狱友),用58维护敌人关系(这道题里是指 ...

  4. POJ 2492 A Bug's Life 带权并查集

    题意: 思路: mod2 意义下的带权并查集 如果两只虫子是异性恋,它们的距离应该是1. 如果两只虫子相恋且距离为零,则它们是同性恋. (出题人好猥琐啊) 注意: 不能输入一半就break出来.... ...

  5. POJ-2492-A Bug's Life [并查集]

    题目传送门 题意: 每行两个数字,表示两个虫子相互喜欢,只有异性才能相互喜欢,所以求里面有没有基佬或者拉拉= =. 思路: 种类并查集,只有两种状态,父节点与自身性别相同,父节点与自身性别不同. 更新 ...

  6. 【转】并查集MST题集

    转自:http://blog.csdn.net/shahdza/article/details/7779230 [HDU] 1213 How Many Tables 基础并查集★ 1272 小希的迷宫 ...

  7. 并查集入门+初级专题训练

    介绍   摘自罗勇军,郭卫斌的<算法竞赛入门到进阶>上的说明:   并查集(Disjoint Set)是一种非常精巧而且食用的数据结构,它主要用于处理一些不相交集合的合并问题.经典的例子有 ...

  8. 并查集的使用,臭虫同性恋问题

    并查集臭虫同性恋经典问题 这个问题也可以理解为:敌人的敌人是朋友问题,这个题总的来说就是进行两个并查集的增添问题,敌人的敌人是朋友,类似,如果出现了敌人的敌人是敌人的情况,那么就输出这种情况就可以了. ...

  9. 并查集小结 (参考birdfly+修改)

    并查集的作用:并和查,即合并和查找,将一些集合合并,快速查找或判断某两个集合的关系,或某元素与集合的关系,或某两个元素的关系. 并查集的结构:并查集主要操作对象是森林,树的结构赋予它独特的能力,对整个 ...

  10. BZOJ 2303 方格染色(带权并查集)

    要使得每个2*2的矩形有奇数个红色,如果我们把红色记为1,蓝色记为0,那么我们得到了这2*2的矩形里的数字异或和为1. 对于每个方格则有a(i,j)^a(i-1,j)^a(i,j-1)^a(i-1,j ...

最新文章

  1. Centos 64位 Install certificate on apache 即走https协议
  2. 一步一步学Silverlight 2系列(24):与浏览器交互相关辅助方法
  3. 想成为嵌入式程序员应知道的16个基本问题
  4. 怎样允许远程访问mysql_如何开启MySQL远程访问权限 允许远程连接
  5. [系统安全] 四.OllyDbg动态分析工具基础用法及Crakeme逆向破解
  6. Extjs4:改变Grid单元格背景色(转载)
  7. java能不能修改文件大小信息_java上机考试3
  8. linux vma,内存管理 – Linux内核API find_vma
  9. python有类似mybatis的框架_为什么感觉国内比较流行的 mybatis 在国外好像没人用的样子?...
  10. mysql 取substring_如何在MySQL中的字段上应用Substring()以获取字符串的一部分?
  11. 超简单开发自己的php框架一点都不难
  12. 适配iOS10以及Xcode8
  13. Android课程思维导图,Android实现思维导图
  14. FabFilter Total Bundle 2021 for Mac - 经典效果器合集(2022版)
  15. matlab得到小波参数,MATLAB|高频信号的小波分析技术要点
  16. 前端学习(一):HTML基本语法
  17. 5个适合提升自己的自学网站,每一个都很强大, 适合职场人自我提升的学习网站,利用起来,离加薪更近一步
  18. python如何取消换行_python怎么取消换行
  19. Linux内核分析及内核编程
  20. oul可以用作c语言常量吗,电子科大16秋《C语言(专科)》在线作业3答案

热门文章

  1. gentoo linux 内核,手动升级Gentoo及其内核的方法
  2. 文件上传(WebUploader)成功之前自定义裁剪(vue-img-cutter),上传裁剪的图片,并兼容ie
  3. win7计算机用户配置文件存储路径,windows7系统电脑临时文件夹保存路径在哪
  4. Unity - Timeline 之 Timeline Preview and Timeline Selector(Timeline预览与Timeline选择器)
  5. 小米五怎么设置锁屏显示无服务器,小米手机怎么设置锁屏状态下不能关机 - 卡饭网...
  6. Scrapy中的Rules理解
  7. instantDrag for Maya脚本 (移动模型时沿目标模型移动)
  8. 我喜欢计算机科学作文,我爱电脑作文9篇
  9. JVM -- JVM内存结构:程序计数器、虚拟机栈、本地方法栈、堆、方法区(二)
  10. 使用shp裁剪县区遥感影像