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 ...
随机推荐
- iOS/Android/Web Url Encode空格處理 原文連結:http://read01.com/3gDO.html
iOS/Android/Web Url Encode空格處理 原文連結:http://read01.com/3gDO.html 前言 這裡只是講一個故事,一個發生在我身上的真實的故事.曾經,我以為搞加 ...
- 导航栏的坑 (导航透明/导航除线/titleIView)
//以下四个条件缺一不可 /.必须是半透明状态 self.navigationBar.translucent = YES; //2.导航栏背景图片为空图片 (不可以设置backgroundColor或 ...
- xcode免证书开发
工程和target的code sign 选择 ios developer 工程的team选择为none就ok 推送测试 或者 正式发布的时候要改回来, 有一个严重的缺陷, 就是打包出来的ipa程序有时 ...
- mysql 时间戳 按周、日、月 统计方法 附 date格式
create_time时间戳格式 SELECT FROM_UNIXTIME(create_time,'%Y%u') weeks,COUNT(id) COUNT FROM role GROUP BY w ...
- 3.6---双栈排序(CC150)
答,课本上的方法比较好. public static Stack<Integer> sort(Stack<Integer> s) { Stack<Integer> ...
- php构造函数和析构函数
构造函数 void __construct ([ mixed $args [, $... ]] ) PHP 5 允行开发者在一个类中定义一个方法作为构造函数.具有构造函数的类会在每次创建新对象时先调用 ...
- Oracle占用8080端口问题的解决
可能在本地同时安装过Tomcat和Oracle的人都会知道,安装完Oracle后,会发现Tomcat的8080端口已经被Oracle占用了. 完全安装Oracle数据库后,当我们访问8080端口时,会 ...
- SqlServer中的Null值空值问题
sql使用的是三值谓词逻辑,所以逻辑表达式返回的结果可以为True.False或者未知,在三值逻辑中返回True与不返回False并不完全一样, SQL对查询过滤条件的处理:接受TURE 拒绝FAL ...
- poj 1700
http://poj.org/problem?id=1700 题目大意就是一条船,有N个人需要过河,求N个人最短过河的时间 #include <stdio.h> int main() { ...
- (转)C++0x语言新特性一览
转自:http://blog.csdn.net/zwvista/article/details/2429781 原文请见http://en.wikipedia.org/wiki/C%2B%2B0x. ...