Əcnəbi Mübadiləsi#1226

Əcnəbi Mübadiləsi (Həll təhlili)

Mübadilə programının uğurla həyata keçirilməsi üçün -dan -yə köçmək istəyən hər bir tələbə üçün -dən -ya köçmək istəyən başqa bir tələbənin olması lazımdır. Yəni hər bir cütü ona uyğun olan tərs cütü ilə olmalıdır. Bu halda eyni cütlər bir neçə dəfə rastlaşa bilər.

Cütlərin saxlanılması üçün çoxluqdan istifadə edəcəyik. Proqramın iş fəaliyyətinin alqoritmini təsvir edək:

Bütün tələbələr işlənildikdən sonra iki hal ola bilər:

Bu əsasa görə cavab "YES" veya "NO" çıxarılır.

Nümunə

Birinci testdə hər bir cütü üçün uyğun tərs cüt tapılır. İkinci testdə tələbələrin istəyi yerinə yetirilə bilmir.

Alqoritmin icrası

Cütlər çoxluğu elan edək. Prosesdə yalnız cütləri saxlanılacaq ki, onlar üçün hələ uyğun olan cütü tapılmamışdır.

multiset<pair<int,int> > s;

Testlərin sayını oxuyuruq.

scanf("%d",&t);

Davamlı olaraq test işləmir.

while (t--)
{

Tələbələrin sayını oxuyuruq.

  scanf("%d", &n); 

Növbəti testi işlənmədən əvvəl çoxluğu təmizləyirik.

  s.clear();

Tələbələrin istəklərini ardıcıl işləyirik.

  for (i = 0; i < n; i++)
  {

Cütün oxuyuruq. Əks istiqamətdə köçmək istəyən tələbəni axtarırıq.

    scanf("%d %d", &a, &b);
    auto it = s.find({ b, a });

Əks cüt tapılmazsa, mövcud cüt çoxluğa əlavə edilir.

Əks cüt tapılırsa, bu cüt -dən silinir, çünki bu cüt üçün mübadilə partnyoru tapılmışdır.

Beləliklə, -də həmişə uyğunluğu tapılmamış olan cütlər saxlanılır.

    if (it == s.end()) s.insert({ a, b });
    else s.erase(it);
  }

Bütün tələbələr işlənildikdən sonra çoxluq boşdursa, bu deməkdir ki, hər bir cüt üçün əks cüt tapıldı və mübadilə proqramı uğurla həyata keçirilə bilər. Əks halda "NO" çıxarırıq.

  if (s.empty()) printf("YES\n");
  else printf("NO\n");
}