Для успішної реалізації програми обміну необхідно, щоб для кожного студента, який бажає переїхати з в , існував інший студент, який бажає переїхати з в . Тобто кожна пара повинна мати відповідну їй зворотну пару . При цьому однакові пари можуть зустрічатися кілька разів.
Для збереження пар будемо використовувати мультимножину. Опишемо алгоритм роботи програми:
для кожної вхідної пари перевіряємо, чи міститься в мультимножині пара .
якщо така пара знайдена, то видаляємо її з мультимножини, тим самим формуючи коректну пару обміну;
якщо зворотної пари немає, додаємо поточну пару в мультимножину.
Після обробки всіх студентів можливі два випадки:
мультимножина порожня — це означає, що для кожної пари знайшлася відповідна зворотна пара , і програму обміну можна успішно здійснити;
мультимножина не порожня — значить, деякі студенти залишились без підходящого партнера, і програма обміну неможлива.
Залежно від цього виводиться відповідь "YES" або "NO".
Приклад
У першому тесті для кожної пари знайдеться відповідна зворотна пара . У другому тесті жодне бажання студента не може бути виконане.
Реалізація алгоритму
Оголосимо мультимножину пар . У процесі роботи в ній будуть зберігатися тільки ті пари , для яких ще не знайдено відповідну пару .
multiset<pair<int,int> > s;Читаємо кількість тестів .
scanf("%d",&t);Послідовно обробляємо тестів.
while (t--)
{Читаємо кількість студентів .
scanf("%d", &n); Перед обробкою чергового тесту очищаємо мультимножину.
s.clear();Послідовно обробляємо бажання студентів.
for (i = 0; i < n; i++)
{Читаємо пару . Шукаємо студента з протилежним напрямком переїзду.
scanf("%d %d", &a, &b);
auto it = s.find({ b, a });Якщо зворотна пара не знайдена, поточна пара додається в мультимножину .
Якщо зворотна пара знайдена, вона видаляється з , оскільки для цієї пари знайдено партнера для обміну.
Таким чином, у завжди зберігаються тільки ті пари, для яких поки не знайдено відповідність.
if (it == s.end()) s.insert({ a, b });
else s.erase(it);
}Якщо після обробки всіх студентів мультимножина порожня, значить для кожної пари знайшлася зворотна, і програма обміну може бути успішно виконана. В іншому випадку виводимо "NO".
if (s.empty()) printf("YES\n");
else printf("NO\n");
}