Procon

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub K-Yoshizawa/Procon

:heavy_check_mark: Union-Find - 素集合データ構造
(Library/DataStructure/UnionFind.hpp)

Union-Find - 素集合データ構造

$n$ 頂点の無向グラフに対し、

をならし $\textrm{O}(\alpha(n))$ 時間で処理することができるデータ構造です。

Function

Constructor

UnionFind(size_t n)

制約

計算量


Find

int Find(const int k)

制約

計算量


Same

bool Same(const int x, const int y)

制約

計算量


Unite

bool Unite(int x, int y)

制約

計算量


Size

size_t Size(int k)

制約

計算量


Group

vector<vector<int>> Group()

計算量


Depends on

Required by

Verified with

Code

#pragma once

#include "../Common.hpp"

class UnionFind{
    public:
    UnionFind(size_t n) : data_(n, -1){}

    int Find(const int k){
        if(data_[k] < 0) return k;
        int r = Find(data_[k]);
        return data_[k] = r;
    }

    bool Same(const int x, const int y){
        return Find(x) == Find(y);
    }

    bool Unite(int x, int y){
        x = Find(x), y = Find(y);
        if(x == y) return false;
        if(data_[x] > data_[y]) swap(x, y);
        data_[x] += data_[y];
        data_[y] = x;
        return true;
    }
    
    size_t Size(int k){
        int v = Find(k);
        return -data_[v];
    }

    vector<vector<int>> Group(){
        vector<vector<int>> ret(data_.size());
        for(int i = 0; i < data_.size(); ++i){
            ret[Find(i)].emplace_back(i);
        }
        ret.erase(remove_if(begin(ret), end(ret), [&](vector<int> &v){
            return v.empty();
        }), end(ret));
        return ret;
    }

    private:
    vector<int> data_;
};
#line 2 "Library/DataStructure/UnionFind.hpp"

#line 2 "Library/Common.hpp"

/**
 * @file Common.hpp
 */

#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cstdint>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <utility>
#include <vector>
using namespace std;

using ll = int64_t;
using ull = uint64_t;

constexpr const ll INF = (1LL << 62) - (3LL << 30) - 1;
#line 4 "Library/DataStructure/UnionFind.hpp"

class UnionFind{
    public:
    UnionFind(size_t n) : data_(n, -1){}

    int Find(const int k){
        if(data_[k] < 0) return k;
        int r = Find(data_[k]);
        return data_[k] = r;
    }

    bool Same(const int x, const int y){
        return Find(x) == Find(y);
    }

    bool Unite(int x, int y){
        x = Find(x), y = Find(y);
        if(x == y) return false;
        if(data_[x] > data_[y]) swap(x, y);
        data_[x] += data_[y];
        data_[y] = x;
        return true;
    }
    
    size_t Size(int k){
        int v = Find(k);
        return -data_[v];
    }

    vector<vector<int>> Group(){
        vector<vector<int>> ret(data_.size());
        for(int i = 0; i < data_.size(); ++i){
            ret[Find(i)].emplace_back(i);
        }
        ret.erase(remove_if(begin(ret), end(ret), [&](vector<int> &v){
            return v.empty();
        }), end(ret));
        return ret;
    }

    private:
    vector<int> data_;
};
Back to top page