Wojciech RytterPiotr Sankowski
Treść zadania, OpracowanieProgram wzorcowy


Spokojna komisja


W parlamencie Demokratycznej Republiki Bajtocji, zgodnie z Bardzo Ważną Ustawą, należy ukonstytuować Komisję Poselską do Spraw Spokoju Publicznego. Niestety sprawę utrudnia fakt, iż niektórzy posłowie wzajemnie się nie lubią.


Komisja musi spełniać następujące warunki:

Każda partia ma w parlamencie dokładnie dwóch posłów. Wszyscy posłowie są ponumerowani liczbami od 1 do 2n. Posłowie o numerach 2i-1 i 2i należą do partii o numerze i.

Zadanie

Napisz program, który:

Wejście

W pierwszym wierszu pliku tekstowego spo.in znajdują się dwie nieujemne liczby całkowite n i m. Liczba n, spełniająca warunki 1 leq n leq 8000, oznacza liczbę partii. Liczba m, spełniająca warunki 0 leq m leq 20000, oznacza liczbę par nielubiących się posłów. W każdym z kolejnych m wierszy zapisana jest para liczb naturalnych a i b, 1 leq a < b leq 2n, oddzielonych pojedynczym odstępem. Oznacza ona, że posłowie o numerach a i b wzajemnie się nie lubią.

Wyjście

Plik tekstowy spo.out powinien zawierać pojedyncze słowo NIE, jeśli utworzenie Komisji nie jest możliwe. W przypadku, gdy utworzenie Komisji jest możliwe, plik spo.out powinien zawierać n liczb całkowitych z przedziału od 1 do 2n, zapisanych w kolejności rosnącej i oznaczających numery posłów zasiadających w Komisji. Każda z tych liczb powinna zostać zapisana w osobnym wierszu. Jeśli Komisję można utworzyć na wiele sposobów, Twój program może wypisać dowolny z nich.

Przykład

Dla pliku wejściowego spo.in
3 2
1 3
2 4
poprawną odpowiedzią jest plik wyjściowy spo.out
1
4
5

Rozwiązanie

Niech X będzie zbiorem par posłów, którzy się wzajemnie nie lubią. Potraktujmy X jako krawędzie grafu nieskierowanego, a taki graf nazwijmy grafem konfliktowym. Przykład grafu konfliktowego ilustruje rysunek 1. Pogrubione numery oznaczają pewien zbiór posłów stanowiący ``spokojną'' Komisję.

Z grafem konfliktowym stowarzyszymy graf mathcal(G), który nazwiemy grafem wymuszeń. Jeśli x-y in X oraz z ne y należy do tej samej partii co y, to x rightarrow z jest skierowaną krawędzią w grafie wymuszeń. Oznaczmy


(mathit Wymuszone)(x...,
gdzie rightarrow^* oznacza, że w G można przejść z x do y po strzałkach.
Zbiór (mathit Wymuszone)(x... składa się z posłów, których obecność w komisji jest wymuszona przez obecność w niej posła x. Zbiory tego typu mają następującą własność.

Jeśli K jest spokojną Komisją i x in K, to (mathit Wymuszone)(x....

bimg(komisja1.eps)(R...
Posła x nazwiemy kłopotliwym, jeśli zbiór (mathit Wymuszone)(x... zawiera dwóch posłów z tej samej partii (co jest niedozwolone). Na rysunku 2 (dla grafu konfliktowego z rysunku 1) poseł 1 jest kłopotliwy, natomiast poseł 2 z rysunku 3 jest niekłopotliwy.


bimg(komisja3.eps)(R...


bimg(komisja4.eps)(R...


W celu sformowania Komisji wykonujemy następujący algorytm:


Algorytm KOMISJA1;
początkowo zbiorem reprezentantów jest K=emptyset;
while |K| < n  do
begin
niech pi będzie pierwszą partią bez reprezentanta w K;
if obaj posłowie należący do pi są kłopotliwi then
nie ma rozwiązania, STOP
else
begin
wybierz pierwszego niekłopotliwego posła x in pi;
K := K cup (mathit Wymusz...
end
end
return K;
 



bimg(komisja2.eps)(R...


Zobaczmy jak działa ten algorytm na naszym przykładzie (Rys. 4). Na początku wybieramy pierwszą partię. Poseł 1 jest kłopotliwy, zatem wybieramy posła 2. (mathit Wymuszone)(2.... Zbiorem K staje się (2, 3, 5, 8, 9, 12). Następną partią bez reprezentanta jest (13, 14). Poseł 13 jest kłopotliwy, dodajemy do K zbiór (mathit Wymuszone)(1.... Otrzymujemy końcowy rezultat.


Dowód poprawności.

Algorytm wybiera reprezentanta x z pierwszej partii, a następnie tworzy K = (mathit Wymuszon.... Partie bez reprezentantów w K są, w sensie grafu konfliktowego, całkowicie niezależne od K (zobacz rysunek 4).


Własność niezależności.
Niech U = (mathit Wymuszon... i niech W będzie sumą teoriomnogościową partii, które są rozłączne z U. Jeśli x jest niekłopotliwy, to w grafie konfliktowym nie ma krawędzi między U i W.


Algorytm znajduje reprezentantów dla pozostałych partii, tak jak gdyby startował od początku. Formalnie poprawność można wykazać indukcyjnie ze względu na liczbę partii.


Zamiast umieszczać w komisji K grupy posłów możemy powiększać komisję po jednym pośle, stosując następującą wersję algorytmu KOMISJA1. Jest to wersja łatwiejsza do zaprogramowania, natomiast poprzednia wersja jest łatwiejsza z punktu widzenia poprawności. W tej wersji dostaniemy dokładnie tę samą komisję.


Oznaczmy i-tą partię przez pi_i. Powiemy, że poseł x jest zgodny ze zbiorem posłów w K, gdy x nie jest w konflikcie z żadnym z posłów w K.


Algorytm KOMISJA;
początkowo zbiorem reprezentantów jest K=emptyset;
for  i := 1   to n   do
begin
wybierz pierwszego niekłopotliwego posła x in pi_i zgodnego z K;
if nie ma takiego posła then nie ma rozwiązania, STOP;
K := K cup (x)
end
return K;
 



Algorytm Komisja zaimplementowany bezpośrednio może działać zbyt wolno. Sprawdzenie, czy poseł jest niekłopotliwy może wymagać czasu proporcjonalnego do rozmiaru grafu wymuszeń. Zatem łączny czas działania algorytmu wynosi O(ncdot (n+m)). W programie wzorcowym Komisja wybierana jest trochę sprytniej. Rozpoczynamy od znalezienia w grafie wymuszeń wszystkich silnie spójnych składowych, czyli podgrafów, w których od każdego wierzchołka można przejść do każdego innego wierzchołka idąc po strzałkach. Silnie spójne składowe można znaleźć w czasie proporcjonalnym do rozmiaru grafu (zobacz [11]). Jeśli istnieje choć jedna silnie spójna składowa zawierająca posłów z tej samej partii, to oczywiście ``spokojnej'' Komisji nie da się sformować. W przeciwnym przypadku patrzymy na graf silnie spójnych składowych - wierzchołkami są silnie silnie spójne składowe, a od składowej A prowadzi krawędź do B tylko wtedy, gdy w wyjściowym grafie istnieje krawędź od pewnego wierzchołka z A do pewnego wierzchołka z B. Następnie silnie spójne składowe sortujemy topologicznie i rozważamy je w otrzymanej kolejności. Jeśli aktualnie rozważana silnie spójna składowa nie została wcześniej odrzucona, to wybieramy wszystkich należących do niej posłów do Komisji. Dla każdego wybranego w ten sposób posła, odrzucamy silnie spójną składową, która zawiera jego partyjnego kolegę, oraz wszystkie składowe, z których ta składowa jest osiągalna. Jeśli w ten sposób wybierzemy n posłów odpowiadamy TAK, a przeciwnym razie NIE.

Testy

Zadanie testowane było na zestawie 13 danych testowych:

Testy 4a i 4b, 5a i 5b, 6a i 6b oraz 8a, 8b i 8c były zgrupowane.