您的位置:首页 > Web前端

POJ-2492 A Bug's Life

2011-11-17 16:18 330 查看
题目链接:http://poj.org/problem?id=2492

题目大意:

给你n个bug和m个他们之间的信息。如给出1和3,表示1喜欢3。当然给出的说明他们是异性

。判断有没有出现一种情况,比如1喜欢2,2喜欢3,1又喜欢3,这明显是矛盾,1和2性别不同,2和3性别不同,那么1和3性别肯定相同,如果1喜欢3,则是同性,矛盾出现。。。

题目就是判断有没有矛盾出现。。。。。。。

解题思路:

并查集的深层次应用,和食物链是一个思想,就不再多说了。

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 20010

struct node
{
	int pre;
	int relation;
}bug
;

int find(int x)
{
	int temp;
	if(x == bug[x].pre)
		return x;
	temp = bug[x].pre;
	bug[x].pre = find(temp);
	bug[x].relation = (bug[x].relation + bug[temp].relation) % 2;
	return bug[x].pre;
}

int main()
{
	//freopen("Input.txt", "r", stdin);
	int ncase, T = 1;
	int bugnum, link;
	int a, b, root1, root2;
	bool flag;
	scanf("%d", &ncase);
	while(ncase--)
	{
		scanf("%d%d", &bugnum, &link);
		for(int i = 1; i <= bugnum; ++i)
		{
			bug[i].pre = i;
			bug[i].relation = 0; //0相同,1不同
		}
		flag = true;
		printf("Scenario #%d:\n", T++);
		for(int i = 1; i <= link; ++i)
		{
			scanf("%d%d", &a, &b);
			if(flag == false)
				continue;
			root1 = find(a);
			root2 = find(b);
			if(root1 != root2)
			{
				bug[root2].pre = root1;
				bug[root2].relation = (bug[a].relation + 1 + 2 - bug[b].relation) % 2;
			}
			else
			{
				if(bug[a].relation == bug[b].relation && ((2 - bug[a].relation + bug[b].relation) % 2 != 1))
				{
					printf("Suspicious bugs found!\n\n");
					flag = false;	
				}
			}
		}
		if(flag)
		{
			printf("No suspicious bugs found!\n\n");
		}
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: