poj2492(种类并查集/各种解法)
题目链接: 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(种类并查集/各种解法)的更多相关文章
- POJ2492:A Bug's Life(种类并查集)
A Bug's Life Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 45757 Accepted: 14757 题 ...
- POJ 1182食物链(分集合以及加权两种解法) 种类并查集的经典
题目链接:http://icpc.njust.edu.cn/Problem/Pku/1182/ 题意:给出动物之间的关系,有几种询问方式,问是真话还是假话. 定义三种偏移关系: x->y 偏移量 ...
- POJ1733 Parity game —— 种类并查集
题目链接:http://poj.org/problem?id=1733 Parity game Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- NOI2001|POJ1182食物链[种类并查集 向量]
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 65430 Accepted: 19283 Description ...
- NOIP2010关押罪犯[并查集|二分答案+二分图染色 | 种类并查集]
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨气值”(一个正整数值)来表示 ...
- POJ1703Find them, Catch them[种类并查集]
Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42416 Accepted: ...
- poj1417(种类并查集+dp)
题目:http://poj.org/problem?id=1417 题意:输入三个数m, p, q 分别表示接下来的输入行数,天使数目,恶魔数目: 接下来m行输入形如x, y, ch,ch为yes表示 ...
- poj1733(种类并查集+离散化)
题目链接: http://poj.org/problem?id=1733 题意: 输入n表示有一个长度为n的0,1字符串, m表示接下来有m行输入, 接下来的m行输入中x, y, even表示第x到第 ...
- poj 1182:食物链(种类并查集,食物链问题)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 44168 Accepted: 12878 Description ...
随机推荐
- 解决Button设置disabled后无法执行后台代码问题
一.开始调式下面的程序,发现Button在js中设置disabled后无法执行后台代码(btnsave_Click)问题 <asp:Button ID="btnsave" r ...
- Code First01---CodeFirst项目的搭建
Entity Framework支持Database First.Model First和Code Only三种开发模式,各模式的开发流程大相径庭,开发体验完全不一样.三种开发模式各有优缺点,对于程序 ...
- Android学习笔记(十三)——广播机制
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! Android 中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容 ...
- Error: failed to fetch platform android
在使用ionic创建项目后,需要添加平台,运行如下命令添加Android平台时: ionic platform add android 1 出现错误: Error: failed to fetch p ...
- 剑指Offer 把字符串转换成整数
题目描述 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数. 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法 ...
- 浏览器JS脚本
javascript: void((function() { alert("zeze"); })()) javascript:
- String和StringBuffer的转换
从String到StringBuffer: StringBuffer sb = New StringBuffer("abcd");从StringBuffer到String: Str ...
- 【SpringBoot】SpringBoot 入门示例
参考资料: http://www.tuicool.com/articles/mqeee2A http://www.cnblogs.com/suncj/p/4065589.html http://spr ...
- Python之异常追踪模块:traceback
正常时输出追踪信息: import traceback def stack(): print 'The python stack:' traceback.print_stack() from twis ...
- andrond mk通配符遍历文件夹
define all-cpp-files-under$(patsubst ./%,%, \ $(shell cd $(LOCAL_PATH) ; \ find $(1) -name "*.c ...