题解:并查集的简单应用。
给你n个元素之间的关系,告诉你他们性别是不同的,这种问题属于带权并查集,比裸的并查集稍稍多了一步。
首先,你需要开辟一个数组val来记录x与它父节点之间的关系
比如说:
val[x]=0代表x与他父节点的性别是相同的
val[x]=1代表x与他父节点的性别是相反的
这里采用压缩路径和的算法,在压缩路径算法中稍稍改进了一点:
比如说a的父节点是b,b的父节点是c,此时,这里的路径还没有被压缩。
当我们访问到a的时候我们进行压缩路径的算法:
我们假设a与b的性别不同,b与c的性别相同,那么这个时候我们需要把a直接连接到根节点上去,那么val[a]=1
这里我们可以把他们之间的所有关系枚举出来,来找一下规律:
val[a]=1,val[b]=1
val[a]=0,val[b]=1
val[a]=1,val[b]=0
val[a]=0,val[b]=0
路径压缩之后,a直接连接在c结点上,所以val[a]分别对应的是:
val[a]=1,val[b]=1 val[a]=0
val[a]=0,val[b]=1 val[a]=1
val[a]=1,val[b]=0 val[a]=1
val[a]=0,val[b]=0 val[a]=0
惊人的发现,他们之间竟然是异或的关系,所以我们得出代码:

int ifind(int x){if(f[x]==x){return x;}int temp=ifind(f[x]);val[x]^=val[f[x]];return f[x]=temp;
}

所以对于每一组新输入的关系,我们先判断他们是不是在同一棵树里,如果在的话我们看看他们分别与父节点的关系,如果val[x]==val[y]这样的话说明他们跟父节点关系是相同的,直接输出Suspicious bugs found!,因为前面的关系让他们属于性别是相同的,而新的关系确实性别不同的,所以舅有bug了。

如果说他们不在同一棵树的话
我们把a的祖先dx连到b的祖先dy上去(那么dx的父节点就是dy了),并且要保证a与b的性别不同,所以得出以下代码。

val[dx]=val[x]^val[y]^1;

代码:

/*Keep on going Never give up*/
#pragma GCC optimize(3,"Ofast","inline")
#include <iostream>
#include <cstdio>
const int maxn = 10010;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 100000000;
using namespace std;
bool flag=true;
int val[maxn],f[maxn];
int cnt=1;
void init(){for(int i=0;i<maxn;i++) f[i]=i;memset(val,0,sizeof(val));flag=true;
}int ifind(int x){if(f[x]==x){return x;}int temp=ifind(f[x]);val[x]^=val[f[x]];return f[x]=temp;
}bool solve(int x,int y){int dx=ifind(x);int dy=ifind(y);if(dx==dy){if(val[x]^val[y]==1)  return true;else  return false;} else{f[dx]=dy;val[dx]=val[x]^val[y]^1;return true;}
}
int main()
{int n,m;int t;cin>>t;while(t--){init();cin>>n>>m;for(int i=0;i<m;i++){int x,y,z;scanf("%d%d",&x,&y);if(flag==false) continue;if(!solve(x,y)){flag=false;}}if(flag==false) printf("Scenario #%d:\nSuspicious bugs found!\n\n", cnt++);else printf("Scenario #%d:\nNo suspicious bugs found!\n\n", cnt++);}return 0;
}

POJ2492 A Bug s Life 题解相关推荐

  1. poj2492 A Bug‘s Life

    题目大意是有人要调查虫子是否在已知的条件下没有出现同性恋的. 输入第一行代表输入组个数,然后就是每一组数据都是包含虫子总数和实验的案例. 接下来每个案例两个数字,代表对应两个虫子可以交配. 最后输出是 ...

  2. ACM比赛经验、刷题记录及模板库总结(更新中)

    前言 本文所提及的部分题目代码,可以在我的Github上找到 第一部分 经验分享及感受 第二部分 刷题记录 一.基础算法&程序语言 //strlen()函数的复杂度是O(n)要小心 //截取字 ...

  3. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

  4. 一系列图论问题[转]

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

  5. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  6. 组合数学与数论函数专题

    组合数学专题 专题简介 本专题包含了一些组合数学中常见的套路和方法,如拉格朗日插值,动态规划,容斥原理,狄利克雷卷积,线性筛,杜教筛 等等. 目录 2018 四川省赛GRISAIA (数论分块) HD ...

  7. 【转】并查集MST题集

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

  8. 图论练习题(存起来练)

    =============================以下是最小生成树+并查集======================================  [HDU]  1213 How Man ...

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

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

最新文章

  1. WCF 第二章 契约 单向操作
  2. Windows下DNS ID欺骗的原理与实现
  3. java 斗地主_java 斗地主
  4. (原创)批处理学习小结
  5. 2022年计算机体系结构与软件工程国际会议(CASE 2022 )
  6. CC2540蓝牙开发二 OSAL系统
  7. c语言银行卡管理系统的意义,使用会员管理系统的意义
  8. 八爪鱼采集器使用方法
  9. APP推广第一步:五大ASO优化方法
  10. 用计算机做电子贺卡送祝福,泰山版信息技术五年级上册第2课《电子贺卡送祝福》教案.doc...
  11. C++Qt开发——Linguist语言家
  12. jadx工具介绍及使用
  13. ICS文件说明和创建(以Outlook为例)
  14. 使用谷歌扩展程序出现停用情况
  15. 南开大学2012年考博微观经济学真题
  16. IPTV(网络电视)
  17. 自然语言处理(NLP)之三:语言模型
  18. 听说我们是新生代农民工?
  19. 128bit整数范围的随机数生成器
  20. scrapy爬取豆瓣所有电影信息(新手入门超详细版)

热门文章

  1. python中lambda 表达式(无参数、一个参数、默认参数、可变参数(*args、**kwargs)、带判断的lambda、列表使用lambda)
  2. TCP和UDP DNS DHCP OSPF的五种包:
  3. 我熬了几个大夜,学完一套 海外博士 总结的「卷积神经网络、目标检测、OpenCV」笔记!...
  4. 优化你的CPU来做深度学习
  5. 基于感知损失的实时风格迁移与超分辨率重建
  6. 干货 | tensorflow模型导出与OpenCV DNN中使用
  7. 基于图形剪切的图像分割
  8. 把浮点型数值用科学计数法输出
  9. 浙大版《C语言程序设计(第3版)》题目集 练习2-17 生成3的乘方表 (15 分)
  10. 网易云易盾荣获雷锋网颁发的年度最佳视频内容审查奖