Несвязанная реализация объединения множеств с использованием c ++ - PullRequest
0 голосов
/ 31 марта 2020

Я реализую объединение несвязанных множеств по рангу и сжатию пути в c ++ в соответствии с алгоритмом cp . Но здесь я получаю сообщение об ошибке ссылка на 'rank' неоднозначна . Я прочитал много статей об этой ошибке, но не смог получить удовлетворительного ответа. Может ли кто-нибудь помочь мне с этой проблемой? Заранее спасибо.

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

}

1 Ответ

1 голос
/ 31 марта 2020

using namespace std; ставит вас в неприятности, так как создает возможность для имен совпадать с вашими. Пространства имен созданы для защиты конфликтов имен. В вашем случае std :: rank - это имя. Удалите using namespace std;, и вы должны решить проблему. См. Почему "использование пространства имен std;" считается плохой практикой? .

Еще одна плохая практика в вашем коде: Почему я не должен #include .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...