// 并查集(disjoint_set) // 构造函数:disjoint_set(const int& l),l:容量 class disjoint_set ... {private: int* p; //存储public: disjoint_set(int l) : p(new int[l+1]) ...{ memset (p, -1, sizeof(int)*(l+1)); //初始化,p[x] < 0 表示p[x]是根 } inline int Find(int x) //找到x的根 ...{ if (p[x] < 0) return x; return p[x] = Find(p[x]); //路径压缩 } inline void Union(int a, int b) //合并两个元素所在的集合 ...{ a = Find(a), b = Find(b); int tmp = p[a] + p[b]; if (p[a] < p[b]) ...{ p[b] = a; p[a] = tmp; } else ...{ p[a] = b; p[b] = tmp; } } inline bool Same(int a, int b) //判断两个元素是否同属于同一个集合 ...{ return (Find(a) == Find(b)); }} ;