并查集--食物链
使用并查集的经典案例,未经编译,仅供参考
class UnionFind { public: UnionFind(int size) : size_(size) { fathers_.resize(size_ + 1); for (int i = 1; i < size_ + 1; ++i) { fathers_[i] = i; rels_[i] = 0; } degrees_.resize(size_ + 1, 1); } bool Union(int a, int b, int rel) { if (a > size_ || b > size_ || a <= 0 || b <= 0) { return false; } int father_a = Find(a); int father_b = Find(b); if (father_a == father_b) { if ((rels_[a] + rel - 1) % 3 == rels_[b]) { return true; } return false; } if (degrees[father_a] > degrees_[father_b]) { fathers_[father_b] = father_a; rels_[father_b] = (rels_[a] - rels_[b] + 2 + rel) % 3; degrees_[father_a] += degrees_[father_b]; } else { fathers_[father_a] = father_b; rels_[father_a] = (rels_[b] - rels_[a] + 2 + rel) % 3; degrees_[father_b] += degrees_[father_a]; } return true; } int Find(int value) { if (value == fathers_[value]) return value; rels_[value] = (rels_[value] + rels_[fathers_[value]]) % 3; fathers_[value] = Find(fathers_[value]); return fathers_[value]; } private: vector<int> fathers_; vector<int> degrees_; vector<int> rels_; int size_; }
Passion, patience, perseverance, keep it and move on.

浙公网安备 33010602011771号