首页 > 解决方案 > 使用c ++的不相交集联合实现

问题描述

我正在根据cp 算法在 C++ 中通过秩和路径压缩来实现不相交集联合。但是在这里我得到一个错误 ,对“秩”的引用是模棱两可的。我已经阅读了很多关于这个错误的文章,但没有得到任何满意的答案。有人可以帮我解决这个问题吗?在此先感谢。

#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;
    }

}

标签: c++disjoint-setsdisjoint-union

解决方案


using namespace std;给你带来麻烦,因为它创造了与你的名字相同的机会。命名空间已到位以保护名称冲突。在您的情况下, std::rank 是一个名称。删除using namespace std;,您应该解决问题。请参阅为什么是“使用命名空间标准;” 被认为是不好的做法?.

代码中的另一个不好的做法:为什么我不应该#include <bits/stdc++.h>?.


推荐阅读