并查集--食物链

使用并查集的经典案例,未经编译,仅供参考

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_;
}

 

posted @ 2013-08-22 15:40  dmthinker  阅读(111)  评论(0)    收藏  举报