使用 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?。
您的代码中的另一个错误做法:。
我正在根据 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?。
您的代码中的另一个错误做法: