一、题目描述
二、算法分析说明与代码编写指导
类似题目:POJ 1182 食物链 题解
设有 m 只虫子,n 次观察到的交尾。
虫子 u 和 v 只有性别不同时才可以交尾,那么有两种情况:u♂ × v♀、u♀ × v♂。
每一只虫子可能是雄性也可能是雌性,这两种情况都要进行并查集的合并,方法是 merge (u, v + m),merge(u + m, v)。
查询两只虫子是否是同性的时候,只需要查两种情况中的一种。
三、AC 代码
#include<cstdio>
#include<algorithm>
#pragma warning(disable:4996)
using namespace std;
template<size_t n> class union_find {
private:
unsigned root[n]; int rank[n];
public:
union_find<n>() {
init(); }
union_find<n>(const bool& WannaInit) {
if (WannaInit == true)init(); }
void init() {
fill(rank, rank + n, 1); for (unsigned i = 0; i < n; ++i