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. 随机


7. 当所有`rk[i]=0`时,合并操作的时间复杂度是:

   A. O(1)  B. O(log n)  C. O(n)  D. O(n²)


8. 路径压缩后,`fa`数组的性质正确的是:

   A. 所有节点直接指向根  

   B. 树高不超过2  

   C. 秩始终等于树高  

   D. 无法确定


9. 若`merge`中交换`fa[x]=y`和`fa[y]=x`的条件,可能导致:
   A. 秩计算错误  B. 路径压缩失效  C. 时间复杂度退化  D. 无影响


10. 判断两个元素是否在同一集合的正确方式是:

    A. `find(x) == find(y)`  B. `fa[x] == fa[y]`  
    C. `rk[x] == rk[y]`  D. `x == y`