集合专题
初始化parent集合
1 2 3 4 5 6
| const int N = 100; int parent[N], rank[N]; for(int i = 0; i < N; i++) { parent[i] = i; rank[i] = 0; }
|
寻找祖先结点
1 2 3 4 5
| int find(int parent[], int x) { if(parent[x] != x) x = parent[x]; find(parent, x); return x; }
|
合并集合
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| void Union(int parent[], int x, int y) { int xp = find(parent, x); int yp = find(parent, y); if(xp != yp) parent[xp] = yp;
}
|
开放寻址法
1 2 3 4 5 6 7 8 9 10 11 12
| int h[N]; int find(int x) { int t = (x % N + N) % N; while (h[t] != null && h[t] != x) { t ++ ; if (t == N) t = 0; } return t; }
|
拉链法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| int H[N]; int idx; int node[N], ne[N];
void insert(int x) { int k = (x % N + N) % N; node[idx] = x; ne[idx] = H[k]; H[k] = idx ++; }
bool find2(int x) { int k = (x % N + N) % N; for(int i = H[k]; i!=-1; i = ne[i]) { if(node[i] == x) return true; } return false; }
|
代码与知识点均学习自AcWing:https://www.acwing.com/activity/