题目链接: http://poj.org/problem?id=2492

题意: 有t组测试数据, 对于每组数据,第一行n, m分别表示昆虫的数目和接下来m行x, y,

x, y表示教授判断x, y为异性, 问教授是否有错误判断,即存在x, y为同性;

这道题和poj1703类似, 不过更简单一点 (poj1703题解)

解法1: 我们可以用rank[x]记录x与其父亲节点的关系, rank[x]=0表同性, rank[x]=1表异性;

假设前面的教授判断都是正确的, 若后面存在与前面判断矛盾的数据,那么教授判断有误;

代码:

 #include <iostream>
#include <stdio.h>
#define MAXN 2010
using namespace std; int rank[MAXN], pre[MAXN]; //***rank[x]存储x与其父亲节点的关系 int find(int x){ //***递归压缩路径
if(x!=pre[x]){
int px=find(pre[x]);
rank[x]=(rank[x]+rank[pre[x]])%; //***跟新rank[x]
pre[x]=px;
}
return pre[x];
} int jion(int x, int y){
int px=find(x);
int py=find(y);
if(px==py){
if((rank[x]+rank[y])%==){ //**rank得出x, y的关系为同性,又由题意得出输入的x, y是异性, 矛盾
return ;
}else{
return ;
}
}else{
pre[py]=px; //**合并
rank[py]=(rank[x]+rank[y]+)%; //**更新rank[py]
}
return ;
} int main(void){
int t, m, n;
scanf("%d", &t);
for(int k=; k<=t; k++){
scanf("%d%d", &n, &m);
for(int i=; i<=n; i++){
pre[i]=i;
rank[i]=;
}
int flag=;
while(m--){
int x, y;
scanf("%d%d", &x, &y);
if(jion(x, y)){
flag=;
}
}
if(flag){
printf("Scenario #%d:\nSuspicious bugs found!\n\n", k);
}else{
printf("Scenario #%d:\nNo suspicious bugs found!\n\n", k);
}
}
return ;
}

解法2:  并查集里面合并同一性别的昆虫, 用n+x表示与x性别相反的昆虫

代码:

 #include <iostream>
#include <stdio.h>
#define MAXN 2010
using namespace std; int pre[MAXN*]; int find(int x){ //***递归压缩路径
return x==pre[x]?pre[x]:pre[x]=find(pre[x]);
} void jion(int x, int y){//**合并
int px=find(x);
int py=find(y);
if(px!=py){
pre[px]=py;
}
} int main(void){
int t, m, n;
scanf("%d", &t);
for(int k=; k<=t; k++){
scanf("%d%d", &n, &m);
for(int i=; i<=*n; i++){
pre[i]=i;
}
int flag=;
while(m--){
int x, y;
scanf("%d%d", &x, &y);
if(find(x)==find(y)){
flag=;
}else{
jion(x, y+n);
jion(x+n, y);
}
}
if(flag){
printf("Scenario #%d:\nSuspicious bugs found!\n\n", k);
}else{
printf("Scenario #%d:\nNo suspicious bugs found!\n\n", k);
}
}
return ;
}

解法3: 用vis数组标记, vis[x]存储与x性别不同的昆虫

代码:

 #include <iostream>
#include <stdio.h>
#define MAXN 2010
using namespace std; int pre[MAXN*], vis[MAXN*]; int find(int x){ //***递归压缩路径
return x==pre[x]?pre[x]:pre[x]=find(pre[x]);
} void jion(int x, int y){//***合并
int px=find(x);
int py=find(y);
if(px!=py){
pre[px]=py;
}
} int main(void){
int t, m, n;
scanf("%d", &t);
for(int k=; k<=t; k++){
scanf("%d%d", &n, &m);
for(int i=; i<=*n; i++){
pre[i]=i;
vis[i]=;
}
int flag=;
while(m--){
int x, y;
scanf("%d%d", &x, &y);
if(find(x)==find(y)){
flag=;
}else if(vis[x]+vis[y]==){ //***如果之前x, y都没有出现
vis[x]=y;
vis[y]=x;
}else if(!vis[x]){ //***x没有出现
vis[x]=y;
jion(x, vis[y]);
}else if(!vis[y]){ //***y没有出现
vis[y]=x;
jion(y, vis[x]);
}else{ //***都出现过
jion(x, vis[y]);
jion(vis[x], y);
}
}
if(flag){
printf("Scenario #%d:\nSuspicious bugs found!\n\n", k);
}else{
printf("Scenario #%d:\nNo suspicious bugs found!\n\n", k);
}
}
return ;
}

poj2492(种类并查集/各种解法)的更多相关文章

  1. POJ2492:A Bug's Life(种类并查集)

    A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 45757   Accepted: 14757 题 ...

  2. POJ 1182食物链(分集合以及加权两种解法) 种类并查集的经典

    题目链接:http://icpc.njust.edu.cn/Problem/Pku/1182/ 题意:给出动物之间的关系,有几种询问方式,问是真话还是假话. 定义三种偏移关系: x->y 偏移量 ...

  3. POJ1733 Parity game —— 种类并查集

    题目链接:http://poj.org/problem?id=1733 Parity game Time Limit: 1000MS   Memory Limit: 65536K Total Subm ...

  4. NOI2001|POJ1182食物链[种类并查集 向量]

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

  5. NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]

    题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...

  6. POJ1703Find them, Catch them[种类并查集]

    Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42416   Accepted: ...

  7. poj1417(种类并查集+dp)

    题目:http://poj.org/problem?id=1417 题意:输入三个数m, p, q 分别表示接下来的输入行数,天使数目,恶魔数目: 接下来m行输入形如x, y, ch,ch为yes表示 ...

  8. poj1733(种类并查集+离散化)

    题目链接: http://poj.org/problem?id=1733 题意: 输入n表示有一个长度为n的0,1字符串, m表示接下来有m行输入, 接下来的m行输入中x, y, even表示第x到第 ...

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

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

随机推荐

  1. 解决Button设置disabled后无法执行后台代码问题

    一.开始调式下面的程序,发现Button在js中设置disabled后无法执行后台代码(btnsave_Click)问题 <asp:Button ID="btnsave" r ...

  2. Code First01---CodeFirst项目的搭建

    Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发流程大相径庭,开发体验完全不一样.三种开发模式各有优缺点,对于程序 ...

  3. Android学习笔记(十三)——广播机制

     //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! Android 中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容 ...

  4. Error: failed to fetch platform android

    在使用ionic创建项目后,需要添加平台,运行如下命令添加Android平台时: ionic platform add android 1 出现错误: Error: failed to fetch p ...

  5. 剑指Offer 把字符串转换成整数

    题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法 ...

  6. 浏览器JS脚本

    javascript: void((function() { alert("zeze"); })()) javascript:

  7. String和StringBuffer的转换

    从String到StringBuffer: StringBuffer sb = New StringBuffer("abcd");从StringBuffer到String: Str ...

  8. 【SpringBoot】SpringBoot 入门示例

    参考资料: http://www.tuicool.com/articles/mqeee2A http://www.cnblogs.com/suncj/p/4065589.html http://spr ...

  9. Python之异常追踪模块:traceback

    正常时输出追踪信息: import traceback def stack(): print 'The python stack:' traceback.print_stack() from twis ...

  10. andrond mk通配符遍历文件夹

    define all-cpp-files-under$(patsubst ./%,%, \ $(shell cd $(LOCAL_PATH) ; \ find $(1) -name "*.c ...