POJ 2492 A Bug's Life 種類並查集

題意:bug有兩種性別,每個bug是兩個性別之一,現在給出兩個bug的關係,bug之間只允許異性戀,求出所有bug中是否存在同性戀
思路:種類並查集。每個節點賦予權值,根的權值爲兩節點權值的同或和,判斷根相同的兩節點權值是否相同即可

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<vector>
#include<stack> 
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e6+10;
const int inf = 0x3f3f3f3f;
int n, u[maxn], d[maxn], m, T;
int ufind(int x)
{
	if (u[x] < 0) return x;
	int t = ufind(u[x]);
	d[x] ^= d[u[x]];
	u[x] = t;
	return t;
}
bool unite(int x, int y)
{
	int a = ufind(x), b = ufind(y);
	if (a == b) {
		if (d[x] == d[y])
			return 1;
		else
			return 0;
	}
	u[b] = a;
	d[b] = !(d[x]^d[y]);
	return 0;
}
int main()
{
	scanf("%d", &T);
	for (int t = 1; t <= T; t++) {
		scanf("%d%d", &n, &m);
		memset(d, 0, sizeof(d));
		memset(u, -1, sizeof(u));
		int x, y, flag = 0;
		for (int i = 0; i < m; i++) {
			scanf("%d%d", &x, &y);
			if (unite(x, y)) {
				flag = 1;
			}
		}
		if (!flag)
			printf("Scenario #%d:\nNo suspicious bugs found!\n\n", t);
		else
			printf("Scenario #%d:\nSuspicious bugs found!\n\n", t);
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章