使用 C++ 的不相交集并集实现

Disjoint set union implementation using c++

我正在根据 cp algorithm 在 C++ 中通过等级和路径压缩实现不相交集并集。但是我在这里遇到错误 reference to 'rank' is ambiguous。我已经阅读了很多关于这个错误的文章,但没有得到任何令人满意的结果 answer.Can 谁能帮我解决这个问题?提前致谢。

#include<bits/stdc++.h>
using namespace std;
#define mx 10005
int parent[mx],rank[mx];

void make_set(int v) {
    parent[v] = v;
    rank[v] = 0;
}
int find_set(int v) {
    if (v == parent[v])
        return v;
    return parent[v] = find_set(parent[v]);
}

void union_sets(int a, int b) {
    a = find_set(a);
    b = find_set(b);
    if (a != b) {
        if (rank[a] < rank[b])
            swap(a, b);
        parent[b] = a;
        if (rank[a] == rank[b])
            rank[a]++;
    }
}
bool check(int a, int b){ return find_set(a) == find_set(b); }

int main()
{
    int x;cin>>x;
    for(int i=1;i<=x;++i)
    {
        make_set(i);
    }
    union_sets(1,2);
    union_sets(2,3);
    union_sets(4,5);
    union_sets(6,7);
    union_sets(5,6);
    union_sets(3,7);
    for(int i=1;i<=x;++i)
    {
        cout<<find_set(i)<<endl;
    }

}

using namespace std; 会给您带来麻烦,因为它为名字与您的名字相同创造了机会。命名空间用于保护名称冲突。在您的例子中,std::rank 是一个名称。删除 using namespace std;,您应该可以解决问题。参见 Why is "using namespace std;" considered bad practice?

您的代码中的另一个错误做法: