Problem B: [CSP-S1][程序阅读] 程序阅读7
Memory Limit:128 MB
Time Limit:1.000 S
Judge Style:Text Compare
Creator:
Submit:69
Solved:6
Description
int fa[N], rk[N]; void init(int n) {for (int i = 1; i <= n; ++i) fa[i] = i, rk[i] = 1; } int find(int x) { if (fa[x] != x) fa[x] = find(fa[x]); return fa[x]; } void merge(int x, int y) { x = find(x), y = find(y); if (x == y) return; if (rk[x] < rk[y]) fa[x] = y; else if (rk[x] > rk[y]) fa[y] = x; else fa[y] = x, rk[x]++; } |
1. find函数实现了按秩压缩。( )
2. 若rk[x]初始为0,合并后秩可能错误。( )
3. 路径压缩后,find的均摊时间复杂度为O(α(n))。( )
4. merge操作中若去掉rk[x]++,时间复杂度退化为O(n)。( )
5. rk[x]始终表示以x为根的树的高度。( )
选择题
6. 若`merge(1,2)`和`merge(2,3)`后,`find(3)`的返回值是:
A. 1 B. 2 C. 3 D. 随机
A. O(1) B. O(log n) C. O(n) D. O(n²)
A. 所有节点直接指向根
B. 树高不超过2
C. 秩始终等于树高
D. 无法确定
A. 秩计算错误 B. 路径压缩失效 C. 时间复杂度退化 D. 无影响
10. 判断两个元素是否在同一集合的正确方式是:
A. `find(x) == find(y)` B. `fa[x] == fa[y]`C. `rk[x] == rk[y]` D. `x == y`