POJ2492---A Bug's Life

A Bug‘s Life

Time Limit: 10000MS   Memory Limit: 65536K
Total Submissions: 29209   Accepted: 9528

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.

Source

TUD Programming Contest 2005, Darmstadt, Germany

重新做了一下这题,以前用的是染色法判断是否有某条边的两端颜色一样

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

const int N=2000010;
const int maxn=2010;
int col[maxn];

struct node
{
	int next;
	int to;
}edge[N];
int head[maxn];
int tot;

void addedge(int from,int to)
{
	edge[tot].to=to;
	edge[tot].next=head[from];
	head[from]=tot++;
}

bool bfs(int root)
{
	queue<int>qu;
	while(!qu.empty())
		qu.pop();
	col[root]=1;
	qu.push(root);
	while(!qu.empty())
	{
		int u=qu.front();
		qu.pop();
		for(int i=head[u];i!=-1;i=edge[i].next)
		{
			int v=edge[i].to;
			if(col[v]==-1)
			{
				col[v]=(!col[u]);
				qu.push(v);
			}
			if(col[v]==col[u])
				return false;
		}
	}
	return true;
}

int main()
{
	int t;
	scanf("%d",&t);
	int n,m,u,v;
	int icase=1;
	while(t--)
	{
		memset(head,-1,sizeof(head));
		memset(col,-1,sizeof(col));
		tot=0;
		scanf("%d%d",&n,&m);
		for(int i=1;i<=m;i++)
		{
			scanf("%d%d",&u,&v);
			addedge(u,v);
			addedge(v,u);
		}
		bool flag;
		for(int i=1;i<=n;i++)
		{
			if(col[i]==-1)
			{
				flag=bfs(i);
				if(!flag)
					break;
			}
		}
		printf("Scenario #%d:\n",icase++);
		if(flag)
			printf("No suspicious bugs found!\n\n");
		else
			printf("Suspicious bugs found!\n\n");
	}
	return 0;
}

现在用了一下并查集

设opp[x] = y表示x的对面是y,某个x可能有多个对立面,我们合并这些对立面,那么显然这些对立面是同性的,因此如果输入的2个值是在同一个集合里,就说明它们是同性恋,否则就根据情况来合并集合

/*************************************************************************
    > File Name: POJ2492.cpp
    > Author: ALex
    > Mail: [email protected]
    > Created Time: 2015年01月22日 星期四 13时19分31秒
 ************************************************************************/

#include <map>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 2010;
int opp[N];
int father[N];

int find (int x)
{
	if (father[x] == -1)
	{
		return x;
	}
	return father[x] = find (father[x]);
}

void merge (int a, int b)
{
	int aa = find (a);
	int bb = find (b);
	if (aa != bb)
	{
		father[aa] = bb;
	}
}

int main ()
{
	int t;
	int icase = 1;
	scanf("%d", &t);
	int n, m;
	while (t--)
	{
		int u, v;
		bool flag = false;
		scanf("%d%d", &n, &m);
		memset (father, -1, sizeof(father));
		memset (opp ,-1, sizeof(opp));
		while (m--)
		{
			scanf("%d%d", &u, &v);
			if (flag)
			{
				continue;
			}
			int uu = find (u);
			int vv = find (v);
			if (uu == vv)
			{
				flag = true;
			}
			else
			{
				if (opp[u] == - 1 && opp[v] == -1)
				{
					opp[u] = v;
					opp[v] = u;
				}
				else if (opp[u] == -1)
				{
					opp[u] = v;
					merge (u, opp[v]);
				}
				else if (opp[v] == -1)
				{
					opp[v] = u;
					merge (v, opp[u]);
				}
				else
				{
					merge (v, opp[u]);
					merge (u, opp[v]);
				}
			}
		}
		printf("Scenario #%d:\n", icase++);
		if (flag)
		{
			printf("Suspicious bugs found!\n");
		}
		else
		{
			printf("No suspicious bugs found!\n");
		}
		printf("\n");
	}
	return 0;
}

POJ2492---A Bug's Life

时间: 2024-10-12 17:40:12

POJ2492---A Bug's Life的相关文章

POJ2492 A Bug&#39;s Life 【并查集】

A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 29011   Accepted: 9451 Description Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders

poj2492 A Bug&#39;s Life【带权并查集】

题目链接:http://poj.org/problem?id=2492 题目描述:找基佬游戏(汗-_-b)有个hentai科学家研究虫子种群,不断地给出二元组xy,表示x和y是异性交往,但是可能会出现矛盾(找到基佬),比如1与2是异性恋,2与3是异性恋,却又告诉你1和3是异性恋.问种群中存不存在基佬败类 思路:与poj1182“食物链”几乎一样,还简单一点,毕竟只有两类物品.par[i]表示父节点,d[i]表示偏移量,0为同性,1为异性.不过要注意的一点是所有合并的过程要对二取模,比如x找到根结

poj2492 A Bug&#39;s Life (并查集拓展)

C - A Bug's Life Crawling in process... Crawling failed Time Limit:10000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2492 Appoint description: CSUST_11 (2013-04-14) System Crawler (2016-05-13) Description B

POJ2492 A Bug&#39;s Life (easy)

Description BackgroundProfessor 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 a

POJ2492 A Bug&#39;s Life (并查集)

本文出自:http://blog.csdn.net/svitter 题意: 给出昆虫编号,看昆虫能否交配,如果出现同性交配或者自我交配的情况,则出现BUG. 输入输出分析: 1.输入输出数据: input: 2 3 3 1 2 2 3 1 3 4 2 1 2 3 4 output: Scenario #1: Suspicious bugs found! Scenario #2: No suspicious bugs found! 第一行给出的是测试数据的个数,随后跟着n, m.n是昆虫个数,m是

18.9.17 poj2492 A Bug&#39;s Life

描述 BackgroundProfessor 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

POJ-2492.A Bug&#39;s Life(带权并查集)

A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 48043   Accepted: 15483 Description Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different gender

POJ-2492 A Bug&#39;s Life(种类并查集)

http://poj.org/problem?id=2492 题意: 给出一个T代表几组数据,给出一个n一个m,代表人的编号由1~n,m条命令,每条命令由两个数值组成,代表这两个人性别不同,问所有命令是否符合逻辑 两种写法: 第一种:带权并查集 1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <string> 5 #include <math.h&g

并查集练习2(带权并查集)

明天旅游去爬山逛庙玩,今天练一天然后早早睡觉啦~ poj1703 Find them, Catch them (带权并查集) 1 #include<cstdio> 2 const int N=1e5+1; 3 int f[N]; 4 int r[N];//表示与父节点的关系,0同类,1不同类 5 int n; 6 void init(){ 7 for(int i=1;i<=n;++i){ 8 f[i]=i; r[i]=0; 9 } 10 } 11 int fin(int x){ 12 i

题单二:图论500

http://wenku.baidu.com/link?url=gETLFsWcgddEDRZ334EJOS7qCTab94qw5cor8Es0LINVaGMSgc9nIV-utRIDh--2UwRLvsvJ5tXFjbdpzbjygEdpGehim1i5BfzYgYWxJmu ==========  以下是最小生成树+并查集=========================[HDU]1213         How Many Tables        基础并查集★1272         小