并查集简单模板
并查集结构:
for (i = 0; i <= n; ++i) f[i] = i;
查找祖先:
int find(int x) { if (x != f[x]) { f[x] = find(f[x]); } return f[x]; }
合并操作:
经常使用的: void Union(int x,int y) { x = find(x); y = find(y); if (x != y) { f[y] = x; num[x] += num[y];//根记录子系的个数 } } 还有一种写法: void Union(int root1, int root2) { int x = FindSet(root1), y = FindSet(root2); if( x == y ) return ; if( rank[x] > rank[y] ) parent[y] = x; else{ parent[x] = y; if( rank[x] == rank[y] ) ++rank[y]; } }