并查集模板
并查集结构:
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]; } } |