Обмін іноземцями#1226

Обмін іноземцями (Розбір)

Для успішної реалізації програми обміну необхідно, щоб для кожного студента, який бажає переїхати з в , існував інший студент, який бажає переїхати з в . Тобто кожна пара повинна мати відповідну їй зворотну пару . При цьому однакові пари можуть зустрічатися кілька разів.

Для збереження пар будемо використовувати мультимножину. Опишемо алгоритм роботи програми:

Після обробки всіх студентів можливі два випадки:

Залежно від цього виводиться відповідь "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");
}