Задача: Система непересекающихся множеств: Начало
Напишите программу, которая будет содержать реализацию структуры данных для совокупности непересекающихся подмножеств (disjoint sets) 2 способами (ранговой эвристики и случайным образом) и обрабатывать запросы таких видов:
RESET n — создать новую серию подмножеств: множество из одного только элемента 0, из одного только элемента 1, и так до множества из одного только элемента n–1 включительно. Если структура уже содержала какую-то другую совокупность непересекающихся подмножеств, вся соответствующая информация утрачивается. На стандартный выход (экран) при этом следует вывести два слова через пробел «RESET DONE».
JOIN j k — объединить подмножества, которым принадлежат элемент j и элемент k. Если элементы и так принадлежали одному подмножеству, вывести на стандартный выход (экран) слово «ALREADY», после него через пробелы те же числа j и k в том же порядке. Если элементы до сих пор принадлежали разным подмножествам, то действие происходит только с данными в памяти, на экран ничего не выводится.
CHECK j k — проверить, одному ли подмножеству принадлежат элемент j и элемент k; вывести на стандартный выход (экран) слово «YES» (если одному) или слово «NO» (если разным).
BREAK - закончить прием запросов.
Входные данные
Во входных данных содержится последовательность запросов RESET, JOIN и CHECK — каждый в отдельной строке, согласно вышеописанному формату. Гарантированно, что первая строка содержит запрос RESET, а общее количество запросов RESET не превышает 5. Общее количество всех запросов не превышает 200000. Значение n в каждом запросе RESET не превышает 100000. В каждом запросе JOIN и в каждом запросе CHECK оба числа будут в диапазоне от 0 до n–1, где n — параметр последнего выполненного запроса RESET.
Выходные данные
Для запросов RESET, CHECK и тех запросов JOIN, где элементы и так принадлежат одному подмножеству, выводить на стандартный выход (экран) соответствующий результат (в отдельной строке).
Примечание
Ответы «NO» даются на запросы «CHECK 2 11» и «CHECK 9 1», ответ «ALREADY 4 1» — на второй из запросов «JOIN 4 1» (10-я строка), «YES» — на «CHECK 5 10».
Ввод |
Вывод |
RESET 15
JOIN 14 10
JOIN 13 8
JOIN 0 9
JOIN 8 3
JOIN 4 1
JOIN 10 5
JOIN 8 4
CHECK 2 11
JOIN 4 1
JOIN 2 6
CHECK 9 1
JOIN 6 5
CHECK 10 5
BREAK
|
RESET DONE
NO
ALREADY 4 1
NO
YES
|
C++
Напишите программу ниже |
#include <iostream>
#include <string>
using namespace std;
long long n, x, y, par[100007], rang[100007];
void make_set(int v) {
par[v] = v;
rang[v] = 1;
}
int find_set(int a) {
if (par[a] == a)
return a;
else
return par[a] = find_set(par[a]);
}
void union_sets(int a, int b) {
|
|
}
int main()
{
string s;
while (cin >> s) {
if (s == "BREAK")
break;
if (s == "RESET") {
cin >> n;
for (int i = 0; i<n; i++) {
make_set(i);
}
cout << "RESET DONE" << endl;
}
if (s == "JOIN") {
cin >> x >> y;
if(find_set(x)==find_set(y))
cout<<"ALREADY"<<' '<<x<<' '<<y<<endl;
else union_sets(x,y);
}
if (s == "CHECK") {
cin >> x >> y;
if (find_set(x) == find_set(y)) {
cout << "YES" << endl;
}
else {
cout << "NO" << endl;
}
}
}
}
|
Ваш ответ: