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:
hər bir giriş cütü üçün çoxlukda cütünün olub-olmamasını yoxlayırıq.
əgər belə bir cüt tapılırsa, çoxluqdan onu silirik, bununla düzgün mübadilə cütü yaratmış oluruq;
əgər tərs cüt yoxdursa, mövcud cütü çoxluğa əlavə edirik.
Bütün tələbələr işlənildikdən sonra iki hal ola bilər:
çoxluq boşdur — bu o deməkdir ki, hər bir cütü üçün uyğun olan tərs cüt tapıldı və mübadilə proqramını uğurla həyata keçirmək mümkündür;
çoxluq boş deyil — bu deməkdir ki, bəzi tələbələr uyğun partnyor tapılmamışdır və mübadilə proqramı mümkün deyil.
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");
}