POJ:2492-Bug's Life(二分图的判定)
Bug’s Life
Time Limit: 10000MS
Memory Limit: 65536K
Description
Background
Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders and that they only interact with bugs of the opposite gender. In his experiment, individual bugs and their interactions were easy to identify, because numbers were printed on their backs.
Problem
Given a list of bug interactions, decide whether the experiment supports his assumption of two genders with no homosexual bugs or if it contains some bug interactions that falsify it.
Input
The first line of the input contains the number of scenarios. Each scenario starts with one line giving the number of bugs (at least one, and up to 2000) and the number of interactions (up to 1000000) separated by a single space. In the following lines, each interaction is given in the form of two distinct bug numbers separated by a single space. Bugs are numbered consecutively starting from one.
Output
The output for every scenario is a line containing “Scenario #i:”, where i is the number of the scenario starting at 1, followed by one line saying either “No suspicious bugs found!” if the experiment is consistent with his assumption about the bugs’ sexual behavior, or “Suspicious bugs found!” if Professor Hopper’s assumption is definitely wrong.
Sample Input
2
3 3
1 2
2 3
1 3
4 2
1 2
3 4
Sample Output
Scenario #1:
Suspicious bugs found!
Scenario #2:
No suspicious bugs found!
Hint
Huge input,scanf is recommended.
解题心得:
- 题意就是一个教授研究一种虫子的配对问题,给你每个虫子的配对情况,问你这些虫子是否存在同性配对。
- 其实就是一个二分图的判定,《算法竞赛,训练指南》里面有判定的源代码,这里说两种判定方法
- 第一种就是先将每个虫子的配对对象用邻接表存起来(存双向边),然后用dfs跑,给开头的那个虫子规定一个性别,然后依次跑下去,如果出现性别冲突,那么说明有同性配对的问题。
- 第二种就是使用并查集来做,存单向边,还是初始化第一只虫子的性别,然后开始找,找到的合并在一个并查集里面,但是如果找到两个虫子性别相同配对,这时候有两种情况,第一种是两个虫子在一个并查集里面,这样说明有同性配对的问题,第二种就是两个虫子不在一个并查集里面,这时候要将一个并查集的性别全部翻转,然后将两个并查集合并起来继续向下找。
- 一个坑点,每个例子之间要输出一个空行,输出就输出嘛,你把这个要求写在输入里面搞毛啊,比赛的时候PE。
dfs判定二分图
#include<stdio.h>
#include<vector>
#include<cstring>
using namespace std;
const int maxn = 2010;
vector <int> ve[maxn];
int n,m,sex[maxn],T=1,t;//sex[i]=0代表这个虫子还没有找过,sex[i]=1代表男性,sex[i]=2代表这个虫子是女性
void init()
{
scanf("%d%d",&n,&m);
memset(sex,0,sizeof(sex));
sex[0] = 2;//用于初始化第一个虫子的性别
for(int i=0;i<=n;i++)
ve[i].clear();
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
ve[a].push_back(b);
ve[b].push_back(a);
}
}
bool dfs(int x,int pre)
{
sex[x] = 3-sex[pre];
for(int i=0;i<ve[x].size();i++)
{
int v = ve[x][i];
if(sex[v] == sex[x])
return false;
if(!sex[v])
if(!dfs(v,x))
return false;
}
return true;
}
void checke()
{
printf("Scenario #%d:\n",T++);
bool flag = true;
for(int i=1;i<=n;i++)
if(!sex[i])
{
flag = dfs(i,0);
if(!flag)
{
printf("Suspicious bugs found!");
return ;
}
}
printf("No suspicious bugs found!");
}
int main()
{
scanf("%d",&t);
while(t--)
{
init();
checke();
if(t != 0)
printf("\n\n");//注意别被坑了
}
}
乱搞,写的并查集
/*比赛时候的智障代码,写得很乱,将就看吧*/
#include<stdio.h>
#include<iostream>
#include<queue>
#include<cstring>
#include<map>
#include<algorithm>
#include<stack>
typedef long long ll;
using namespace std;
const int maxn = 2010;
bool maps[maxn][maxn];
struct NODE
{
int a,b;
}node[maxn*maxn];
int father[maxn];
bool vis[maxn],flag;
int sex[maxn],n,m;
bool cmp(NODE A, NODE B)
{
return A.a < B.a;
}
void init()
{
flag = false;//用于标记是否发生同性冲突
memset(sex,0,sizeof(sex));
memset(vis,0,sizeof(vis));//用来标记这个虫子是否被找过
memset(maps,0,sizeof(maps));
for(int i=1;i<=n;i++)
father[i] = i;
}
int find(int x)
{
if(father[x] == x)
return x;
return father[x] = find(father[x]);
}
void merge(int a,int b)
{
int fa = find(a);
int fb = find(b);
if(fa != fb)
father[fa] = fb;
}
int main()
{
int t = 1;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
init();
flag = false;
int cnt = 0;
for(int i=0;i<m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(a > b)
swap(a,b);
if(!maps[a][b])//检查重边,不知道有没有用,反正写了
{
maps[a][b] = maps[b][a] = true;
node[cnt].a = a;
node[cnt].b = b;
cnt++;
}
}
sort(node,node+cnt,cmp);
for(int i=0;i<cnt;i++)
{
int a = node[i].a;
int b = node[i].b;
if(!vis[a] && !vis[b])
{
vis[a] = vis[b] = true;
merge(a,b);
sex[a] = 0;
sex[b] = 1;
}
else if(!vis[a] && vis[b])
{
sex[a] = !sex[b];
vis[a] = true;
merge(a,b);
}
else if(!vis[b] && vis[a])
{
sex[b] = !sex[a];
vis[b] = true;
merge(a,b);
}
else if(vis[a] && vis[b])
{
if(sex[a] == sex[b])
{
if(find(a) == find(b))//同一并查集中性别冲突
flag = true;
else
{
for(int i=1;i<=n;i++)
if(find(i) == find(b))//不同并查集中性别冲突,就把其中一个中的性别全部冲突
sex[i] = !sex[i];
merge(a,b);
}
}
}
}
printf("Scenario #%d:\n",t++);
if(flag)
printf("Suspicious bugs found!");
else
printf("No suspicious bugs found!");
if(T!=0)
printf("\n\n");
}
return 0;
}
POJ:2492-Bug's Life(二分图的判定)的更多相关文章
- A Bug's Life POJ - 2492 (带权并查集)
A Bug's Life POJ - 2492 Background Professor Hopper is researching the sexual behavior of a rare spe ...
- A Bug's Life POJ 2492
D - A Bug's Life 二分图 并查集 BackgroundProfessor Hopper is researching the sexual behavior of a rare spe ...
- POJ 2492 并查集扩展(判断同性恋问题)
G - A Bug's Life Time Limit:10000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u S ...
- POJ 2492 并查集应用的扩展
A Bug's Life Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 28651 Accepted: 9331 Descri ...
- 二分图的判定hihocoder1121 and hdu3478
这两个题目都是二分图的判定,用dfs染色比较容易写. 算法流程: 选取一个没有染色的点,然后将这个点染色,那么跟他相连的所有点一定是不同颜色的,所以,如果存在已经染过颜色的,如果和这个颜色相同的话,就 ...
- hdu_2444The Accomodation of Students(二分图的判定和计算)
hdu_2444The Accomodation of Students(二分图的判定和计算) 标签:二分图匹配 题目链接 题意: 问学生是否能分成两部分,每一部分的人都不相认识,如果能分成的话,两两 ...
- 双栈排序(洛谷P1155)二分图的判定+思维贪心
题目:戳这里 题目大意: 给你一个数列,问能否通过两个栈的push与pop把它输出成一个升序序列(每个数只能入队并出队一次) 不能的话输出0,能的话输出操作方法 主要思路: 1.判断是否可以成功输出升 ...
- hdu 1829 &poj 2492 A Bug's Life(推断二分图、带权并查集)
A Bug's Life Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- poj 2492 A Bug's Life 二分图染色 || 种类并查集
题目链接 题意 有一种\(bug\),所有的交往只在异性间发生.现给出所有的交往列表,问是否有可疑的\(bug\)(进行同性交往). 思路 法一:种类并查集 参考:https://www.2cto.c ...
随机推荐
- 白话SpringCloud | 第零章:前言
说在前面 大清早醒来,觉得睡不着了.还是起来,写写博客.但最后发现关于SpringBoot的安全相关的还是比较多内容的,也比较专业,怕是一个多小时完不成的,也罢,那就来写写关于SpringCloud前 ...
- Docker | 第六章:构建私有仓库
前言 上一章节,讲解了利用Dockerfile和commit进行自定义镜像的构建.大部分时候,公司运维或者实施部门在构建了符合公司业务的镜像环境后,一般上不会上传到公共资源库的.这就需要自己搭建一个私 ...
- HTML5 有哪些不同类型的存储?
HTML 5 支持本地存储,在之前版本中是通过 Cookie 实现的.HTML5 本地存储速度快而且安全. 有两种不同的对象可用来存储数据: localStorage 适用于长期存储数据,浏览器关闭后 ...
- ubuntu配置硬盘开机自动挂载
1.创建/media/fly文件夹 sudo mkdir /home/fly #根据个人喜好命名 2.获取要自动挂载的分区的UUID和分区类型TYPE sudo blkid 出现如下结果: ...
- python协程与异步协程
在前面几个博客中我们一一对应解决了消费者消费的速度跟不上生产者,浪费我们大量的时间去等待的问题,在这里,针对业务逻辑比较耗时间的问题,我们还有除了多进程之外更优的解决方式,那就是协程和异步协程.在引入 ...
- 1269 匈牙利游戏 2012年CCC加拿大高中生信息学奥赛
1269 匈牙利游戏 2012年CCC加拿大高中生信息学奥赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description ...
- pixhawk原生固件在Windows下环境搭建笔记
首先参考了以下几篇博客 博客1:https://zhuanlan.zhihu.com/p/25198079 博客2:http://blog.csdn.net/oqqenvy12/article/det ...
- CAS登录认证的简单介绍
参考博客: https://www.jianshu.com/p/8daeb20abb84 下面是CAS最基本的协议过程: 下面是CAS Web工作流程图: 名词解释 Ticket Grangting ...
- instanceof 关键字
boolean = Object(类引用名) instanceof Class(类名) 作用:判断符号左边的引用指向的对象是否是右边这个类的对象:
- python 之Requests库学习笔记
1. Requests库安装 Windows平台安装说明: 直接以管理员身份打开cmd运行界面,使用pip管理工具进行requests库的安装. 具体安装命令如下: >pip instal ...