Untitled
unknown
plain_text
2 years ago
2.2 kB
4
Indexable
#include <iostream> #include <vector> using namespace std; // Функция для нахождения корня дерева int find(vector<int>& parent, int i) { if (parent[i] == i) { return i; } return find(parent, parent[i]); } // Функция для объединения двух множеств void join(vector<int>& parent, vector<int>& rank, int x, int y) { int xRoot = find(parent, x); int yRoot = find(parent, y); // Если элементы принадлежат одному и тому же множеству if (xRoot == yRoot) { cout << "ALREADY " << x << " " << y << endl; return; } // Иначе объединяем множества if (rank[xRoot] < rank[yRoot]) { parent[xRoot] = yRoot; } else if (rank[xRoot] > rank[yRoot]) { parent[yRoot] = xRoot; } else { parent[yRoot] = xRoot; rank[xRoot]++; } } // Функция для проверки принадлежности элементов одному множеству bool check(vector<int>& parent, int x, int y) { return find(parent, x) == find(parent, y); } int main() { int n; cin >> n; // Инициализируем parent и rank vector<int> parent(n); vector<int> rank(n, 0); for (int i = 0; i < n; i++) { parent[i] = i; } cout << "RESET DONE" << endl; string command; while (cin >> command) { if (command == "RESET") { cin >> n; // Инициализируем parent и rank parent.resize(n); rank.resize(n, 0); for (int i = 0; i < n; i++) { parent[i] = i; } cout << "RESET DONE" << endl; } else if (command == "JOIN") { int a, b; cin >> a >> b; join(parent, rank, a, b); } else if (command == "CHECK") { int a, b; cin >> a >> b; if (check(parent, a, b)) { cout << "YES" << endl; } else { cout << "NO" << endl; } } } return 0; }
Editor is loading...