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 ...
随机推荐
- 08OC之Foundation框架
1.Foundation框架简述 在前面,我们创建一个类的时候,都会选择Cocoa Class.到底Cocoa Class是什么东西呢? Cocoa 不是一门编程语言,因为它可以运行在多种编程语言上, ...
- Codeforces Round #336 Hamming Distance Sum
题目: http://codeforces.com/contest/608/problem/B 字符串a和字符串b进行比较,以题目中的第一个样例为例,我刚开始的想法是拿01与00.01.11.11从左 ...
- Maven的依赖范围
Maven的依赖构件包含一个依赖范围属性,这个属性描述的是三套classpath的控制,即编译.测试.运行. 举个例子Junit依赖只是在测试范围(classpath)使用,而在运行的时候不使用,还有 ...
- POJ 1273 网络流(最大流)模板
http://poj.org/problem?id=1273 这道题很值得反思,弄了一下午,交上去先是一直编译错误,而在本地运行没有问题, 原因可能是oj的编译器版本老旧不支持这样的写法 G[from ...
- ndk学习7: 使用静态库
目录: 手工编译静态库 ndk-build编译静态库 手工编译静态库 老规矩还是先手工操作,知其然并知其所以然 需要用到的核心命令: gcc –g –c mod1.c mod2.c mod3. ...
- 泛型约束 where T : class,new()
假如有这样一个方法签名 public List<T> GetSomethingList<T> (int a,int b,string c) where T:class,new( ...
- 如何限制一个类只在堆上分配和栈上分配(StackOnly HeapOnly)
[本文链接] http://www.cnblogs.com/hellogiser/p/stackonly-heaponly.html [题目] 如何限制一个类只在堆上分配和栈上分配? [代码] C+ ...
- iOS App Extensions 推荐文章
写的非常不错,读完后,基本的extension的套路就清楚了,也是我们的园友写的,感谢他: http://www.cnblogs.com/xdream86/p/3855932.html 下面这个教程是 ...
- ios 在中国地区,24小时时间格式 系统设定下 获得12小时制时间的方法
如题,在中国地区,24小时时间格式 系统设定下,如果单单使用 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 之后,无论用hh ...
- ACM/ICPC 之 并查集-食物链(POJ1182)
并查集的经典题型,POJ上题目还是中文= =,一般看到中文题都会感觉不太简单,这道题的数学归纳用得比较多,可以简化代码,挺有意思的. 同类型的题目还有POJ1703,比这个要简单,想了解并查集基本介绍 ...