diff --git a/.gitignore b/.gitignore index 99b678c..6500a3e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ *.pdf *.log *.fdb_latexmk +*.dvi diff --git a/2011.01.18.tex b/2011.01.18.tex new file mode 100644 index 0000000..22cc2a0 --- /dev/null +++ b/2011.01.18.tex @@ -0,0 +1,150 @@ +%! TEX root = main.tex + +\section{18.01.2011 kolokwium \#2} + +\task{ + \textit{Problem Optymalnego Rozkroju} (\problem{POR}) zdefiniowany jest następująco ,,Dany jest arkusz blachy o wymiarach + $d \times sz$ oraz różne wielokąty wypukłe, które należy wykroić z tego arkusza. Czy można wybrać podzbiór + tych wielokątów i tak zaplanowac to wykrajanie aby odpady blachy były zerowe?'' W oparciu o problem \textit{Sumy Podzbioru} (\problem{SP}) + udowodnij, że $\problem{POR} \in \NPC$ +} + +\solution +Tak jak w poprzednio, aby udowodnić, że problem należy do klasy \NP, powinniśmy sprawdzić czy jesteśmy w stanie sprawdzić poprawność rozwiązania +w czasie wielomianowym. Jeżeli za certyfikat przyjmiemy wielokąty w postaciu listy punktów i krawędzi to sprawdzenia można dokonać +w czasie wielomianowym - wystarczy sprawdzić, że żaden wierzchołek nie znajduje się w żadnym innym wielokącie a suma pól wielokątów +jest równa $sz \times d$. Obie te operacje są wykonywalne w czasie wielomianowym. + +W zadaniu excplicite zostało podane, że musimy zredukować problem \textit{Sumy Podzbioru} do naszego problemu \problem{POR}, i faktycznie wybór ten jest nieprzypadkowy. +Na wstępie przypomnijmy: problem \textit{Sumy Podzbioru} to pytanie ,,Czy w danym (multi)zbiorze $A$ istnieje podzbiór $B$ ($B \subseteq A$) taki, że suma elementów $B$ jest równa $n$?''. +Naszkicujmy schemat $\alpha$-redukcji dla tego problemu. + +\begin{figure}[H] + \centering + \input{gfx/sp-por.tex} + \caption{Schemat $\alpha$-redukcji z \problem{SP} do \problem{POR}, gdzie $W$ to zbiór wielokątów.} +\end{figure} + +Wyobraźmy sobie problem \problem{SP} jako problem \problem{POR} tylko w jednym wymiarze - mamy odcinki różnej długości, +pytanie brzmi czy jesteśmy z nich w stanie skonstruować odcinek o długości dokładnie $l$? + +\begin{figure}[H] + \centering + \input{gfx/por-1.tex} + \caption{W tym wypadku multizbiór $A = \{ 1, 3, 2, 5, 4, 2, 1 \}$, a poszukiwana długość $n = 6$} +\end{figure} + +Podejście takie powinno być dość intuicyjne i proste do wyprowadzenia. Aby przelożyć problem na 2 wymiary wystarczy, że +rozpatrzymy prostokąty o stałej szerokości równej szerokości blachy, i zmiennej długości. + +\begin{figure}[H] + \centering + \input{gfx/por-2.tex} + \caption{Ten sam multizbiór przedstawiony w formie problemu w 2 wymiarach.} +\end{figure} + +Dla uproszeczenia, załóżmy że nasza długość $d = 1$, w takim wypadadku aby przekstałcić zbiór $A$ musimy utworzyć prostokąty o wymiarach $a_1 \times 1$, $a_2 \times 1$, itd. +Czyli z $\alpha$-redukcji utrzymalibyśmy następujące parametry: $W = \text{wygenerowane prostokąty}$, $sz = n$, $d = 1$. Jak dowiedliśmy powyżej, takie przekształcenie zachowuje problem. +\taskend + +\task{ + Problem \textit{Ważonego Pokrycia Wierzchołkowego} (\problem{WPW}) zdefiniowany jest następująco: ,,Dany jest graf $G_w$ z obciążonymi + wierzchołkami (tj. wierzchołki mają wagi) oraz próg $p$; czy w $G_w$ istnieje pokrycie wierzchołkowe o łącznej wadze $\leq p$. + Udowodnij, że $\problem{WPW} \in \NPC$ +} + +\solution +Tak jak zwykle, zacznijmy od udowodnienia, że problem w istocie należy do klasy $\NP$. Potrzebujemy więc jakiegoś certyfikatu, który +mógłby potwierdzić, że odpowiedź na to pytanie jest poprawna - w tym wypadku oczywistym zdaje się być lista wierzchołków $V$ stanowiących to pokrycie. +Sprawdzenia czy ich suma ich wag faktycznie jest mniejsza niż $p$ jest do wykonania w czasie liniowym. Aby sprawdzić pokrycie faktycznie +pokrywa wszystkie krawędzie wystarczy przeiterować po wszystkich wierzchołkach usuwając z grafu krawędzie zawierające ten wierzchołek, co jest wykonywalne +w czasie $O(m \cdot n)$. Jeżeli po tych operacjach uzyskamy graf pusty - to odpowiedź była poprawna. + +Nie będzie zaskoczeniem, że najbliższym problemem który możemy zredukowac do \problem{WPW} będzie problem \textit{Pokrycia Wierzchołkowego} (\problem{PW}). +Problem \problem{WPW} jest w zasadzie uogólnionym problemem \problem{PW}. Na ogół redukcja problemów szczegółowych do uogólnionych jest dużo +łatwiejsza niż problemów ze sobą niepowiąznych bądź przypadku ogólnego do szczególnego. + +\begin{figure}[H] + \centering + \input{gfx/pw-wpw.tex} + \caption{Schemat $\alpha$-redukcji z problemu \problem{PW} do \problem{WPW}} +\end{figure} + +\begin{minipage}{.5\linewidth}% + \begin{figure}[H] + \centering + \input{gfx/wpw-1.tex} + \caption{Przykładowy graf nieważony $G$} + \end{figure} +\end{minipage}% +\begin{minipage}{.5\linewidth}% + \begin{figure}[H] + \centering + \input{gfx/wpw-2.tex} + \caption{Przykładowy graf ważony $G_W$} + \end{figure} +\end{minipage} +\\\\ + +Można powiedzieć, że - w pewnym sensie - w grafie nieważonym wszystkie wierzchołki są równie ważne, a w grafie ważonym niektóre są ważniejsze. +Biorąc pod uwagę to podejście aby uzyskać graf ważony z grafu nieważonego o podobnych właściwościach należy wszystkim wierzchołkom nadać te samą +wagę $w$. Przy takim podejsciu, jeżeli w grafie $G$ pokrycie stanowiło $n$ wierzchołków, to w grafie $G_W$ takie samo pokrycie będzie miało +łączną wagę $p = n \cdot w$ a $n = \frac{p}{w}$. Dla uproszczenia możemy przyjąć, że $w = 1$ i wtedy uzyskamy $p = n$. + +Przypisania wagi do wierzchołków możemy dokonać w czasie liniowym, wyliczenie $p$ jest w zasadzie darmowe. Ponieważ uzyskaliśmy, że dla tak skonstruowanego +grafu $p = n$ mamy pewność, że taka $\alpha$-redukcja zachowuje problem. +\taskend + +\task{Graf planarny jest maksymalny, gdy dodanie jakiejkolwiek krawędzi łączącej niesąsiednie wierzchołki psuje jego +planarność. \textit{Maksymalny Graf Planarny} (\textbf{MGP}) jest 3-barwny wtedy, gdy jest eulerowski.} +\subtask{Narysuj \textbf{MGP} o 5 wierzchołkach i pokoloruj go optymalnie.} +\subtask{Narysuj \textbf{MGP} o 6 wierzchołkach i pokoloruj go optymalnie.} +\subtask{Przyjmując, że \textbf{MGP} dany jest w postaci macierzy sąsiedztwa wierzchołków, naszkicuj algorytm dla +wyznaczania jego liczby chromatycznej i oszacuj jego złożonosć przy użyciu symbolu $\Theta$} + +\solution +Przypomnijmy - graf planarny to graf, w którym nie istnieją przecinające się krawędzie. Naszym zadaniem jest narysować +taki graf planarny że ma 5 lub 6 wierzchołków oraz dodanie krawędzi niszczyłoby planarność. Najprostrzym podejściem jest +narysowanie graf pustego (tj. wierzchołków tak jakbyśmy chcieli rysować wielokąt foremny) i dorysowywać kolejno: + +\begin{enumerate}[a)] + \item Cykl łączący wszystkie wierzchołki + \item W środku powstałego wielokąta łączymy niepołączone wierzchołki "zygzakiem" + \item Pozostałe wierzchołki łączymy na zewnątrz. +\end{enumerate} + +\begin{figure}[H] + \centering + \input{gfx/mgp-5.tex} + \caption{Kolejne etapy rosyowania grafu planarengo o 5 wierzchołkach} +\end{figure} + +Analogicznie możemy postąpić dla grafu o 6 wierzchołkach, uzyskując: +\begin{figure}[H] + \centering + \input{gfx/mgp-6.tex} + \caption{Kolejne etapy rosyowania grafu planarengo o 6 wierzchołkach} +\end{figure} + +\begin{shortcut} + Twierdzenie Kuratowskiego mówi nam, że graf jest planarny wtedy i tylko wtedy kiedy nie zawiera podgrafu $K_5$ + i $K_{3,3}$ (dwudzielnego 3 na 3). + + \begin{column}{.5}% + \begin{figure}[H] + \centering + \input{gfx/k3-3.tex} + \caption{Przykładowy graf nieważony $G$} + \end{figure} + \end{column}% + \begin{column}{.5}% + \begin{figure}[H] + \centering + \input{gfx/k5.tex} + \caption{Przykładowy graf ważony $G_W$} + \end{figure} + \end{column} + + Pasuje nam to idealnie do zadania, ponieważ $K_5$ ma 5 wierzchołków a $K_{3,3}$ 6. + Wystarczy zatem z $K_5$ usunąć krawędź, a z $K_{3,3}$ usunąć jedną krawędź i dodawac nowe póki jest planarny. +\end{shortcut} diff --git a/2013.01.26.tex b/2013.01.26.tex index 6207a4e..21978be 100644 --- a/2013.01.26.tex +++ b/2013.01.26.tex @@ -1,18 +1,17 @@ \section{26.01.2013 kolokwium \#2} -\task{Alicja i Bogdan wybrali się na zakupy. Przy kasie okazało się, że muszą zapłacić równo 100 zł, a kasa nie zwraca reszty. W portfelu mają: $a_1$ monet 1-złotowych, $a_2$ monet 2-złotowych i analogicznie dla nominałów 5, 10, 20, 50, gdzie $a_i \geq 0$. Zastanawiają sie, czy z posiadanych monet mogą uzbierać dokładnie 100 zł.} +\task{Alicja i Bogdan wybrali się na zakupy. Przy kasie okazało się, że muszą zapłacić równo 100 zł, a kasa nie zwraca reszty. W portfelu mają: $a_1$ monet 1-złotowych, $a_2$ monet 2-złotowych i analogicznie dla nominałów 5, 10, 20, 50, gdzie $a_i \geq 0$. Zastanawiają się, czy z posiadanych monet mogą uzbierać dokładnie 100 zł.} \subtask{Spróbuj zaprojektować algorytm wielomianowy dla tego problemu decyzyjnego} \subtask{Jeśli nie potrafisz, to spróbuj udowodnić jego NP-zupełność} \solution -Przy rozwiązywaniu tego zadania, jedną z pierwszych myśli może byc, że jest to problem zbliżony +Przy rozwiązywaniu tego zadania, jedną z pierwszych myśli może być, że jest to problem zbliżony do problemu sumy podzbioru - i jest to prawdą, jest to specyficzny wypadek problemu sumy podzbioru. -Zauważmy jednak, że do dyspozycji mamy tylko i wyłącznie 6 wartości: 1, 2, 5, 10, 20, 50 oraz, -że pojemność naszego "plecaka" jest zawsze stała i wynosi 100. Łatwo zauważyc, że istnieją bardzo -proste przypadki, które rozwiązują nasz problem. Przykładowo, jeżeli mamy 2 bankonoty 50zł to -jesteśmy w stanie zapłacić 100zł bez problemu, tak samo mają 5 banknotów 20zł czy nawet 100 złotówek. +Zauważmy jednak, że do dyspozycji mamy tylko i wyłącznie 6 wartości: 1, 2, 5, 10, 20, 50 oraz, że $n$ jest stałe i wynosi $100$. +Łatwo zauważyć, że istnieją bardzo proste przypadki, które rozwiązują nasz problem. Przykładowo, jeżeli mamy 2 bankonoty 50zł to +jesteśmy w stanie zapłacić 100zł bez problemu, tak samo mając 5 banknotów 20zł czy nawet 100 złotówek. \begin{table}[H] \begin{tabular}{rrrrrr} @@ -27,19 +26,31 @@ jesteśmy w stanie zapłacić 100zł bez problemu, tak samo mają 5 banknotów 2 \caption{Możliwe kombinacje tworzące 100zł} \end{table} -Stąd wynika, że istnieje jedynie skończona ilość kombinacji którymi możemy utworzyć 100zł - wystarczy zatem sprawdzić je wszystkie, a to można wykonac zawsze w tym samym czasie - uzyskany algorytm jest $O(1)$. +Stąd wynika, że istnieje jedynie skończona ilość kombinacji, którymi możemy utworzyć 100zł. Wystarczy zatem sprawdzić +je wszystkie, a to można wykonac zawsze w tym samym czasie - uzyskany algorytm jest $O(1)$. +\taskend -\task{Ty masz graf 100-wierzchołkowy $G$ zapisany w postaci macierzy sąsiedztwa $A(G)$ i bardzo Ci zależy na tym aby stwierdzić, czy $G$ zawiera klikę $K_{10}$ lub większą. Ja mam program, który rozwiązuje Twój problem, ale tylko wtedy kiedy na wejście poda się mu macierz sąsiedztwa grafu niehamiltonowskiego. Jak przerobisz macierz $A(G)$ byś mógł skorzystać z mojego programu? Zaprojektuj taki program i oszacuj jego złożoność.} +\task{ + Ty masz graf 100-wierzchołkowy $G$ zapisany w postaci macierzy sąsiedztwa $A(G)$ i bardzo Ci zależy na tym, + aby stwierdzić, czy $G$ zawiera klikę $K_{10}$ lub większą. Ja mam program, który rozwiązuje Twój problem, ale tylko + wtedy kiedy na wejście poda się mu macierz sąsiedztwa grafu niehamiltonowskiego. Jak przerobisz macierz $A(G)$ + byś mógł skorzystać z mojego programu? Zaprojektuj taki program i oszacuj jego złożoność. +} \solution -Nasz graf $G$ może być w zasadzie dowolnym grafem 100-wierzchołkowym, nie wiemy nic o tym czy jest hamiltonowski czy nie. -Do dyspozycji mamy program, który jest w stanie odpowiedzieć na nasze pytanie, ale tylko jeżeli graf \textbf{nie} jest hamiltonowski. Potrzebujemy zatem sposobu na przetworzenie naszego grafu $G$ tak, aby nie miał szans byc hamiltonowski - jednak to przekształcenie nie może wpływać na odpowiedź na nasze pytanie. +Nasz graf $G$ może być w zasadzie dowolnym grafem 100-wierzchołkowym, w szczególności nie wiemy nic o tym czy jest +hamiltonowski czy nie. Do dyspozycji mamy program, który jest w stanie odpowiedzieć na nasze pytanie, +ale tylko jeżeli graf \textbf{nie} jest hamiltonowski. Potrzebujemy zatem sposobu na przetworzenie naszego grafu $G$ tak, +aby nie miał szans być hamiltonowski - jednak to przekształcenie nie może wpływać na odpowiedź na nasze pytanie. Na wstępie przypomnijmy, że graf hamiltonowski to taki, w którym istnieje cykl pozwalający przejść po -wszystkich wierzchołkach dokładnie raz. Co znaczy, że każdy graf hamiltonowski musi być przedewszystkim grafem spójnym. -Co za tym idzie, jeżeli przekształcimy nasz graf G w taki sposób, że nie będzie spójny to będziemy mieli pewność że nie będzie hamiltonowski. +wszystkich wierzchołkach dokładnie raz. Co znaczy, że każdy graf hamiltonowski musi być przede wszystkim grafem spójnym. +Co za tym idzie, jeżeli przekształcimy nasz graf G w taki sposób, że nie będzie spójny to będziemy mieli pewność, +że nie będzie hamiltonowski. -Nie możemy usuwać ani dodawać krawędzi między wierzchołkami naszego grafu $G$ ponieważ mogłoby to wpłynąć na istnienie w nim kliki - najprostszym rozwiązaniem będzie więc dodanie zupełnie nowego wierzchołka, nazwijmy go $v_{101}$, który nie jest połączony z żadnym innym. +Nie możemy usuwać ani dodawać krawędzi między wierzchołkami naszego grafu $G$, ponieważ mogłoby to wpłynąć na istnienie +w nim kliki - najprostszym rozwiązaniem będzie więc dodanie zupełnie nowego wierzchołka, nazwijmy go $v_{101}$, +który nie jest połączony z żadnym innym. \begin{figure}[H] \centering @@ -47,43 +58,82 @@ Nie możemy usuwać ani dodawać krawędzi między wierzchołkami naszego grafu \caption{Transformacja w graf niehamiltonowski} \end{figure} -Dodanie jednego swobodnego wierzchołka nie wpłynie na istnienie kliki $K_{10}$ bądź większej ponieważ jeden wierzchołek nie wystarczy na utworzenie kliki a nie dodajemy żadnych krawedzi, które mogłyby doprowadzic do tego, że klika nagle powstała. +Dodanie jednego swobodnego wierzchołka nie wpłynie na istnienie kliki $K_{10}$ bądź większej ponieważ jeden wierzchołek +nie wystarczy na utworzenie kliki, a nie dodajemy żadnych krawedzi, które mogłyby doprowadzić do tego, że klika nagle powstała. -Innym możliwym rozwiązaniem jest dodanie wierzchołka połączonego z tylko jednym wierzchołkiem - jedyny sposób aby się do niego dostać będzie przez 1 wierzchołek, a żeby przejść dalej będziemy musieli się cofnąć do wierzchołka, w którym już byliśmy. +Innym możliwym rozwiązaniem jest dodanie wierzchołka połączonego z tylko jednym wierzchołkiem - jedyny sposób aby się +do niego dostać będzie przez 1 wierzchołek, a żeby przejść dalej będziemy musieli się cofnąć do wierzchołka, w którym już byliśmy. -Jeżeli zaś chodzi o złożoność, to ważnym jest, że graf jest podany w formie macierzy sąsiedstwa, czyli aby dodać wierzchołek musimy do macierzy dodać 1 wiersz i 1 kolumnę - czyli w zasadzie utworzyć nową macierz. Operacja ta wymaga utworzenia $(n+1) \times (n+1)$ komórek, czyli teoretycznie jej złożoność to $O(n^2)$ jednak biorąc pod uwagę, że dla grafu $G$ z definicji $n = 100$ możemy powiedzieć, że operacja ta dla każdego takiego grafu G jest do wykonania w czasie stałym, czyli $O(1)$ - obie odpowiedzi będą poprawne. +Jeżeli zaś chodzi o złożoność, to ważnym jest, że graf jest podany w formie macierzy sąsiedztwa, czyli aby dodać +wierzchołek musimy do macierzy dodać 1 wiersz i 1 kolumnę - czyli w zasadzie utworzyć nową macierz. Operacja ta wymaga +utworzenia $(n+1) \times (n+1)$ komórek, czyli teoretycznie jej złożoność to $O(n^2)$ jednak biorąc pod uwagę, że dla +grafu $G$ z definicji $n = 100$ możemy powiedzieć, że operacja ta dla każdego takiego grafu G jest do wykonania w czasie +stałym, czyli $O(1)$ - obie odpowiedzi będą poprawne. +\taskend -\task{\textit{OGRANICZONY PROBLEM KLIKI} - \texttt{OPK} - zdefiniowany jest następująco: ``Dany jest graf $G$ i liczby naturalne $a$, $b$ takie, że $a \leq b$, czy w $G$ istnieje klika o rozmiarze $r$ taka, że $a \leq r \leq b$?,,. Pokaż, że:} +\task{\textit{OGRANICZONY PROBLEM KLIKI} - \texttt{OPK} - zdefiniowany jest następująco: ``Dany jest graf $G$ i liczby +naturalne $a$, $b$ takie, że $a \leq b$, czy w $G$ istnieje klika o rozmiarze $r$ taka, że $a \leq r \leq b$?,,. Pokaż, że:} \subtask{$\mathtt{OPK} \in \mathtt{NP}$} \subtask{$\mathtt{OPK} \in \mathtt{NPC}$} \solution -Aby udowodnić, że dany problem należy do klasy \NP należy zrobić jedną z dwóch rzeczy - przedstawić niedeterministyczny algorytm rozwiązujący ten problem w czasie wielomianowym, bądź zaprezentować wielomianowy algorytm sprawdzający rozwiązanie tego problemu. Moim zdaniem, podejście drugie jest o wiele łatwiejsze i przyjemniejsze - zatem to właśnie je zaprezentuję. +Aby udowodnić, że dany problem należy do klasy \NP należy zrobić jedną z dwóch rzeczy - przedstawić niedeterministyczny +algorytm rozwiązujący ten problem w czasie wielomianowym, bądź zaprezentować wielomianowy algorytm sprawdzający +rozwiązanie tego problemu. Moim zdaniem, podejście drugie jest o wiele łatwiejsze i przyjemniejsze - zatem to właśnie +je zaprezentuję i będę wykorzystywał. -Aby sprawdzić rozwiązanie, potrzebujemy więcej informacji niż proste \textbf{tak} lub \textbf{nie} - taką dodatkową informację nazywamy \textit{certyfikatem}, przykładowo w wypadku pytania, czy liczba $n$ jest złożona, certyfikatem mogą byc dwie liczby $p$ i $q$ takie, że $n = p \cdot q$ - mając taki certyfikat łatwo jest potwierdzić, że faktycznie liczba jest złożona. +Aby sprawdzić rozwiązanie, potrzebujemy więcej informacji niż proste \textbf{tak} lub \textbf{nie} - taką dodatkową +informację nazywamy \textit{certyfikatem}, przykładowo w wypadku pytania, czy liczba $n$ jest złożona, certyfikatem mogą +być dwie liczby $p$ i $q$ takie, że $n = p \cdot q$ - mając taki certyfikat łatwo jest potwierdzić, że faktycznie +liczba jest złożona. -W naszym wypadku certyfikatem może być lista wierzchołków tworząca klikę $K_n$. Określenie $r$ będzie wymagało sprawdzenia długosci listy, co z pewnością można wykonać w czasie wielomianowym, a sprawdzenie czy wierzchołki tworzą klikę będzie wymagało sprawdzenia czy faktycznie każdy wierzchołek sąsiaduje z każdym innym wierzchołkiem z listy - co tez można wykonać w czasie wielomianowym. Stąd wynika, że problem należy do klasy \NP +W naszym wypadku certyfikatem może być lista wierzchołków tworząca klikę $K_n$. Określenie $r$ będzie wymagało +sprawdzenia długości listy, co z pewnością można wykonać w czasie wielomianowym, a sprawdzenie czy wierzchołki tworzą +klikę będzie wymagało sprawdzenia czy faktycznie każdy wierzchołek sąsiaduje z każdym innym wierzchołkiem z listy - co +też można wykonać w czasie wielomianowym. Stąd wynika, że problem należy do klasy \NP. -Dowód, że problem należy do \NPC jest trochę trudniejszy do przeprowadzenia - należy mianowicie wykonać $\alpha$-redukcję jakiegoś problemu, który wiemy że jest \NPC do problemu, który badamy. Naturalnym kandydatem tutaj wydaje się być problem kliki: +Dowód, że problem należy do \NPC jest trochę trudniejszy do przeprowadzenia - należy mianowicie wykonać +$\alpha$-redukcję jakiegoś problemu, który wiemy że jest \NPC do problemu, który badamy. Naturalnym kandydatem tutaj +wydaje się być problem kliki: ``Czy w grafie $G$ istnieje klika wielkości $n$?,, \begin{figure}[H] \centering \input{./gfx/klika-opk.tex} - \caption{schemat $\alpha$-redukcji kliki do OPK} + \caption{schemat $\alpha$-redukcji \problem{kliki} do \problem{OPK}} \end{figure} -Aby dokonac $\alpha$-redukcji musimy w wielomianowym czasie na podstawie danych $G, n$ znaleźć takie $G_1, a, b$ aby rozwiązując problem \texttt{OPK} uzyskac odpowiedź na problem kliki. Wiemy, że \texttt{OPK} zwróci nam prawdę jeżeli w grafie $G_1$ będzie klika o rozmiarze $r$ takim, że $a \leq r \leq b$. Jeżeli chcemy znaleźć klikę konkretnego rozmiaru, wystarczy zauważyć, że jeżeli $a = b \land A \leq r \leq b$ to $a = b = r$. Nasza $\alpha$-redukcja mogłaby zatem wyglądać następująco: $G_1 = G, a = n, b = n$. Co z pewnością możemy dokonać w czasie wielomianowym. Fakt, że takie podstawienie zachowuje problem udowodniliśmy już powyżej. +Aby dokonać $\alpha$-redukcji musimy w wielomianowym czasie na podstawie danych $G, n$ znaleźć takie $G_1, a, b$ aby +rozwiązując problem \problem{OPK} uzyskać odpowiedź na problem kliki. Wiemy, że \problem{OPK} zwróci nam prawdę jeżeli +w grafie $G_1$ będzie klika o rozmiarze $r$ takim, że $a \leq r \leq b$. Jeżeli chcemy znaleźć klikę konkretnego +rozmiaru, wystarczy zauważyć, że jeżeli $a = b \land A \leq r \leq b$ to $a = b = r$. Nasza $\alpha$-redukcja mogłaby +zatem wyglądać następująco: $G_1 = G, a = n, b = n$. Co z pewnością możemy dokonać w czasie wielomianowym. Fakt, że +takie podstawienie zachowuje problem udowodniliśmy już powyżej. +\taskend -\task{\textit{Problem zanurzenia} (\problem{PZ}) grafu w innym grafie zdefiniowany jest następująco. Dane są dwa grafy: $(G, H)$, gdzie $G$ jest \textit{gościem} a $H$ - \textit{gospodarzem}. Czy istnieje takie odwzorowanie wierzchołków $f: V(G) \to V(H)$, że każdej krawędzi $\{u, v\} \in G$ odpowiada krawędź $\{f(u), f(v)\} \in H$? Pokaż, że PZ jest problemem NP-zupełnym.} +\task{\textit{Problem zanurzenia} (\problem{PZ}) grafu w innym grafie zdefiniowany jest następująco. Dane są dwa grafy: +$(G, H)$, gdzie $G$ jest \textit{gościem} a $H$ - \textit{gospodarzem}. Czy istnieje takie odwzorowanie wierzchołków +$f: V(G) \to V(H)$, że każdej krawędzi $\{u, v\} \in G$ odpowiada krawędź $\{f(u), f(v)\} \in H$? Pokaż, że PZ jest +problemem NP-zupełnym.} \solution -Przed dowiedzeniem, że problem jest \NPC najpierw musimy udowodnić, że w ogóle znajduje się w klasie \NP. Po raz kolejny wykorzystamy tutaj podejscie z certyfikatem, w tym wypadku będzie nim funkcja $f$. Nie rozważamy tutaj tego jak trudno jest wyliczyć na komputerze wynik działania funkcji $f$, zatem zakłdamy, że $f = O(1)$. Przetworzenie wszystkich krawędzi mozna zatem wykonać w czasie $O(m(G))$, aby sprawdzić czy krawędź istnieje w grafie $H$ w najgorszym wypadku musimy przejrzeć wszystkie krawędzie - co daje nam czas $O(m(H))$, ponieważ dla każdej przetworzonej krawędzi w $G$ musimy sprawdzić jej istnienie w $H$ to w najgorszym wypadku uzyskamy czas $O(m(H) \cdot m(G))$ - czyli wielomianowy. +Przed dowiedzeniem, że problem jest \NPC najpierw musimy udowodnić, że w ogóle znajduje się w klasie \NP. Po raz +kolejny wykorzystamy tutaj podejście z certyfikatem, w tym wypadku będzie nim funkcja $f$. Nie rozważamy tutaj tego +jak trudno jest wyliczyć na komputerze wynik działania funkcji $f$, zatem zakładamy, że $f = O(1)$. Przetworzenie +wszystkich krawędzi można zatem wykonać w czasie $O(m(G))$. Aby sprawdzić czy krawędź istnieje w grafie $H$ w +najgorszym wypadku musimy przejrzeć wszystkie krawędzie - co daje nam czas $O(m(H))$, ponieważ dla każdej przetworzonej +krawędzi w $G$ musimy sprawdzić jej istnienie w $H$ to w najgorszym wypadku uzyskamy czas +$O(m(H) \cdot m(G))$ - czyli wielomianowy. -Aby udowodnić, że \problem{PZ} jest \NPC musimy znaleźć $\alpha$-redukcje jakiegoś innego, najlepiej zbliżonego problemu do \problem{PZ}. Na początek zauważmy, że $f$ musi być funkcją różnowartościową, ponieważ gdyby nie była, to istniałyby takie $u_1 \neq u_2$, że $f(u_1) = f(u_2) = v$, co dawałoby nieistniejącą krawędź $\{ v, v \}$ (tj. wierzchołek byłby połączony z samym sobą). -Gdybyśmy natomiast rozpatrywali grafy, mogące zawierać takie pętle własne, to problem dla takich grafów oraz funkcji nieróżnowartościowej stawałby się trywialny wystarczyłoby zmapować wszystkie wierzchołki na ten jeden z pętlą własną i taka funkcja istniałaby zawsze. +Aby udowodnić, że \problem{PZ} jest \NPC musimy znaleźć $\alpha$-redukcje jakiegoś innego, najlepiej zbliżonego +problemu do \problem{PZ}. Na początek zauważmy, że $f$ musi być funkcją różnowartościową, ponieważ gdyby nie była, to +istniałyby takie $u_1 \neq u_2$, że $f(u_1) = f(u_2) = v$, co dawałoby nieistniejącą krawędź $\{ v, v \}$ +(tj. wierzchołek byłby połączony z samym sobą). Gdybyśmy natomiast rozpatrywali grafy mogące zawierać takie pętle +własne, to problem dla takich grafów oraz funkcji nieróżnowartościowej stawałby się trywialny - wystarczyłoby zmapować +wszystkie wierzchołki na ten jeden z pętlą własną i taka funkcja istniałaby zawsze. -Z tego, że $f$ jest różnowartościowa wynika, że jeżeli wierzchołek w grafie G $\deg u = \delta$ to w grafie H $\deg f(u) \geq \delta$. Można to zaobserwować na rysunku poniżej. +Z tego, że $f$ jest różnowartościowa wynika, że jeżeli wierzchołek w grafie G $\deg u = \delta$ to w grafie H +$\deg f(u) \geq \delta$. Można to zaobserwować na rysunku poniżej. \begin{figure}[H] \centering @@ -91,7 +141,9 @@ Z tego, że $f$ jest różnowartościowa wynika, że jeżeli wierzchołek w graf \caption{Powiązane wierzchołki mają ten sam kolor w obu grafach.} \end{figure} -Biorąc pod uwagę ten tok rozumowania, możemy zauważyć że problem ten jest nam w stanie łatwo odpowiedzieć czy w danym grafie $H$ występuje podgraf $G$. Znanym problemem \NPC, który wymaga sprawdzenia obecności danego podgrafu w innym grafie jest oczywiście problem kliki. +Biorąc pod uwagę ten tok rozumowania, możemy zauważyć że problem ten jest nam w stanie łatwo odpowiedzieć czy w danym +grafie $H$ występuje podgraf $G$. Znanym problemem \NPC, który wymaga sprawdzenia obecności danego podgrafu w innym +grafie jest oczywiście problem kliki. \begin{figure}[H] \centering @@ -99,12 +151,18 @@ Biorąc pod uwagę ten tok rozumowania, możemy zauważyć że problem ten jest \caption{schemat $\alpha$-redukcji kliki do PZ} \end{figure} -$\alpha$-redukcja polega na sprawdzeniu czy graf pełny $K_n$ jest podgrafem grafu $G_0$, czyli dla problemu \problem{PZ} otrzymalibyśmy tak skontruowane dane wejściowe: +$\alpha$-redukcja polega na sprawdzeniu czy graf pełny $K_n$ jest podgrafem grafu $G_0$, czyli dla problemu \problem{PZ} +otrzymalibyśmy tak skonstruowane dane wejściowe: $G = K_n, H = G_0$. -Problem jest zachowany ponieważ jeżeli w grafie $G_0$ występuje klika o rozmiarze $n$ to możemy każdemu wierzchołkowi kliki znalezionej w $G_0$ przypisać unikalny wierzchołek w $K_n$. W drugą stronę analogicznie, Jeżeli istnieje takie przypisanie to w grafie $G_0$ musi znajdować się klika $K_n$. +Problem jest zachowany ponieważ jeżeli w grafie $G_0$ występuje klika o rozmiarze $n$ to możemy każdemu wierzchołkowi +kliki znalezionej w $G_0$ przypisać unikalny wierzchołek w $K_n$. W drugą stronę analogicznie, jeżeli istnieje takie +przypisanie to w grafie $G_0$ musi znajdować się klika $K_n$. +\taskend -\task{Przedyskutuj złożoność obliczeniową następujących problemów decyzyjnych, zakładając, że $G$ jest kubiczny (tj. 3-regularny) i zapamiętany jest w postaci list sąsiedztwa. Ponadto, jeżeli odpowiedź jest oczywista napisz czy brzmi ona \textbf{tak} lub \textbf{nie}.} +\task{Przedyskutuj złożoność obliczeniową następujących problemów decyzyjnych, zakładając, że $G$ jest kubiczny +(tj. 3-regularny) i zapamiętany jest w postaci list sąsiedztwa. Ponadto, jeżeli odpowiedź jest oczywista napisz czy +brzmi ona \textbf{tak} lub \textbf{nie}.} \begin{minipage}{.5\linewidth} \subtask{$\chi(X) \leq 1$} @@ -119,29 +177,38 @@ Problem jest zachowany ponieważ jeżeli w grafie $G_0$ występuje klika o rozmi \subtask{$\chi(X) \geq 4$} \end{minipage}% \\ -\tip{Skorzystaj z twierdzenia Brooksa, które mówi, że $\chi(G) \leq \Delta$ za wyjątkiem $G = C_{2k-1}$ (czyli będącego cyklem nieparzystym i $G = K_n$)} +\tip{Skorzystaj z twierdzenia Brooksa, które mówi, że $\chi(G) \leq \Delta$ za wyjątkiem +$G = C_{2k-1}$ (czyli będącego cyklem nieparzystym i $G = K_n$)} \solution -Problem dotyczy liczby chromatycznej grafu - $\chi(G)$ - czyli minimalnej liczby kolorów potrzebnej do poprawnego pokolorowania grafu. Graf można pokolorować 1 kolorem $\chi(G) = 1$, tylko wtedy kiedy nie ma on krawędzi, a tym wypadku wiemy, że graf jest 3-regularny czyli dla każdego wierczhołka $v \in G$ wiemy, że jest połączony z 3 innymi wierzchołkami - stąd możemy wywnioskować, że dla tego typu grafów $\chi(G) \geq 2$. +Problem dotyczy liczby chromatycznej grafu - $\chi(G)$ - czyli minimalnej liczby kolorów potrzebnej do poprawnego +pokolorowania grafu. Graf można pokolorować 1 kolorem $\chi(G) = 1$, tylko wtedy kiedy nie ma on krawędzi, a tym wypadku +wiemy, że graf jest 3-regularny czyli dla każdego wierzhołka $v \in G$ wiemy, że jest połączony z 3 innymi +wierzchołkami - stąd możemy wywnioskować, że dla tego typu grafów $\chi(G) \geq 2$. -Dodatkowo wiemy, że każdy graf dwudzielny można pokolorować za pomocą dokładnie 2 kolorów ponieważ zawiera 2 grupy niepołączonych ze sobą wierzchołków - a sprawdzenie dwudzielnosci grafu można osiągnąć za pomocą BFS-a lub DFS-a, czyli w złożoności $O(m+ n)$. +Dodatkowo wiemy, że każdy graf dwudzielny można pokolorować za pomocą dokładnie 2 kolorów ponieważ zawiera 2 grupy n +iepołączonych ze sobą wierzchołków - a sprawdzenie dwudzielnosci grafu można osiągnąć za pomocą BFS-a lub DFS-a, czyli w złożoności $O(m+ n)$. -Z wskazówki znamy twierdzenie Brooksa - $\chi(G) \leq \Delta$, w naszym wypadku z 3-regularnosci oczywistym jest, że $\Delta = 3$, czyli $\chi(G) \leq 3$, \textbf{CHYBA, że} graf jest nieparzystym cyklem - co możemy wyeliminować ponieważ cykl nie jest 3-regularny, lub $G = K_4$, gdzyż klika rozmiaru 4 jest 3-regularna (Ogólnie kliki rozmiaru $n$ są $(n - 1)$-regularne) i tylko w tym jednym wypadku będziemy potrzebować 4 kolorów, ale nigdy więcej. +Z wskazówki znamy twierdzenie Brooksa - $\chi(G) \leq \Delta$, w naszym wypadku z 3-regularności oczywistym jest, że +$\Delta = 3$, czyli $\chi(G) \leq 3$, \textbf{CHYBA, że} graf jest nieparzystym cyklem - co możemy wyeliminować ponieważ +cykl nie jest 3-regularny, lub $G = K_4$, gdzyż klika rozmiaru 4 jest 3-regularna (Ogólnie kliki rozmiaru $n$ +są $(n - 1)$-regularne) i tylko w tym jednym wypadku będziemy potrzebować 4 kolorów, ale nigdy więcej. Zatem podsumowując odpowiedzi: \begin{enumerate}[a)] \item $\chi(X) \leq 1$ - \textbf{NIE} - \item $\chi(X) \leq 2$ - sprawdzenie dwudzielnosci - $O(n + m)$ + \item $\chi(X) \leq 2$ - sprawdzenie dwudzielności - $O(n + m)$ \item $\chi(X) \leq 3$ - sprawdzenie czy $G \neq K_4$ - $O(1)$ \item $\chi(X) \leq 4$ - \textbf{TAK} \item $\chi(X) \geq 1$ - \textbf{TAK} - zawsze potrzebny jest minimum 1 kolor \item $\chi(X) \geq 2$ - \textbf{TAK} - minimalna liczba potrzebnych kolorów dla takiego grafu to 2 - \item $\chi(X) \geq 3$ - jeżeli graf nie jest dwudzieolny - to na pewno potrzebuje minimum 3 kolorów - $O(n+m)$ + \item $\chi(X) \geq 3$ - jeżeli graf nie jest dwudzielny - to na pewno potrzebuje minimum 3 kolorów - $O(n+m)$ \item $\chi(X) \geq 4$ - graf potrzebuje 4 kolorów tylko, gdy jest kliką $K_4$ - $O(1)$. \end{enumerate} -\task{\NP-trudny problem \textit{Maximum Acyclic Subgraph} (\problem{MAS}) pyta o maksymalny zbiór łuków digrafu $D$, który generuje digraf acykliczny. Porblem ten ma prosty algorym 2-aproksymacyjny, który polega na podzieleniu $D$ na dwa podgrafy.} +\task{\NP-trudny problem \textit{Maximum Acyclic Subgraph} (\problem{MAS}) pyta o maksymalny zbiór łuków digrafu $D$, +który generuje digraf acykliczny. Problem ten ma prosty algorym 2-aproksymacyjny, który polega na podzieleniu $D$ na dwa podgrafy.} \subtask{udowodnij 2-aproksymowalność tego algorytmu} \subtask{udowodnij nie wprost, że jeżeli $\mathtt{P} \neq \mathtt{NP}$ to dla \problem{MAS} nie ma schamatu FPTAS} @@ -150,7 +217,8 @@ Zatem podsumowując odpowiedzi: \ctip{Jaki digraf definiuje górna/dolna macierz trójkątna macierzy $A$?} \solution -Na wstępie - zadanie słabo opisuje problem i więcej informacji można wyciągnąć z nazwy problemu po angielsku niż jego opisu. W problemie chodzi o znalezienie najwiekszego podgrafu acyklicznego w digrafie $D$. +Na wstępie - zadanie słabo opisuje problem i więcej informacji można wyciągnąć z nazwy problemu po angielsku niż jego opisu. +W problemie chodzi o znalezienie największego podgrafu acyklicznego w digrafie $D$. \begin{figure}[H] \begin{minipage}{.5\linewidth}% \centering @@ -167,10 +235,11 @@ Na wstępie - zadanie słabo opisuje problem i więcej informacji można wyciąg \end{bmatrix} \end{equation*} \end{minipage}% - \caption{Przykładowy digraf $D$ wraz z maksymalnym podgrafem acyklicznym oraz macierzą sąsiedstwa.} + \caption{Przykładowy digraf $D$ wraz z maksymalnym podgrafem acyklicznym oraz macierzą sąsiedztwa.} \end{figure} -Z zadania wiemy, że algorytm dzieli digraf $D$ na dwie części, na postawie wskazówki \#1 możemy się domyślac, że ma to coś wspólnego z macierzami trójkątnymi macierzy $A_D$. Zobaczmy, co te macierze reprezentują: +Z zadania wiemy, że algorytm dzieli digraf $D$ na dwie części, na podstawie wskazówki \#1 możemy się domyślać, że ma to +coś wspólnego z macierzami trójkątnymi macierzy $A_D$. Zobaczmy, co te macierze reprezentują: \begin{figure}[H] \begin{minipage}{.5\linewidth}% \centering @@ -209,12 +278,23 @@ Z zadania wiemy, że algorytm dzieli digraf $D$ na dwie części, na postawie ws \caption{Graf opisany przez macierz trójkątną dolną macierzy $A_D$} \end{figure} -Jak widać górna macierz trójkątna opisuje tylko takie krawędzie (łuki) $(u_1, u_2)$ że $u_1 < u_2$, czyli nie może wystąpić cykl ponieważ to wymagałoby powrotu do wierzchołka, który już rozpatrywaliśmy - a to jest niemożliwe w takiej macierzy. W macierzy dolnej sytuacja jest analogiczna, z tym że zachodzi warunek $u_1 > u_2$. +Jak widać górna macierz trójkątna opisuje tylko takie krawędzie (łuki) $(u_1, u_2)$ że $u_1 < u_2$, czyli nie może +wystąpić cykl ponieważ to wymagałoby powrotu do wierzchołka, który już rozpatrywaliśmy - a to jest niemożliwe w takiej +macierzy. W macierzy dolnej sytuacja jest analogiczna, z tym że zachodzi warunek $u_1 > u_2$. Rozwiązanie takie gwarantuje brak cyklu, jednak nie jest dokładne, zastanówmy się więc jaki może być najgorszy przypadek. -Biorąc pod uwagę, że bierzemy połowę grafu możemy być pewni, że algorytm nie pomyli się bardziej niź 2 krotnie, ponieważ w najgorszym wypadku cały graf jest już acykliczny, a my bierzemy jego połowę. Nie mamy jednak pewnosci co do tego, czy faktycznie może istnieć acykliczny graf dokładnie 2 krotnie większy od swojej połówki i prawdopodobnie na tym można skończyć dowód, jednak udowodnijmy że faktycznie istnieje taki przypadek w którym algorytm zwróci dokładnie 2-przybliżony. +Biorąc pod uwagę, że bierzemy połowę grafu możemy być pewni, że algorytm nie pomyli się bardziej niż 2-krotnie, ponieważ +w najgorszym wypadku cały graf jest już acykliczny, a my bierzemy jego połowę. Nie mamy jednak pewności co do tego, +czy faktycznie może istnieć acykliczny graf dokładnie 2 krotnie większy od swojej połówki i prawdopodobnie na tym można +skończyć dowód, jednak udowodnijmy że faktycznie istnieje taki przypadek w którym algorytm zwróci dokładnie +2-przybliżony. -Aby uzyskać taki graf w dolnej i górnej macierzy trójkątnej musimy mieć dokłądnie taką samą ilosć krawędzi, a ponad to graf musi pozostać acykliczny. Nie jesteśmy w stanie stworzyć grafu o 2 wierzchołkach, który spełniałby ten warunek, ponieważ albo algorytm zwróci odpowiedź dokładną, albo graf będzie cykliczny tj. wierzchołek 1 będzie połączony z 2 oraz 2 z 1.Jesteśmy w stanie skonstruować jednak taki graw 3 wierzchołkowy, poniewaz wystarczy że będziemy mieli dokładnie połączenie wierzchołka "mniejszego" z "większym" oraz dokładnie jedno "większego" z "mniejszym" przy czym jedynym ograniczeniem jest to, że nie mogą to być te same wierzchołki. +Aby uzyskać taki graf w dolnej i górnej macierzy trójkątnej musimy mieć dokładnie taką samą ilość krawędzi, a ponadto +graf musi pozostać acykliczny. Nie jesteśmy w stanie stworzyć grafu o 2 wierzchołkach, który spełniałby ten warunek, +ponieważ albo algorytm zwróci odpowiedź dokładną, albo graf będzie cykliczny tj. wierzchołek 1 będzie połączony z 2 oraz +2 z 1. Jesteśmy w stanie skonstruować jednak taki graf 3 wierzchołkowy, ponieważ wystarczy że będziemy mieli dokładnie +jedno połączenie wierzchołka "mniejszego" z "większym" oraz dokładnie jedno "większego" z "mniejszym" przy czym jedynym +ograniczeniem jest to, że nie mogą to być te same wierzchołki. \begin{figure}[H] \begin{minipage}{.5\linewidth}% @@ -233,11 +313,18 @@ Aby uzyskać taki graf w dolnej i górnej macierzy trójkątnej musimy mieć dok \caption{Graf opisany przez macierz trójkątną dolną macierzy $A_D$} \end{figure} -W tym wypadku digraf $D$ jest acykliczny, jednak algorytm będzie w stanie znaleźć tylko pograf $\{ (1, 2) \}$ lub $\{ (1, 3) \}$, czyli zwróci 2-krotnie za mały wynik. +W tym wypadku digraf $D$ jest acykliczny, jednak algorytm będzie w stanie znaleźć tylko podgraf $\{ (1, 2) \}$ +lub $\{ (1, 3) \}$, czyli zwróci 2-krotnie za mały wynik. -Istnienie schematu (F)PTAS mówi nam, że jesteśmy w stanie znaleźć wielomianowy algorytm o dowolnie dobrym przybliżeniu, tj. algorytm $(1 + \varepsilon)$-aproksymacyjny, gdzie $\varepsilon > 0$. Znalezienie takiego schematu jest trudne i jak mniemam wykraczające poza obszar przedmiotu a na pewno kolokwium, jednak stosunkowo prosto udowodnić, że taki schemat nie może istnieć. Wystarczy udowodnić, że dla każdych możliwych danych wejściowych istnieje taki epsilon, że z odpowiedzi przybliżonej jesteśmy w stanie ze 100\% pewnością wywnioskowac odpowiedź dokładną - a to znaczyłoby, że posiadamy wielomianowy algorytm rozwiązujący dany problem \NP-trudny dokładnie, co znaczyłoby, że $\P = \NP$ +Istnienie schematu (F)PTAS mówi nam, że jesteśmy w stanie znaleźć wielomianowy algorytm o dowolnie dobrym przybliżeniu, +tj. algorytm $(1 + \varepsilon)$-aproksymacyjny, gdzie $\varepsilon > 0$. Znalezienie takiego schematu jest trudne i jak +mniemam wykraczające poza obszar przedmiotu a na pewno kolokwium, jednak stosunkowo prosto udowodnić, że taki schemat +nie może istnieć. Wystarczy udowodnić, że dla każdych możliwych danych wejściowych istnieje taki epsilon, że z +odpowiedzi przybliżonej jesteśmy w stanie ze 100\% pewnością wywnioskować odpowiedź dokładną - a to znaczyłoby, że +posiadamy wielomianowy algorytm rozwiązujący dany problem \NP-trudny dokładnie, co znaczyłoby, że $\P = \NP$ -W tym wypadku rozważamy problem maksymalizacyjny, czyli wiemy że odpowiedź dokładna $N_\text{opt}$ jest większa bądź równa od odpowiedzi naszego algorytmu $N$: +W tym wypadku rozważamy problem maksymalizacyjny, czyli wiemy że odpowiedź dokładna $N_\text{opt}$ jest większa bądź +równa od odpowiedzi naszego algorytmu $N$: \begin{equation} N_{\text{opt}} \geq N \end{equation} @@ -254,7 +341,7 @@ Co za tym idzie, z definicji przybliżalności wynika, że: \end{equation} ponieważ wiemy, że liczba krawędzi w grafie jest zawsze liczbą naturalną ($N_\text{opt} \in \mathbb{N}$ oraz $N \in \mathbb{N}$), -wystarczy że w nierównośco \ref{eqn:2013:fptas} będzie spełniony warunek +wystarczy że w nierówności \ref{eqn:2013:fptas} będzie spełniony warunek \begin{equation} \label{eqn:2013:fptas-condition} @@ -283,3 +370,4 @@ Jeżeli teraz przedzielimy obie strony nierówności przez $m + 1$ uzyskamy po p \end{equation*} a co za tym idzie wystarczy, że $\varepsilon < \frac{1}{m+1}$ a będziemy w stanie wywnioskować dokładny wynik w czasie wielomianowym, co jest możliwe tylko gdy $\P = \NP$. +\taskend diff --git a/gfx/k3-3.tex b/gfx/k3-3.tex new file mode 100644 index 0000000..14bdb99 --- /dev/null +++ b/gfx/k3-3.tex @@ -0,0 +1,15 @@ +\def\a{3} +\def\b{3} +\def\r{2cm} + +\begin{tikzpicture} + \foreach \i in {1,...,\a} + \node[draw, small vertex] (a-\i) at (\i*\r, \r) {}; + + \foreach \i in {1,...,\b} + \node[draw, small vertex] (b-\i) at (\i*\r, 0) {}; + + \foreach \u in {1,...,\a} + \foreach \v in {1,...,\b} + \draw (a-\u) -- (b-\v); +\end{tikzpicture} diff --git a/gfx/k5.tex b/gfx/k5.tex new file mode 100644 index 0000000..35161a7 --- /dev/null +++ b/gfx/k5.tex @@ -0,0 +1,11 @@ +\def\n{5} +\def\radius{2cm} + +\begin{tikzpicture} + \foreach \i in {1,...,\n} + \node[draw, small vertex] (v\i) at ({-360/\n * (\i)}:\radius) {}; + + \foreach \u in {1,...,\n} + \foreach \v in {\u,...,\n} + \draw (v\u) -- (v\v); +\end{tikzpicture} diff --git a/gfx/klika-opk.tex b/gfx/klika-opk.tex index f843f50..48ddbfc 100644 --- a/gfx/klika-opk.tex +++ b/gfx/klika-opk.tex @@ -1,10 +1,10 @@ % The block diagram code is probably more verbose than necessary \begin{tikzpicture}[auto, node distance=2cm] - \node[problem] (klika) {KLIKA}; + \node[problem] (klika) {\problem{KLIKA}}; \node[solution, right of=klika] (r-klika) {T/N}; \node[left of=klika] (i-klika) {$G, n$}; - \node[problem, below of=klika] (opk) {OPK}; + \node[problem, below of=klika] (opk) {\problem{OPK}}; \node[solution, right of=opk] (r-opk) {T/N}; \node[left of=opk] (i-opk) {$G_1, a, b$}; diff --git a/gfx/klika-pz.tex b/gfx/klika-pz.tex index 9f0b5d2..0f7c59a 100644 --- a/gfx/klika-pz.tex +++ b/gfx/klika-pz.tex @@ -1,10 +1,10 @@ % The block diagram code is probably more verbose than necessary \begin{tikzpicture}[auto, node distance=2cm] - \node[problem] (klika) {KLIKA}; + \node[problem] (klika) {\problem{KLIKA}}; \node[solution, right of=klika] (r-klika) {T/N}; \node[left of=klika] (i-klika) {$G_0, n$}; - \node[problem, below of=klika] (pz) {PZ}; + \node[problem, below of=klika] (pz) {\problem{PZ}}; \node[solution, right of=pz] (r-pz) {T/N}; \node[left of=pz] (i-pz) {$G, H$}; diff --git a/gfx/mgp-5.tex b/gfx/mgp-5.tex new file mode 100644 index 0000000..41b1e2b --- /dev/null +++ b/gfx/mgp-5.tex @@ -0,0 +1,26 @@ +\def\n{5} +\def\radius{2cm} + +\begin{tikzpicture}[scale=.8] + \begin{scope} + \foreach \i in {1,...,\n} + \node[draw, small vertex] (v-\i) at ({-360/\n * (\i)}:\radius) {}; + \foreach \u/\v in {1/2,2/3,3/4,4/5,5/1} \draw[-, thick] (v-\u) edge (v-\v); + \end{scope} + \begin{scope}[xshift=3*\radius] + \foreach \i in {1,...,\n} + \node[draw, small vertex] (v-\i) at ({-360/\n * (\i)}:\radius) {}; + + \foreach \u/\v in {1/2,2/3,3/4,4/5,5/1} \draw[-] (v-\u) edge (v-\v); + \foreach \u/\v in {1/4,4/2} \draw[-, thick] (v-\u) edge (v-\v); + \end{scope} + \begin{scope}[xshift=6*\radius] + \foreach \i in {1,...,\n} + \node[draw, small vertex] (v-\i) at ({-360/\n * (\i)}:\radius) {}; + + \foreach \u/\v in {1/2,2/3,3/4,4/5,5/1} \draw[-] (v-\u) edge (v-\v); + \foreach \u/\v in {1/4,4/2} \draw[-] (v-\u) edge (v-\v); + \foreach \u/\v in {3/5,5/2} \draw[-, thick] (v-\u) edge[bend left=60, out looseness=2.3] (v-\v); + \end{scope} +\end{tikzpicture} + diff --git a/gfx/mgp-6.tex b/gfx/mgp-6.tex new file mode 100644 index 0000000..c2e2fd2 --- /dev/null +++ b/gfx/mgp-6.tex @@ -0,0 +1,30 @@ +\def\n{6} +\def\radius{2cm} + +\begin{tikzpicture}[scale=.8] + \begin{scope} + \foreach \i in {1,...,\n} + \node[draw, small vertex] (v-\i) at ({-360/\n * (\i)}:\radius) {}; + + \foreach \u/\v in {1/2,2/3,3/4,4/5,5/6,6/1} \draw[-, thick] (v-\u) edge (v-\v); + \end{scope} + \begin{scope}[xshift=3*\radius] + \foreach \i in {1,...,\n} + \node[draw, small vertex] (v-\i) at ({-360/\n * (\i)}:\radius) {}; + + \foreach \u/\v in {1/2,2/3,3/4,4/5,5/6,6/1} \draw[-] (v-\u) edge (v-\v); + \foreach \u/\v in {2/6,6/3,3/5} \draw[-, thick] (v-\u) edge (v-\v); + \end{scope} + \begin{scope}[xshift=6*\radius] + \foreach \i in {1,...,\n} + \node[draw, small vertex] (v-\i) at ({-360/\n * (\i)}:\radius) {}; + + \foreach \u/\v in {1/2,2/3,3/4,4/5,5/6,6/1} \draw[-] (v-\u) edge (v-\v); + \foreach \u/\v in {2/6,6/3,3/5} \draw[-] (v-\u) edge (v-\v); + + \draw[-, thick] (v-1) edge[bend left=60, out looseness=2.3] (v-3); + \draw[-, thick] (v-1) edge[bend right=100, out looseness=4] (v-4); + \draw[-, thick] (v-1) edge[bend right=60, out looseness=2.3] (v-5); + \end{scope} +\end{tikzpicture} + diff --git a/gfx/por-1.tex b/gfx/por-1.tex new file mode 100644 index 0000000..dbb983e --- /dev/null +++ b/gfx/por-1.tex @@ -0,0 +1,14 @@ + +\begin{tikzpicture} + +\foreach[count=\xi] \len in {1,3,2,5,4,2,1} { + \draw[|-|] (0, -\xi/2) node [left] {\alphalph{\xi}} -- node [above] {$\len$} (\len, -\xi/2); +} + +\begin{scope}[yshift=-2cm, xshift=7cm] +\draw[|-] (0, 0) -- node [below] {a} (1, 0); +\draw[|-] (1, 0) -- node [below] {f} (3, 0); +\draw[|-|] (3, 0) -- node [below] {b} (6, 0); +\end{scope} + +\end{tikzpicture} diff --git a/gfx/por-2.tex b/gfx/por-2.tex new file mode 100644 index 0000000..897081c --- /dev/null +++ b/gfx/por-2.tex @@ -0,0 +1,34 @@ +\def\d{1.5} + +\usetikzlibrary{patterns} +\begin{tikzpicture} + +\foreach[count=\xi] \len in {1,3,2,5} { + \draw[|-|] (0, -\xi*\d) rectangle (\len, -\xi*\d - .5*\d); + \draw[|-|] (-.5, -\xi*\d) -- node [left] {$d$} (-.5, -\xi*\d - .5*\d); + \draw[|-|, yshift=.2cm] (0, -\xi*\d) -- (\len, -\xi*\d) node [right] {$\len$}; +} + +\begin{scope}[xshift=7cm] + \foreach[count=\xi] \len in {4,2,1} { + \draw[|-|] (0, -\xi*\d) rectangle (\len, -\xi*\d - .5*\d); + \draw[|-|] (-.5, -\xi*\d) -- node [left] {$d$} (-.5, -\xi*\d - .5*\d); + \draw[|-|, yshift=.2cm] (0, -\xi*\d) -- (\len, -\xi*\d) node [right] {$\len$}; + } +\end{scope} + +\begin{scope}[yshift=-6cm, xshift=7cm] +\draw[|-|] (-.5, 0) -- node [left] {$d$} (-.5, -.5*\d); + +\draw[pattern=crosshatch,pattern color=black!30] (0, 0) rectangle (1, -.5*\d); +\draw[pattern=crosshatch,pattern color=black!30] (1, 0) rectangle (3, -.5*\d); +\draw[pattern=crosshatch,pattern color=black!30] (3, 0) rectangle (6, -.5*\d); + +\draw[|-, yshift=.2cm] (0, 0) -- node [above] {$1$} (1, 0) ; +\draw[|-|, yshift=.2cm] (1, 0) -- node [above] {$2$} (3, 0) ; +\draw[-|, yshift=.2cm] (3, 0) -- node [above] {$3$} (6, 0) ; + +\draw[|-|, yshift=-.2cm] (0, -.5*\d) -- node [below] {$sz = 6$} (6, -.5*\d) ; +\end{scope} + +\end{tikzpicture} diff --git a/gfx/pw-wpw.tex b/gfx/pw-wpw.tex new file mode 100644 index 0000000..79acc1c --- /dev/null +++ b/gfx/pw-wpw.tex @@ -0,0 +1,20 @@ +% The block diagram code is probably more verbose than necessary +\begin{tikzpicture}[auto, node distance=2cm] + \node[problem] (pw) {\problem{PW}}; + \node[solution, right of=pw] (r-pw) {T/N}; + \node[left of=pw] (i-pw) {$G, n$}; + + \node[problem, below of=pw] (wpw) {\problem{WPW}}; + \node[solution, right of=wpw] (r-wpw) {T/N}; + \node[left of=wpw] (i-wpw) {$G_w, p$}; + + \draw[->, alpha, left] (i-pw) -- node[right] {$f$} (i-wpw); + + \draw[->] (pw) -- (r-pw); + \draw[->] (wpw) -- (r-wpw); + + \draw[->] (i-pw) -- (pw); + \draw[->] (i-wpw) -- (wpw); + + \draw[Implies-Implies, double distance=2pt] (r-pw) -- (r-wpw); +\end{tikzpicture} diff --git a/gfx/sp-por.tex b/gfx/sp-por.tex new file mode 100644 index 0000000..1557b3d --- /dev/null +++ b/gfx/sp-por.tex @@ -0,0 +1,20 @@ +% The block diagram code is probably more verbose than necessary +\begin{tikzpicture}[auto, node distance=2cm] + \node[problem] (sp) {\problem{SP}}; + \node[solution, right of=sp] (r-sp) {T/N}; + \node[left of=sp] (i-sp) {$A, n$}; + + \node[problem, below of=sp] (por) {\problem{POR}}; + \node[solution, right of=por] (r-por) {T/N}; + \node[left of=por] (i-por) {$W, sz, d$}; + + \draw[->, alpha, left] (i-sp) -- node[right] {$f$} (i-por); + + \draw[->] (sp) -- (r-sp); + \draw[->] (por) -- (r-por); + + \draw[->] (i-sp) -- (sp); + \draw[->] (i-por) -- (por); + + \draw[Implies-Implies, double distance=2pt] (r-sp) -- (r-por); +\end{tikzpicture} diff --git a/gfx/wpw-1.tex b/gfx/wpw-1.tex new file mode 100644 index 0000000..aeb3274 --- /dev/null +++ b/gfx/wpw-1.tex @@ -0,0 +1,7 @@ +\begin{tikzpicture} + \foreach \pos [count=\xi] in { (1, 3), (2.5,4), (0, 2), (3, 2), (-1, 5), (1, 6) } + \node[vertex] (v-\xi) at \pos {$\xi$}; + + \foreach \v/\u in {1/4,1/5,1/2,1/3,3/4,3/5,5/2,2/4,1/6,5/6,2/6} + \draw (v-\v) -- (v-\u); +\end{tikzpicture} diff --git a/gfx/wpw-2.tex b/gfx/wpw-2.tex new file mode 100644 index 0000000..6d26000 --- /dev/null +++ b/gfx/wpw-2.tex @@ -0,0 +1,11 @@ +\begin{tikzpicture} + \foreach \pos/\w [count=\xi] in { (1, 3)/2, (2.5,4)/1, (0, 2)/4, (3, 2)/5, (-1, 5)/2, (1, 6)/3 } { + \node[vertex] (v-\xi) at \pos {$\xi$}; + \node[above right=-1mm of v-\xi, weight] {$\w$}; + } + + \begin{pgfonlayer}{background} + \foreach \v/\u in {1/4,1/5,1/2,1/3,3/4,3/5,5/2,2/4,1/6,5/6,2/6} + \draw (v-\v) edge (v-\u); + \end{pgfonlayer} +\end{tikzpicture} diff --git a/main.tex b/main.tex index 65c9c1c..df24c66 100644 --- a/main.tex +++ b/main.tex @@ -17,16 +17,27 @@ \usepackage{lmodern} \usepackage{amsfonts} \usepackage{mathtools} +\usepackage{alphalph} +\usepackage{algorithm} +\usepackage{algpseudocode} \DeclarePairedDelimiter\ceil{\lceil}{\rceil} \DeclarePairedDelimiter\floor{\lfloor}{\rfloor} -\usetikzlibrary{decorations.pathmorphing, arrows.meta} +\usetikzlibrary{decorations.pathmorphing, arrows.meta, positioning} +\usetikzlibrary{shapes.geometric, arrows} \tikzstyle{problem} = [draw,outer sep=0,inner sep=5,minimum size=10] \tikzstyle{solution} = [outer sep=0,inner sep=1,minimum size=10] \tikzstyle{alpha} = [decorate, decoration={snake, amplitude=.5mm}, help lines] \tikzstyle{max edge} = [very thick, blue] +\tikzstyle{vertex} = [draw, circle, thick] +\tikzstyle{small vertex} = [draw, circle, scale=.75] +\tikzstyle{weight} = [scale=.75, fill=white, draw] + +\pgfdeclarelayer{background} +\pgfdeclarelayer{foreground} +\pgfsetlayers{background,main,foreground} % opening \title{PAA - Kolokwia, rozwiązania} @@ -45,15 +56,20 @@ \newcommand{\problem}[1]{\texttt{#1}} +\newcommand{\taskend}{\par\vspace{.1cm}\hfill$\square$\vspace{.4cm}\par} \newcommand{\task}{\vspace{.25cm}\refstepcounter{task} \noindent\par\texttt{Zadanie \thesection.\thetask.\hspace{.1cm}}} -\newcommand{\subtask}[1][]{\refstepcounter{subtask}\noindent\par \hspace{.5cm}\thesubtask#1)\ } +\newcommand{\subtask}[1][]{\refstepcounter{subtask}\par\noindent\hspace{.3cm}\thesubtask#1)\ } \newcommand{\solution}{\par\vspace{.5cm}\noindent\textbf{Proponowane rozwiązanie:}\par} \newcommand{\tip}[1]{\par\noindent\textit{Wskazówka:} #1\par} \newcommand{\ctip}[1]{\refstepcounter{tip}\par\noindent\textit{Wskazówka \#\thetip:} #1\par} +\newenvironment{shortcut}{\vspace{.4cm}\noindent\textbf{Na skróty:}\vspace{2mm}\hline\vspace{.4cm}}{\vspace{.4cm}\hline\vspace{.4cm}} +\newenvironment{column}[1]{\begin{minipage}{#1\linewidth}}{\end{minipage}\vspace{.5\baselineskip}} + \begin{document} \input{./2013.01.26.tex} +\input{./2011.01.18.tex} \end{document}