Codeforces Round #600 里面有用到这个,但是真的重新打浪费时间。
不需要什么按秩合并,浪费空间多此一举,让那个合并的常数大了不少。但是循环还是有必要的,比递归快很多。
struct DisjointSetUnion { static const int MAXN = 200000; int n, fa[MAXN + 5]; void Init(int _n) { n = _n; for(int i = 1; i <= n; i++) fa[i] = i; } int Find(int u) { int r = fa[u]; while(fa[r] != r) r = fa[r]; int t; while(fa[u] != r) { t = fa[u]; fa[u] = r; u = t; } return r; } bool Merge(int u, int v) { int fu = Find(u), fv = Find(v); if(fu == fv) return false; else { fa[v] = fu; return true; } } } dsu;