Piotr Stańczyk
Algorytmika praktyczna
Nie tylko dla mistrzówPiotr Stańczyk
• prezentacja wszystkich ważniejszych z punktu widzenia konkursów działów algorytmiki;
• intuicyjne podejście do przedstawianych zagadnień algorytmicznych;
• zwięzła, efektywna implementacja omawianych algorytmów w języku C++;
• liczne przykładowe zadania konkursowe wraz ze wskazówkami stopniowo nakierowującymi na właściwe rozwiązanie zadania, a także z adresem strony internetowej, na której można znaleźć pro- gramy stanowiące rozwiązania tych zadań;
• tematyczne wykazy zadań z całego świata z możliwością testowania ich rozwiązań na stronach internetowych konkursów;
• odsyłacze do literatury umożliwiającej szczegó- łowe poznanie opisywanych zagadnień od strony teoretycznej;
• cenne rady dotyczące strategii uczestnictwa w kon- kursach.
Po pracę tę powinna sięgnąć każda osoba pragnąca doskonalić swoje umiejętności algorytmiczne i programistyczne.
Książka ta różni się od znanych na polskim rynku pozycji poświęconych algorytmice, dotyczy bowiem jej strony praktycznej. Taki sposób potraktowania tego działu informa- tyki wynika z coraz większego zainteresowania zarówno uczniów, jak i studentów udziałem w różnego rodzaju konkursach programistycznych.
Czytelnik znajdzie w niej przegląd implementacji podstawowych algorytmów i struk- tur danych, które można zastosować bezpośrednio bądź zaadaptować w prosty spo- sób przy rozwiązywaniu zadań konkursowych. Fundamentem książki jest biblioteczka algorytmiczna, która była tworzona i rozbudowywana podczas przygotowań zespołu Warsaw Predators z Uniwersytetu Warszawskiego do reprezentowania tej uczelni na międzynarodowych zawodach.
Piotr Stańczyk
Algorytmika praktyczna
Nie tylko dla mistrzów
Algorytmika praktyczna
Nie tylko dla mistrzów
Na niepowtarzalny charakter książki składają się następujące elementy:
Książka powinna znaleźć się na półce wszystkich zainteresowanych doskonaleniem swoich umiejętności algorytmiczno-programistycznych.
prof. Krzysztof Diks, Uniwersytet Warszawski
Piotr Stańczyk
jest doktorantem w Instytucie Informatyki Uniwersytetu Warszawskiego oraz kiero- wnikiem warszawskiego oddziału Grupy Badawczo-Rozwojowej firmy ADB. Bogate doświadczenie związane z kon- kursami informatycznymi zdobył nie tylko jako wieloletni uczestnik i reprezentant Polski na konkursach i olimpiadach informatycznych, lecz także jako członek Jury Olimpiady Informatycznej czy koordynator ogólnopolskiego konkursu Potyczki Algorytmiczne. Rozległą wiedzę akademicką autora wspiera praktyka nabyta w takich firmach, jak:Microsoft, Google i Nvidia.
Bez algorytmiki nie ma informatyki!
ALGORYTMIKA PRAKTYCZNA
NIE TYLKO DLA MISTRZÓW
PIOTR STAŃCZYK
ALGORYTMIKA PRAKTYCZNA
NIE TYLKO DLA MISTRZÓW
Projekt okładki: Anna Kozłowska KA PROJEKT Redakcja: Ewa Zdanowicz
Skład komputerowy: Piotr Stańczyk
Zastrzeżonych nazw firm i produktów użyto w książce wyłącznie w celu identyfikacji.
Wszelkie uwagi na temat książki prosimy kierować pod adresem poczty elektronicznej Autora:
stanczyk@mimuw.edu.pl
Zadania z Olimpiady Informatycznej oraz Olimpiady Informatycznej Krajów Bałtyckich zostały opublikowane za zgodą Komitetu Głównego Olimpiady Informatycznej. Zadania z konkursu Potyczki Algorytmiczne zostały opublikowane za zgodą Wydziału Matematyki, Informatyki i Mechaniki Uniwersytetu Warszawskiego – współorganizatora tego konkursu.
Copyright © by Wydawnictwo Naukowe PWN SA Warszawa 2009
ISBN 978-83-01-15821-7
Wydanie I – 2 dodruk Warszawa 2019
Wydawnictwo Naukowe PWN SA
02-460 Warszawa, ul. Gottlieba Daimlera 2 tel. 22 69 54 321, faks 22 69 54 288 infolinia 801 33 33 88
e-mail: pwn@pwn.com.pl; reklama@pwn.pl www.pwn.pl
Druk i oprawa: OSDW Azymut Sp. z o.o.
Sªowowst¦pne 9
Przedmowa 11
1. Algorytmygrafowe 15
1.1. Reprezentacjagrafu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.2. Przeszukiwaniegrafuwszerz. . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.3. Przeszukiwaniegrafuwgª¡b. . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.4. Silniespójneskªadowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
1.5. Sortowanietopologiczne . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
1.6. Acykliczno±¢ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
1.7. Mosty,punktyartykulacjii dwuspójneskªadowe . . . . . . . . . . . . . . 44
1.8. cie»kaicyklEulera . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
1.9. Minimalne drzeworozpinaj¡ce. . . . . . . . . . . . . . . . . . . . . . . . . 57
1.10.Algorytm Dijkstry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
1.11.Algorytm Bellmana-Forda . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
1.12.Maksymalnyprzepªyw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
1.12.1.Maksymalnyprzepªywwyznaczanymetod¡Dinica . . . . . . . . . 68
1.12.2.Maksymalnyprzepªywdlakraw¦dzijednostkowych . . . . . . . . . 72
1.12.3.Najta«szymaksymalnyprzepªywdlakraw¦dzijednostkowych . . . 74
1.13.Maksymalneskojarzeniewgraedwudzielnym . . . . . . . . . . . . . . . 77
1.13.1.Dwudzielno±¢grafu. . . . . . . . . . . . . . . . . . . . . . . . . . . 78
1.13.2.MaksymalneskojarzeniewgraedwudzielnymwczasieO(n (n + m)) 81 1.13.3.Maksymalneskojarzeniewgraedwudzielnym wczasieO((n + m)√n) . . . . . . . . . . . . . . . . . . . . . . . . 83
1.13.4.Najdro»szeskojarzeniewgraedwudzielnym . . . . . . . . . . . . 86
2. Geometria obliczeniowa na pªaszczy¹nie 91 2.1. Odlegªo±¢punktuod prostej. . . . . . . . . . . . . . . . . . . . . . . . . . 95
2.2. Polewielok¡ta. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
2.3. Przynale»no±¢punktudogury . . . . . . . . . . . . . . . . . . . . . . . . 98
2.4. Punktyprzeci¦cia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
2.5. Trzypunktyokr¡g . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
2.6. Sortowaniek¡towe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
2.7. Otoczkawypukªa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120
3. Kombinatoryka 128
3.1. Permutacje wkolejno±ciantyleksykogracznej . . . . . . . . . . . . . . . . 128
3.2. Permutacje minimalnaliczba transpozycji . . . . . . . . . . . . . . . . 130
3.3. Permutacje minimalnaliczba transpozycjis¡siednich . . . . . . . . . . 132
3.4. Wszystkiepodzbioryzbioru . . . . . . . . . . . . . . . . . . . . . . . . . . 135
3.5. Podzbioryk-elementowewkolejno±cileksykogracznej . . . . . . . . . . . 137
3.6. Podziaªyzbioruzu»yciemminimalnejliczbyzmian . . . . . . . . . . . . . 138
3.7. Podziaªyliczbywkolejno±ciantyleksykogracznej. . . . . . . . . . . . . . 140
4. Teorialiczb 142 4.1. Wspóªczynnik dwumianowy . . . . . . . . . . . . . . . . . . . . . . . . . . 142
4.2. Najwi¦kszywspólnydzielnik. . . . . . . . . . . . . . . . . . . . . . . . . . 144
4.3. Odwrotno±¢modularna . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
4.4. Kongruencje. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
4.5. Szybkiepot¦gowaniemodularne. . . . . . . . . . . . . . . . . . . . . . . . 152
4.6. SitoEratostenesa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
4.7. Listaliczbpierwszych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
4.8. Test pierwszo±ci. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
4.9. Arytmetykawielkich liczb . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
5. Struktury danych 178 5.1. Strukturadanychdoreprezentacjizbiorówrozª¡cznych. . . . . . . . . . . 178
5.2. Drzewawyszukiwa«binarnych . . . . . . . . . . . . . . . . . . . . . . . . 182
5.2.1. Drzewamaksimów . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
5.2.2. Drzewalicznikowe . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
5.2.3. Drzewapozycyjne . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
5.2.4. Drzewapokryciowe. . . . . . . . . . . . . . . . . . . . . . . . . . . 192
5.3. Binarnedrzewastatycznedynamiczniealokowane. . . . . . . . . . . . . . 195
5.4. Wzbogacanedrzewabinarne . . . . . . . . . . . . . . . . . . . . . . . . . . 200
6. Algorytmy tekstowe 212 6.1. AlgorytmKMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
6.2. Minimalnyokressªowa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
6.3. KMPdlawieluwzorców(algorytmAho-Corasick) . . . . . . . . . . . . . 217
6.4. Promieniepalindromówwsªowie . . . . . . . . . . . . . . . . . . . . . . . 223
6.5. Drzewasuksowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
6.5.1. Liczbawyst¡pie« wzorcawtek±cie . . . . . . . . . . . . . . . . . . 230
6.5.2. Liczbaró»nychpodsªówsªowa. . . . . . . . . . . . . . . . . . . . . 232
6.5.3. Najdªu»szepodsªowowyst¦puj¡cen razy . . . . . . . . . . . . . . 233
6.6. Maksymalnyleksykograczniesuks . . . . . . . . . . . . . . . . . . . . . 234
6.7. Równowa»no±¢cykliczna. . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
7. Algebra liniowa 240
7.1. Eliminacja Gaussa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
7.1.1. Eliminacja GaussawZ2 . . . . . . . . . . . . . . . . . . . . . . . . 241
7.1.2. Eliminacja GaussawZ p . . . . . . . . . . . . . . . . . . . . . . . . 244
7.2. Programowanieliniowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
8. Elementystrategiipodczaszawodów 253 8.1. Szacowanieoczekiwanejzªo»ono±ciczasowej . . . . . . . . . . . . . . . . . 253
8.2. Strategiapracywdru»ynie . . . . . . . . . . . . . . . . . . . . . . . . . . 255
8.3. Szablon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
8.4. Plik Makefile. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
8.5. Parametrykompilacjiprogramów . . . . . . . . . . . . . . . . . . . . . . . 259
8.5.1. ParametrWec++ . . . . . . . . . . . . . . . . . . . . . . . . . . 260
8.5.2. ParametrWformat . . . . . . . . . . . . . . . . . . . . . . . . . . 262
8.5.3. ParametrWshadow . . . . . . . . . . . . . . . . . . . . . . . . . . 263
8.5.4. ParametrWsequence-point . . . . . . . . . . . . . . . . . . . . . . 264
8.5.5. ParametrWunused . . . . . . . . . . . . . . . . . . . . . . . . . . 267
8.5.6. ParametrWuninitialized . . . . . . . . . . . . . . . . . . . . . . . 268
8.5.7. ParametrWoat-equal . . . . . . . . . . . . . . . . . . . . . . . . 269
8.6. Nieustannytime-limit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270
8.6.1. Eliminacja dzielenia . . . . . . . . . . . . . . . . . . . . . . . . . . 271
8.6.2. Wczytywaniedanych wej±ciowych. . . . . . . . . . . . . . . . . . . 271
8.6.3. Wstawkiasembleroweikompilacjazoptymalizacjami . . . . . . . 273
8.6.4. Lepszewykorzystaniepami¦cipodr¦cznej . . . . . . . . . . . . . . 274
8.6.5. Przetwarzaniewst¦pne . . . . . . . . . . . . . . . . . . . . . . . . . 275
Wskazówki do zada« 278
Dodatki
A.Nagªówki stosowanew programach 292
B.Nagªówki Eryka Kopczy«skiegonakonkursTopCoder 295
C.Sposobyna sukces w zawodach 299
D.Wykaz zada« na programowaniedynamiczne 304
E. Wykaz zada« na programowaniezachªanne 305
F. Wykaz przykªadowych zada« 306
Literatura 307
Bez algorytmiki nie ma informatyki. Ka»dy, kto chce zosta¢ rasowym informatykiem,
powinien po±wi¦ci¢ du»o czasu na projektowanie, analizowanie i programowanie algo-
rytmów. Oddawana wªa±nie do r¡k czytelników ksi¡»ka Piotra Sta«czyka Algorytmika
praktyczna. Nie tylko dla mistrzów mo»e pomóc w doskonaleniu sztuki rozwi¡zywa-
nia problemów algorytmicznych i biegªego ich zapisywania w postaci eleganckich, wy-
dajnie dziaªaj¡cych programów. Jest to ksi¡»ka dla osób, które poznaªy ju» podstawy
programowania oraz algorytmiki i chc¡ rozwija¢ swoje umiej¦tno±ci na tym polu po-
przez nauk¦na dobrych, sprawdzonych przykªadach. Znajd¡ one tutajomówieniesze-
regu zagadnie« wspóªczesnej algorytmiki, obejmuj¡cych algorytmy grafowe, geometri¦
obliczeniow¡,kombinatoryk¦,teori¦liczb,strukturydanych, algorytmytekstoweialgo-
rytmy algebry liniowej. Autor podaje minimaln¡liczb¦poj¦¢ i faktów potrzebnych do
zrozumienia prezentowanych technik algorytmicznychi algorytmów,a same algorytmy
itechnikiprzedstawianaprzykªadzie rozwi¡za«wybranychzada« zkonkursówprogra-
mistycznych.Niezwykle cennejestto, »e ka»derozwi¡zaniezadania,to bardzoczytelny
programgotowydouruchomienia.
W niniejszej ksi¡»ce Piotr Sta«czyk dzieli si¦ swoimi i kolegów do±wiadczeniami
zudziaªuw konkursachalgorytmicznych. S¡to do±wiadczeniaosób, które potwierdziªy
swoj¡wiedz¦iumiej¦tno±cialgorytmiczno-programistycznewkonfrontacjizrówie±nika-
mizcaªego±wiata.Piotr todwukrotnylaureatkrajowejOlimpiadyInformatycznejoraz
dwukrotnymedalista Baªtyckiej OlimpiadyInformatycznej. Wrazz kolegami zwyci¦»aª
wAkademickichMistrzostwachPolskiwProgramowaniuZespoªowymizdobywaªmedale
wAkademickich MistrzostwachEuropy rodkowej.Piotra niew¡tpliwie mo»na zaliczy¢
dopolskiejszkoªyinformatykimªodzie»owej, którejprzedstawicieledwukrotnieodnosili
zwyci¦stwow Mi¦dzynarodowejOlimpiadzie Informatycznej(Filip Wolski w2006 roku
orazTomaszKulczy«skiw2007roku)orazzwyci¦»aliwpresti»owychAkademickichMi-
strzostwachwiatawProgramowaniuZespoªowym(zespoªyUniwersytetuWarszawskie-
gowskªadach:TomaszCzajka,AndrzejG¡sienica-Samek,KrzysztofOnakzwyci¦stwo
w2003roku;MarekCygan,MarcinPilipczuk,FilipWolskizwyci¦stwow2007roku).
Ksi¡»ka Piotra Sta«czyka powinna znale¹¢ si¦ na póªce ka»dego zainteresowanego
odnoszeniem sukcesów wkonkursach algorytmicznych.Ale nie tylko.Jestem przekona-
ny, »e mo»e ona by¢ wykorzystywana na zaj¦ciach z programowaniaoraz algorytmów
i struktur danych zarówno dla uzdolnionej mªodzie»y szkóª ±rednich, jak i studentów
studiów informatycznych. Czytelnikom »ycz¦ du»o przyjemno±ci z korzystania z Algo-
rytmikipraktycznej, jakte» zach¦camdokrytycznego czytaniai dzieleniasi¦uwagami
zautorem. Piotrowi »ycz¦satysfakcji zwykonanejpracy, ale tak»ewytrwaªo±ciwkon-
taktach z czytelnikami i uwzgl¦dniania wszystkich konstruktywnych uwag w kolejnych
wydaniach.
Pierwszapolska Olimpiada Informatyczna dla uczniów szkóª ±rednich zostaªa zorgani-
zowanaw1993 rokuprzez najwi¦kszepolskieuczelnie,takie jakUniwersytetWarszaw-
ski, Uniwersytet Jagiello«ski czy Uniwersytet Wrocªawski. Zwyci¦zcy Olimpiad Infor-
matycznych maj¡mo»liwo±¢reprezentowaniaPolskipodczas takichmi¦dzynarodowych
konkursówjak Olimpiada InformatycznaKrajówBaªtyckich, Olimpiada Informatyczna
CentralnejEuropyi najbardziejpresti»owaMi¦dzynarodowaOlimpiadaInforma-
tyczna (strona konkursu http://www.ioinformatics.org/). Coraz wi¦kszaz roku narok
liczba uczestników tych olimpiad ±wiadczy o rosn¡cej popularno±ci nauki algorytmiki
w±róduczniówszkóª±rednich.W 2006rokurozpocz¦to organizowanieOlimpiadyInfor-
matycznejGimnazjalistów. Swego rodzajuolimpiad¡ informatyczn¡ dla studentóws¡
Akademickie Mistrzostwa Polski w Programowaniu Zespoªowym. Bior¡ w nich udziaª
reprezentacjepolskichuczelni,wyªanianewlokalnychkonkursacheliminacyjnych.
MistrzostwaPolskiotwieraj¡drog¦kunajbardziejpresti»owemuiciesz¡cemusi¦dªu-
g¡tradycj¡konkursowi,jakimjestInternationalCollegiateProgrammingContestorga-
nizowanyprzezAssociationforComputingMachinery(wskrócieACM;ocjalnastrona
konkursu http://icpc.baylor.edu/icpc/). Pierwsze zawody naªowe odbyªy si¦ 2 lutego
1977 rokuw Atlancie, w Stanach Zjednoczonych. Na pocz¡tku lat dziewi¦¢dziesi¡tych
weliminacjachdotegokonkursubraªoudziaªokoªo400dru»yn,zktórych25kwaliko-
waªosi¦corokudonaªu.Obecnieo7080miejscwnaªachwalczyponad4000dru»yn
z1600uczelnicaªego±wiata.
Oprócztych ciesz¡cychsi¦ wieloletni¡tradycj¡konkursówjestwymy±lanych iorga-
nizowanych wiele nowych zarównopolskich, takich jak Potyczki Algorytmiczneczy
InternetowyTurniejProgramówWalcz¡cych,jakimi¦dzynarodowych,doktórychnale»¡
TopCoder,GoogleCodeJamczyMicrosoftImagineCup. Branieudziaªuwkonkursach
jestzarównodlauczniów,jakistudentówwa»nymelementemnaukialgorytmiki.
Poziomkonkursównieustanniesi¦podwy»sza.Opracowywanes¡kolejnemetodyprzy-
gotowywaniasi¦dozawodówispecjalnetechnikipisaniaprogramów.Ichcelemjestzmi-
nimalizowanieczasu potrzebnegona rozwi¡zanie zadania, przy jednoczesnym unikaniu
mo»liwiedu»ej liczby bª¦dów. Ze wzgl¦du na ograniczony czas trwaniakonkursów ich
uczestnicynie mog¡rozwi¡zywa¢wszystkich zada«od zera.W wielu przypadkachmu-
sz¡ wykorzystywa¢ pomysªy zastosowanew podobnych zadaniach rozwi¡zywanych ju»
wcze±niej,copozwalaimzaoszcz¦dzi¢troch¦czasu.
Ksi¡»katamasªu»y¢donaukialgorytmiki,niejestjednaktypowympodr¦cznikiem.
Niezawiera wnikliwegoopisu algorytmówwraz zich analiz¡zªo»ono±ci oraz dowodem
poprawno±ci.Zamiasttegoobejmujekolekcj¦implementacjiró»nychalgorytmówbardzo
przydatnych podczas zawodówizbiórzada« umo»liwiaj¡cyprze¢wiczenieich wykorzy-
staniawpraktyce.
Znacz¡c¡cz¦±¢gronaczytelnikówstanowi¢b¦d¡zapewneosobyzainteresowanezwi¦k-
szeniem swoich umiej¦tno±ci w zakresie szybkiego implementowania rozwi¡za« zada«
algorytmicznych wj¦zyku C++. Lektura ksi¡»ki napewno pozwoli naszybsze rozwi¡-