Все статьи и конспекты
DSUСНМСтруктуры данныхГрафы
1 мин чтение

Система непересекающихся множеств (DSU / СНМ)

Структура данных DSU с эвристиками сжатия путей и объединения по рангу. Амортизированное время работы O(α(N)), где α — обратная функция Аккермана.

Исходная заготовка: полнота объяснения и примеров ожидает редакторской проверки.

Реализация DSU с оптимизациями

cpp
struct DSU {
    vector<int> parent, rank;
    DSU(int n) : parent(n), rank(n, 0) {
        iota(parent.begin(), parent.end(), 0);
    }
    int find(int i) {
        if (parent[i] == i) return i;
        return parent[i] = find(parent[i]); // Сжатие путей
    }
    bool unite(int i, int j) {
        int root_i = find(i), root_j = find(j);
        if (root_i != root_j) {
            if (rank[root_i] < rank[root_j]) swap(root_i, root_j);
            parent[root_j] = root_i;
            if (rank[root_i] == rank[root_j]) rank[root_i]++;
            return true;
        }
        return false;
    }
};

Что дальше?

Закрепите материал задачей: Повторить число.

Изучено — к практике →

Отметка сохранится в этом браузере. Её можно отменить или снять кнопкой «Изучено».