Cod sursa(job #1976240)

Utilizator alexandru94hahahalera alexandru94 Data 2 mai 2017 22:52:18
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <vector>
#include <cassert>
#include <fstream>
#include <string>

class SetManager {
private:
    std::vector<int> m_vGroup;
public:
    SetManager(int n) {
        m_vGroup = std::vector<int>(n + 1, 0);
        for (int i = 1; i <= n; i++)
            m_vGroup[i] = i;
    }
    
    int groupId(int id) {
        assert(id >= 0 && id < (signed)m_vGroup.size());
        if (id != m_vGroup[id])
            m_vGroup[id] = groupId(m_vGroup[id]);    
        return m_vGroup[id]; 
    }

    void unite(int id1, int id2) {
        m_vGroup[groupId(id1)] = groupId(id2);
    }
};

int main() {
    std::string answer[2] = {"NU", "DA"};
    int count;
    int operations_count;
    std::ifstream cin("disjoint.in");
    std::ofstream cout("disjoint.out");
    
    cin >> count >> operations_count;
    SetManager s(count);

   for (int i = 0; i < operations_count; i++) {
        int operation;
        int a1, a2;
        cin >> operation >> a1 >> a2;
        switch(operation) {
        case 1:
            s.unite(a1, a2);
            break;
        case 2:
            cout << answer[s.groupId(a1) == s.groupId(a2)] << "\n";
            break;
        default:
            break;
        }
    }
    cin.close();
    cout.close();
    return 0;
}