C++: Boost Graph Library 5-469-00352-3

Издание, являющееся переводом одной из книг серии «C++ in Depth», посвящено описанию Boost Graph Library (BGL) — библиот

319 53 38MB

Russian Pages 301 Year 2006

Report DMCA / Copyright

DOWNLOAD PDF FILE

Recommend Papers

C++: Boost Graph Library
 5-469-00352-3

  • 0 0 0
  • Like this paper and download? You can publish your own PDF file online for free in a few minutes! Sign Up
File loading please wait...
Citation preview

Ь »  "А "

J e r e m y G. Siek, Lie-Quan Lee, A n d r e w Lumsdaine

T

h

e

G

r

a

User

B

p

Guide

h

and

o

o

L

s

i

t

b

R e f e r e n c e

r

a

r

y

M a n u a l

• • Addison-Wesley Boston • San Francisco • New York • Toronto Montreal • London • Munich • Paris • Madrid• Capetown Sydney «Tokyo • Singapore • Mexico City

Б И К А ПЕ Т

А

и киС

ме р Дж

МТ С ИА Р Г О Р П

А

, Л-ай Ли ан Кв

, Эдр н

B o o s t  G r a p h 

М о с кв Р о с т о в - н а - о Дн

а   •   С а н кт - П е т е р б у р

г   •   Н и жн и у   •   Ек а т е р и н б у р Ки е в   •  Х а р ь ко

н

l i b r a r y

й   Но в г о р о г   •  Са м а р в  •   М инс

2006

ю  Лй э дм ас

zyxwvutsrqponmlkjih

д   •   Вор оне к

а  •  Ново с и б и р с

ж к

е р мж Д и

  иС,к

 Л ай - ванК

 Л и ,

 Эрндю

 Л ам сэйд н

C++ Boost Graph Library. иБбл от е к

Г лав н ы З а в ю еу д щ и Р к у о в ид е т л Н ча у н ы И л ю с рт а ц и и Л е тр а ун ы о д жу Х н и К о р е к от р В е р скт а

Б

К

ДУ

К

й  р еадк от

а пр ог а м м и с т

 с  аикйгсон л

в ел р П

zyxwvutsrqponmlkjihg

а zyxwvutsrqpo

zyxwvutsrqponmlkjihgfedcbaZYXWV

 Р.узи С

р  

Е .  Сгвоатнр

й   р еад к ц и е й ь   п р о ек т

 

.А  иврцоК .А  кнео ам дА В.  Лаптве  Л.  ваони дРо Е .  Явеа к ло .Л  Ау д  вксеая  И.  Сваонир м .Л  ваони дРо

а  

й   р е ад к о т

р   и   й   р е ад к о т

В. вао,и Дд ме р  

к   ы  

Н .  Ввиоак,рт

 

zyxwvutsrqponmlkjih

32.973- 018.1 004.43

ж Д . Си к , Л . Л и , Э . Л ам с дэ й 3 С 5 C++ Boost Graph Library. икеБблот бПС . : и Пе р т , 2006. — 304 с : и л

н а п р о м га м и с т

а / ер П

. с н и л аг й с о к

о зу С

и Р . —

.

ISBN 5- 469- 00352- 3 И з ад н и е ,  яв л ю щ е с я   п ер в о д м   он д о й   и з   кн и г   с ер и и   «C+ +   in  D epth»,  п освящ ен о   о п и сан и Boost  Graph  Library  (BG L)  —  би ли оект и   л д я   п о рс т е н и я   к у рс т р   а дн ы х   и  алгори мто в   в ы ч и сле н и й   н а  графх ,  п рнед аз н ачен ы х   л д я   р еш ен и я   с ам ы х   р аз н о б р аз н ы х   з а чд :  о т   опитм з ац и и   и н ер т ет м а р ш и тр у з а ц и и   и   п лан и р о в ан и я   е л т фо н ы х   се т й   д о   з ад ч   м о л екяр ун о й   б и о л ги .  С оердж и р а з в ер н от у е   о п и сан и е  BG L, дем о н срти еу т   п р и м ер ы   п р и л о ж ен и й   к  реаль н ы м   з а дч м .  П ерва я   ч аст яв л сет я   п о лн ы м   рк у о в сд т о м   п о л ь з о в еа л т я ,  н ач и н асет я   с  ввенд и я   п о н и ят й  теори и   гр а ф о в , терм и н о л иг и   и  о п и сан и я  о бо щ ен ы х   а л го р и м т о в   н а  графх ,  з н ак ом и т  п оль з оваелт я   с о  всем и   о сн о в н ы м в о з м о ж н о яс м т и   б и л и о е тк и   BG L.  Вотра я   ч аст ь   —  п олн о е   сп р ав о ч н о е   р к у о в сд т о ,  соердж и т   о кд у м е н а тц и ю   к о  все м   к он ц еп ц и я м  BG L, е е  алгори мта м   и  к лас м .

ю т ь и -

© Pearson Ed uc at ion Inc., 2002

© е рП в о © Из н а и д рв а П

д н а р су и к е н а р ус о к а н а и з д ан

Вс

е вп р а

е п о ел у ч н

а з ащ и щ е н ы я в л а дц е ь

р за е ш е н и о р м И н ф ац и я м ен о тн ч с т

, им е я ь и п о нл т

й зя ы к м яз ы е к ы

ь д ан о

й ни кг

х п р ва я в д ан о

у во зм ны о ж у при во д м ы

с е и Ил ьз к т да

й до м О с е и И л ьз к т да

, АЗ

«Пеирт»

, 2006 й до м «Пиерт»

, 2006

ю с Addison- Wesley Longman.

я ча с т в ао в т р с и к

О , о р м ф ле н и

п о с о г л аш е н и

. Ни а к , с а що д е р ж а я с в ви д

, АЗ

и н е ме о ж

т б ыт

ь во с п р о и зведн

а в о ка

й б ы

т о н и б ыл

о рм фо

е бе

з п и см ь е н о г

о

. й

нки ге

е еч л о в еч с и к х с вед ни

, п ое н ч у л е й и н е нес

а ил

и е н хт и ч с к т о в с ет н о с т

и з и с о т нч и к в

, р са м р и та в е м ы е

ош ибк

, и с е з в л ь д та ь з а во змны о ж

о е ош ибк

х и с з е д л в а ть о н е ме о ж , с в я з ан ы

м т

а к к н ы е н да ж

. еТ

гр а и н т о в

м

н е ю .

ь ба с о нлю у т е с и с п о з л ь в ан и е

м нк и г

I S B N  5 - 4 6 9 - 0 0 3 5 2 - 3

ISBN 0- 201- 72914- 8 (англ. О Н ало г в а

я  ль го т

О   «П и ет

р  П р и н » т

а  —  о бщ ер о с и й ск и П о пд и с а н

о  к  п еч ат

О п т е ч а нт

) ,  194044, С ан к-т П ертбгу , Б . С ам п со н и ев ск и й  п р . ,  д .  29а . иЛ ц е н з и я  И Д   №  05784 о т   07.09.01. й   к л а с и ф к ао т р  п крцоуд и и   О К   005- 93, то м   2;  95  3005 —  ли етр ау и  28.09.05. Ф орм а т  70x100/ 16. Усл .  п . л .  24,51. Т и р а ж  2000. З а к з 37

о   с  го тв ы х   ид а п о з и т в о 190005, С ан к-т П ертбгу

в   в  О А ,  И з м ай ло в ск и

О   «Тнех и ч еск а й  п р .

я   к н и га , 29

»

а  учеб н ая 5

.

zyxwvut

о к т ра К

е и н а с жр е о д

и во сл д е р П

е

е

и н е д вВ

11

е

аЧ с т

ь

I . в с т до в к у Р а 1. ине д вВ

в а Гл в а Гл в а Гл в а Гл в а Гл в а Гл в а Гл в а Гл в а Гл в а Гл в а Гл

а

о л е т а во з ь ло п

а а а а а а

в а Гл в а Гл в а Гл

а 13. м иторгл А а 14. с а л К

в а Гл

а 15. ке тои лб Б

в а Гл

а 16. ын ь ле тмоспВа г

я

23 24

е

2. щбон Ое 3. е а ч уз И 4. ынвос О 5. ч а д З 6. ч а д З 7. омтнеКп 8. ын ьмсилкаМ

9. ы нв я е Н а 10. ив стймие адозВ а 11.в стдов к у Р ь I I . о н ч в арп С а 12. ицпеон К

аЧ с т

и ф а р г о и бл Б и н е о пл Д ы н ти в а ф л А

15zyxwvuts

е м а р го и п н в р м BGL е м ти о р г л а и и н е д ож х а н а го м н и ь л а ы со т н з я в й о пт

а

е ы ф ра г

е в C++ ы н а а ф ар г я й ш а ч ит а р к о о нгв с т и к

: о хб е с и м г ру д о п о о с н т ь л е ит о д в з р п

е в с о дт к у р и BGL ы

х х е т уп о в ер д

д е но к

й а

м и м ы во ф а р г

и м а к е от и б л и

и

о

ы BGL BGL й с йо т в е о н кц е п и

я ь

и

124 130 137 145 146 170 215

а и н е ж о б ар т

е к и ф а р ои г б л й л е т аз к у

39 59 77 89 102 109 117

в , сал к

ы

274 и ци кн фу

и

284 294 297 299

и н а ж р е до С

е

Пр е д и с л о в и

е

В вед ни

е о щ бн е О м г ео н Н т Ч о о ка т и н е ч у ло П а К к с ь т а во з ь ло п онм ато Гр с то н р а д о г а л Б и з н еЛц О т в ст ь л е т а д з и

а Чс т в а Гл

11 15

о и е е е

е м и а нр г о в п и з ио р с т и BGL Boost? и к ов н а с т у а м а р го п н я ни о гк й м а и р н г о вп и и

о и н е ч с п еб о

16 17 18 18 19 20 21 22 22zyxwv

я BGL

е

я а

ь I . в с т до к у Р а 1. ине д вВ

о л е т а во з ь ло п

а 2. щбо нОе 2.1.  н еи д Вв 2.1.1. зи мфирол П 2.1.2. зи мфирол П 2.1.3. ине в ар С 2.2. ощбн еО 2.3. ицпеон К 2.3.1. роб а Н 2.3.2. мир Пе

я

23

е

1.1. мегоНн о м р е и ог т л н 1.2.ы во ф а Гр е и цп ое н к 1.2.1. ле тсиап О 1.2.2.ине ж арбо т О 1.2.3. о хб О д ф ар г 1.2.4. ин а дзо С е 1.2.5. ле ти сео П 1.3. с а л К ы и р е тп а д 1.3.1. с а л К ы о ф ар г 1.3.2.ре тп а д А ы 1.4. ыщбон еО е м т и ро г л а 1.4.1. щыбон Ое 1.4.2. щыбон Ое

в а Гл

е

24 и и з иор е т

и о ф ар г

в

24 26 26 27 28 29 30 32 32 33 34 34 38

и и шр е ви

н и еб р в

е стй о в а и и ц а к и фми д о и м т ио р г л а ы о ф ар г в о ф ар г в

я ф ар г

а

в в

ы й ти ро г л а й т и ро г л а

р

н а а ф ар г м о с е к ич г пл т м с и ок п

х а в н иб у л г

е м а р и го н п в р

й к о в ир с т у

и

е в C++

39zyxwvu

е   м

в - о н т о к н е а в р и т н бъ о е и р м в ощ б н е е О П и ОО

м м аи р н г о в п и м м и а нр г о в п и П

е м и а нр г о в п и и и л ем до и ы и н а б ов е р т й : Inputlterator

е и STL

и

и

39 40 41 41 44 47 47 48

н иа о С е д р ж 2.4. ын аворисц А 2.4.1. ын аворисц А 2.4.2.ле ти ле д рп О 2.4.3.и не л дерп О 2.4.4. ан чи ста Ч 2.4.5.иц азре ч тсиеп Д 2.5. крево П 2.5.1. с а л К 2.5.2. пи то р П 2.6. в стн ар сот П 2.6.1. с а л К 2.6.2. сио П 2.7. ын амвоИне

в а Гл

е ип т и и пто в е сал к

в а Гл

,ын е жо лв а с йо т в в

х

в

я к р е ов п ы и цп е о н к

и и ц п е он к й

о мие

й

н

ы к ги н е К

а е р м т аер п

ы иц кн фу

й

BGL

59

у м а лй фа

и

59 60 61 61 62 62 64 64 65 66 67 69 71 72 74 76

а й ы во ф а р г с мо пщ ь и я к в о р и ст ф

а шр ев и

й сал к ю о р т а р е ти

с т а в о з ь л о с пи

шр е ви

ь в еб р

а ер ч н с е и н а в о з ь л о спи м ш ра е н и в н и у о ип с к

р

з с ио п

к в н иб у л г

у

м ш е н ви

х с йо т в

в

м

у в у б ни л г

: и н ер т у н в

е в стй о в

: л е т и с ое п

и

а

и я к ов р и с т й

а и о и пс

и мо ц я к л п

к в нб и у л г

у

и

е м т и ро г л а

ы

н а а ф ар г

х

77

у я й ни в е К

а н о эк Б

а

у я е о л ик ц

и и н е д ож х а н

в в а ф ар г

х о к тп

я йш а ч и т а р к

в и н е л в арп у

х е т уп

я м а р го п

ы

й

я в т е нр т н И а и н яо с т а р я с о те ч у

а го м н и ь л а я   е  телфон м  Клакс р а   м  Прим а  

89 90 е

м - ам н л е Б д р о Ф

а и и ц а з и мш р т а у й

я

м и н яо с т

я ин л

о о нгв с т

й  ст е

77 77 78 82 83 84

89

я

ю ро т к е в

7 49 49 49 50 51 52 ,. 53 54 55 56 56 56 58

й

и ы лд

м

а 5. ч а д З

в х иц кн фу е в ас л к

я

а и цп е о н к

а 4. ынвос О

а 6. ч а д а З 6.1. Опредлни 6.2. Планиров 6.3. тироглА 6.4. тироглА

ы с йт о в в а н о ш лб а

я о ге т

а 3. е а ч уз И

5.1. ине л дерп О 5.2. иц аз шртМау 5.3. тирогл А с мо пщ ь 5.4. иц ази шртМау

ы

я и ц а з л а и ц ес п

4.1. сио П к в ш ни р 4.1.1. ине л дерп О 4.1.2. Ш сте ь ен п ст 4.2. сио П к в б ни у л г 4.2.1. ине л дерп О 4.2.2.ине д жо х а Н

в а Гл

и сал к е ип т

3.1. мсив тоа З и д мже 3.2. ков тгдП а ф ар г 3.2.1. мше а Р , о ка 3.2.2. ио р т С м ар г 3.3. о д яро П к и мо ц я к л п 3.3.1. асекичогпл Т 3.3.2. коври Ма 3.3.3. уос т Д п к ы н см ж е 3.3.4. о хб О д ес в х 3.4. исек чл киЦ е м с и в то а з » к м щ об н е 3.5. «Н а и тпу 3.6. ков тгдП а а ф ар г 3.7. м е р В я ом и ц к я л п 3.8. ащбно еО я а с е к ич о г пл т 3.9. м е р В я о н ь л е л ар п 3.10. ог тИ и

в а Гл

ы

е

и и т и ро г л а

о в ер д

и  

а

м р с т йк е Д

ы

91 95

102zyxwvutsrq 102 102 104 106

8

в а Гл

н а и о С ед р ж

е

а

7. ом тКнеп

ы со т н з я в

7.1. ине л дерп О 7.2. ы н з я в С 7.3. ы н ь ли С

в а Гл

а

е ом т н к е п е мо т н е к п

а

я со т н з я в

9. ынв яе Н

и -б е в и н а р ст

ц

к

117

: о хб

к ар г м

н а ф ар г а

а 13.м тирогл А 13.1.  О б з о р   13.1.1. имцроа ф н И

м

125 127 128

е с и м г ур д

и м ы во ф а р г й к о в ир с т й к ои р в с т

я ор е тп а д

в о ф ар г х со а л к и и н е д ж бс о у

в

и в

и м м

и з LEDA и з SGB

130 131 132 134

137

137 138 144 zyxwv е

ы

е в с т од к у р и BGL

о

ы BGL я о б м ти ро г л а

и м а к е ио т б л и и з BGL с о ф ар г и и з BGL с о ф ар г

о п о со тн ь л е т и до в з р п я ы во ф а р г ы

124

е

е о с е к и ч гп л т е о с е к и ч гп л т

а 11.в стдов к у Р

ь I I . о н ч в арп С а 12. ицпеон К

д е но к

ф

12.1. ицпеон К и д о хб а о ф ар г в 12.1.1. ын авори тнеиро Н е ф ар г ы 12.1.2. Graph 12.1.3. IncidenceGraph 12.1.4. BidirectionalGraph 12.1.5. AdjacencyGraph 12.1.6. VertexListGraph 12.1.7. EdgeListGraph 12.1.8. AdjacencyMatrix 12.2. ицпеон К и л д я и нмез я о ф ар г в 12.2.1. VertexMutableGraph 12.2.2. EdgeMutableGraph 12.2.3. MutablelncidenceGraph 12.2.4. MutableBidirectionalGraph 12.2.5. MutableEdgeListGraph 12.2.6. PropertyGraph 12.2.7. VertexMutablePropertyGraph 12.2.8. EdgeMutablePropertyGraph 12.3. ицпеон К и е л т и с ео п й 12.3.1. BFSVisitor 12.3.2. DFSVisitor 12.3.3. DijkstraVisitor 12.3.4. BellmanFordVisitor

в а Гл

109 110 114

а

117 118

е ы ф ра г ы е он к м ак к с о т а р в зо а ф р о дс н р а В

11.1. ине в ар С 11.1.1.т а т ь л у з е Р 11.2. ог тИ и валг

в а Гл

ь т е нр т н И и и к лс ы

ь

а 10. ив смтйеадозВ

а Чс т

и со т н з я в ы со т н з я в

й о пт

10.1. ин авоз ь лоспИ 10.2. ин авоз ь лоспИ 10.3. и ц а зи л а е Р

в а Гл

109

я

9.1. д Хо 9.2. сио П 9.3. ки стрв Э

в а Гл

ы

8. ын ьмсилкаМ

8.1. ине л дерп О 8.2. а н р еб Р

в а Гл

и

я

145 146 146 148 151 152 153 154 155 156 157 157 159 160 161 161 162 162 163 164 164 165 166 167 168

е

170 zyxwv 170 171

н иа о С е д р ж 13.2. ывоз а Б е м т и ро г л а ы 13.2.1. breadth_first_search 13.2.2. breadth_first_visit 13.2.3 depth_first_search 13.2.4. depth_first_visit 13.2.5. topological_sort 13.3. м тирогл А ы шй а ч и т а р к х е т уп й 13.3.1. drjkstra_shortest_paths 13.3.2. bellman_ford_shortest_paths 13.3.3. johnson_all_pairs_shortest_paths 13.4. м тиро г л А ы ы н ь м ли н а х ы н во с т х е ьв ер д 13.4.1. kruskal_minimum_spanning_tree 13.4.2. prim_minimum_spanning_tree 13.5. и ске чи т а С е мо т н е к п ы с от н з я в и 13.5.1. connected_components 13.5.2. strong_components 13.6. щ уи тс а Р е о м тк н е п ы со т н з я в и 13.6.1. initialize_incremental_components 13.6.2. incremental_components 13.6.3. same_component 13.6.4. component_index 13.7. м тиро г л А ы г о н см ь и л к а о ко т п а 13.7.1. edmunds_karp_max_flow 13.7.2. push_relabel_max_flow

л ав Г

а

14. с а л К

ы

в а Гл

а 15. ке тои лб Б

в

215 215 215 235 243 243 246 247 248 249 250 250 252 256 261 265 271

и LEDA :

а и н е ж о б ар т

15.1. ицпеон К и и н е ж о б ар т й с йт о в 15.1.1. ReadablePropertyMap 15.1.2. WritablePropertyMap 15.1.3. ReadWritePropertyMap 15.1.4. LvaluePropertyMap 15.2. с а л К ы и н е ж аоб р т й с йт о в в 15.2.1. propertyJxaits

9 172 172 176 177 181 182 183 183 188 191 194 194 197 200 200 202 205 207 207 207 208 209 209 212

BGL

14.1. с а л К ы о ф ар г в 14.1.1. adjacencyjist 14.1.2. adjacency_matrix 14.2. ын ь ле тмоспаВ г е сал к ы 14.2.1. graph_traits 14.2.2. adjacency_list_traits 14.2.3. adjacency_matrix_traits 14.2.4. property_map 14.2.5. property 14.3.ы во ф а Гр е р е тп а д ы 14.3.1. edgejist 14.3.2. reverse_graph 14.3.3. filtered_graph 14.3.4.ле т аз к У ь н а SGB Graph 14.3.5. GRAPH и з ке иботл 14.3.6. std::vector

е

й с ойв т в

в

274 275 276 277 277 278 278 278

10

н иа о С е д р ж

е

15.2.2. iterator_property_map 15.2.3. ег Т и сйотв в 15.3. ин а дзо С е и с к ь л е т а во з ь ло п х и н е ж оба р т й с йт о в в 15.3.1.ине ж абор т О я стй о в в л д я Stanford GraphBase 15.3.2.ине ж абор т О е с йо т в в и з std::map

в а Гл

а 16. ын ь ле тмоспВа г е о н ц ке п и 16.1. Buffer 16.2. ColorValue 16.3. MultiPassInputlterator 16.4. Monoid 16.5. mutable_queue 16.6. щюсаеи ксер пе Н я в ст е м ж о н а 16.6.1. disjoint_sets 16.6.2. find_with_path_halving 16.6.3. find_with_full_path_compression 16.7. tie  16.8. graph_property_iter_range

и ф а р г о и бл Б

я

и н е о пл Д

ы н ти в а ф л А

я о ф ар г C++HSTL

й ле т аз к у

ы

и иц кн фу

и

284 284 285 285 286 286

288 288 290 290zyxwvu 290 291

294

е к и ф а р го и б л и ро е Т

, сал к

280 281 282 282 283

и

в

297

ь

297 297

299

у д а рРи ч

zyxwvutsr

  и т е и з а б лЭ

Дж

.  Г . С . Юн

L- Q. L. и,дВнэ

ун,е Б

  и л мЭ

и  Бтеаин А . Л .

р П е ди с л о в и

е

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLK

К о гд а  я  в п е р в ы е  уви де л   э т у  к н и гу , я  п о ч вус т о в а л   з а в и с ть . В  к о н ц е  к о н ц о в   ж елан и е с о з да т ь  б и б л и о етк у , п о дбн у ю   Boost G raph Library  (BG L), п р и в е л о  м е н я  к  о тк р ы ти ю л   в   п р о ф е с о р с к о - п р е п о да в о б щ ен н о г о   п р о гр а м и р о в а н и я .  В   1984  огд у   я   в о ш е те л ь с к и й   с о ат в   П о л и те н х и ч е с к о г о   н у и в е р с и те а   в  Б р ку л и н е , и м е я  н ек о т р ы е , е щ е до в о л ь н о  смнту ы е , и ед и  п о с тр о е н и я  б и б л и о ет к  п р о гр а м н ы х  к о м п о н е н то в . П о  п р а в д е   го в р я , о н и  б ы л и   н а  в от р м   п лан е : в  т о   в р ем я   м о и  и с ти н н ы е  и н етр с ы   к ас ли с ь фо р м а л ь н ы х  о б о с н о в а н и й  есет в н н о г о  я з ы к а , к о е  в  ч е м  н а п о м и н а ю щ ег о   О р га н о н а р А и с от е л я ,  н о  б о л е е  п о л н о г о  и  фо р м а л ь н о г . Я  бы л , н ав ер н о е , е ди н с тв е н н ы м  до ц ен от м  н а  к а ф е др а х  и н ф о р м а ти к и  и  э л е к тр о енх и к и , к т о  с о б и р а л с я  п о лчу и т ь   д о л ж н о с ть , в н и м а те л ь н о  и з чу а я  к аетго р и и  Ари сотел я .  И н те р с н о  з ам еит ь , ч т о  ди з а й н  Standard Template  Library  (STL), в  ч аснт о с т и   леж ащ и й   в  о сн о в е  о н от л ги и  о б ъ ек от в ,  б а з и р у е тс я  н а  м о е м  п о н и м а н и и  тог , ч т о  о тн о ш е н и е  «ц ело - ч асьт » я в л я е тс я   о сн о в п о лаг ющи м  о тн о ш е н и е м , к о т р о е  о п и с ы в а е т  р е а л ь н ы й  м и р , и  ч т о  он о  в о б щ е  н е  п о х ж е  н а о тн о ш е н и е   «э л е м е н т- м н о ж е с тв о » ,  и з в е с тн о е   н а м   и з   те о р и и   м н о ж е с тв .  Р е а л ь н ы е о б ъ ек т ы  н е  и м ею т  о б щ и х  ч асетй : м о я  н о г а  н е  я в л я е тс я  ещ е  ч ь ей - т о  н о г й . Т о  ж е  с а м о е можн о  с к а з а т ь  и  о  к о н те й н е р а х   STL.  Н а п р и м е р  о п ер а ц и и   st d::  1 i st ::  spl i с е   п ер м е щ аю т  ч а с т и   и з  онд о г о  к о н те й н е р а  в  дргуо й   п о дбн о  о п е р а ц и и  п о  п ер с акд е   о р га н о в : мо я   п очк а   — э т о  м о я  п о ч к а , д о   ет х   п о р , п о к а  е е  н е  п ер с а яд т   к о м - у н и бд у ь   рд г о у м . В  л ю б о м   с л чу а е ,  я  б ы л  тв е р д о   бу е ж д е н ,  ч т о  п р о г р а м н ы е  к о м п о н е н т ы   до л ж н ы бы т ь   ф ун к ц и о н а л ь н ы м и   и   о с н о в ы в а ть с я   н а   с и с те м е   ф ун к ц и о н а л ь н о г о   п р о гр а м м и рован и я   Джон а   Б э к ус а   ( J o h n  Backus's  F P system).  Е ди н с тв е н н о й  н о в о й   и де й бы л о   то , ч т о   ф ун к ц и и   м о гу т   бы т ь   св яз ан ы   с   н ек о т ры м и   акси ом ам и . Н а п р и м е р , «а л го р и т м   р су к о г о  к р е с ть я н и н а » , п о з в о л я ю щ и й  в ы ч и с л и т ь  п- ю  с етп ен ь  з а   O(log  n) ш а го в ,  п о дх и т   дл я   лю бо г о   о б ъ е к та ,  д л я   к о т р о г о   о п ред лен а   би н арн а я   ас о ц и а ти в н а я   оп ерац и я .  Д р уг и м и   словам и ,  я   в е р и л ,  ч т о   а л г о р и тм ы   до л ж н ы   бы т ь св яз ан ы  с  те м , ч т о   с е й ч а с   м ы   н аз ы вае м   к он ц еп ц и ям и  (с м . р а з де л   2.3 э т о й   к н и г и ) , котры е  я  о б о з н а ч а л  к а к  с тр ку тр н ы е   ти п ы  (structure types), а  те о р е ти к и   н аз ы ваю т и мтынр огс мн   и ам рг бе ал   (multi- sorted  algebras). ад Уч е й   д л я  м е н я  б ы л о  то , ч т о  в  П о л и те нх и ч е с к о м  ун и в е р с и те е   б ы л   з а м е ч а те л ь н ы й   ч ело в е к   — Аар о н   К е р ш е н б а ум ,  о б л а д в ш и й   г л уб о к и м и   з н ан и ям и  в   о б л а с т и

12

е zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

и в о лс и д е р П

а л г о р и тм о в   н а   гр афа х   и   с тр е м л е н и е м   и х   р е а л и з о в а ть .  аА р о н   з а и н те р е с о в а л с я мои м и  п о п ы тк а м и  р а с ч л е н и т ь  п р о г р а м ы  н а  п р о с ты е  п р и м и ти в ы  и  п р о в е л  м н о г о в р ем н и , о б чу а я  м е н я  г р а ф о в ы м  а л г о р и тм а м  и  р а б о та я  с о  м н о й  н а д  и х  р е а л и з а ц и е й . О н  та к ж е   п оказ а л  м н е , ч т о   ес т ь   ф ун да м е н та л ь н ы е   в ещ и , к о т р ы е   н ель з я   с де л а т ь в  ф ун к ц и о н а л ь н о м  с ти л е   бе з   в ы со к и х   и з м ен ен и й  в  с л о ж н о с ти . Хо т я   я   ч аст о   мо г реали з о в ат ь  а л г о р и тм ы , тр е б ую щ и е  л и н е й н о г о  в р е м е н и , в  ф ун к ц и о н а л ь н о м  с ти л е б е з  и з м е н е н и я  а с и м п то и ч е с к о й  с л о ж н о с ти , р е а л и з о в а т ь   н а  п р а к ти к е   а л г о р и тм ы с  л о г а р и ф м и ч е с к и м   в р ем ен е м   бе з   и з м ен ен и я  с л о ж н о с т и   н а   ли н ей н у ю   я   н е   м ог . В  ч а с тн о с ти , Аар о н  о б ъ я с н я л  м н е , п о ч ем у  о ч ер д ь   п о  п р и о р и те а м  с то л ь  в а ж н а  дл я а л г о р и тм о в  н а  г р а ф х . О н  б ы л  хо р о ш о  о с в е до м л е н  в  э то м  в о п р о с е : К н у т  в  ег о  к н и г е п о  Stanford  G raphBase  [22] п р и п и с ы в а е т  а в то р с тв о  Аар о н у  в  п р и м е н е н и и  ч а с ти ч н о пу о р я д о ч е н н ы х  б и н а р н ы х  де р в ь е в   (binary heaps) к  а л го р и тм а м  П р и м а  и  Д е й к с тр ы . М ы   о ч ен ь  о б р а до в а л и с ь ,  к о гд а   с м о гл и   п о л уч и т ь   а л г о р и тм ы   П ри м а  и  Д е й к с т р ы   к а к  дв а   с л уч а я   о дн о г о   о бо бщ ен н о г о  а л г о р и тм а   (в ы с о к о ур о в н е в о г о ) . Э т о  п р о с т о  з а м е ч а те л ь н о , ч т о  к о д  BG L с ох ж  с  н а ш и м  к о д м  (с м . н а п р и м е р  с н о с к у  в  р а з де й   п ри ме р   н а  я з ы к е   Scheme  п о к а з ы в а е т ,  к а к   дв а   а л г о р и тм а л е   13.4.2).  С л е д ую щ и бы л и   реали з о в ан ы   в  те р м и н а х   о дн о г о   в ы с о к о ур о в н е в о г о   а л г о р и тм а .  Е ди н с тв е н н а я  р а з н и ц а  з а к л ю ч а е тс я   в  то м , к а к  к о м б и н и р ую тс я  з н а ч е н и я  р а с то я н и й : с л о ж е н и е м  у  Д е й к с т р ы   и  в ы б о р о м  в то р о г о   о п ер ан д а  у  П р и м а : (define dijkstra (make- scan- based- algorithm- with- mark make- heap- with- membership- and- values + < )) (define prim (make- scan- based- algorithm- with- mark make- heap- with- membership- and- values (lambda (x у ) у ) < ))

Н а   п ои с и  п о д б н о г й   п омо

к  п о дх я щ е г о   яз ы к а   п р о гр а м и р о в а н и я  д л я   э ф е к т и в н о й  р е а л и з а ци о  с т и л я  у  м е н я  уш л о   п очт и  де с я т ь  л е т . Н а к о н е ц  я   н а ш е л   C + + , к о т ры г   м н е   с о з да в а т ь   п р о гр а м ы ,  п о л е з н ы е   д л я   о б щ е с тв а .  Б о л е е   от г , C + + сер ь ез н о  п о в л и я л   н а  м о й   п р о е к т , о с н о в а н н ы й  н а  м о де л и   м аш и н ы  д л я   С . Ш а б л о н ы  и  п е р е г р уз к а   ф ун к ц и й  — в о т  о с о б е н н о с т и   C + + , п о з в о л и в ш и е  с о з да т ь   STL. Я  ч ас т о  с л ы ш у   о т  л ю де й   в ы р аж ен и я  н едо в л ь с вт а   п о  п о в д у   п е р г р зу к и   в   C+ + , н о , к а к  э т о  о б ы ч н о  б ы в а е т  д л я  б о л ь ш и н с тв а  п о л е з н ы х  м еахн и з м о в , п е р гр зу к а  м о ж е т бы т ь   и сп оль з ован а  н е п р а в и л ь н о . Д л я   р а з р а б о тк и  п о л е з н ы х  а б с тр а к ц и й   п е р г зу к а н ез ам ен и м а . Е с л и  м ы  о б р а ти м с я   к  м а етм а ит к е , т о   м н о ги е  е е  и де и  п о л чу и л и   раз ви ти е  и м е н н о  б л а г о да р я   п е р г р зу к е . В  к а ч ес вт е  п р и м е р а  м о ж н о  п р и в е с т и  р а с ш и р е н и е п о н я ти я  ч и с е л  о т  н арут л ь н ы х   к  ц ел ы м , к  р а ц и о н а л ь н ы м , к  гасу о в ы м , к  jo- иад чески м ч и сла м  и  т . д . М о ж н о  л е г к о  до га дьт с я   о  н е к о т р ы х  вещ а х  б е з  з н а н и я  то ч н ы х  о п р е д лен и й . Е с л и  я  в и ж у  в ы р а ж ен и е , в  к о т р о м  и с п о л ь з юу тс я  о п е р а ц и и  с л о ж е н и я  и  ум н о ж ен и я , я  п р е дп о л а г ю  н а л и ч и е  ди с тр и б тиу в н о с ти . Е с л и  я  в и ж у  з н а к  «м ен ь ш е » и  с л о ж ен и е , т о  п р е дп о л а г ю , ч т о  ес л и zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFED  а<   ,Ь  т о  а  + с<   b + с  (я  р е дк о  с к л а ды в а ю  н е с ч е тн ы е к о л и ч е с тв а ) . П е р гр зу к а  п о з в о л я е т  н а м  п ер н о с и т ь  з н а н и е  о т  о нд о г о  ти п а  к  дргоу м . В аж н о   п о н я ть , ч т о   м о ж н о   п и сат ь   о бо бщ ен н ы е  а л г о р и тм ы ,  п р о с т о   и сп оль з у я п е р г р зу к у ,  б е з  ш а б л о н о в , н о  э т о  тр е б у т  м н о г о  н а ж а ти й  н а  к л а в и ш и . Т о  ес т ь   д л я к а ж до г о   клас а , н а п р и м е р  удо в л е тв о р я ю щ е г о   тр е б о в а н и я м  и те р а то р а  п р о и з в о л ь н о г о  до с тпу а , н уж н о  в р чу н у ю  о п р е д л я т ь  в с е  о тн о с я щ и е с я  к  н е м у  а л г о р и тм ы . Э т о ут о м и т е л ь н о ,  н о   о с ущ е с тв и м о   (н уж н о   о п р ед лят ь   то л ь к о   с и г н а т ур ы :  те л а   бду т т е  ж е ) . Н уж н о  з а м е ти ть , ч т о  н а с тр а и в а е м ы е  м о дул и   (generics) в  я з ы к е  Ад а   тр е б у -

и в о лс и д е р П

е

13 zyxwvuts

ю т  рчну о й   р еа л и з а ц и и  и , помэут , н е  та к  п олез н ы , п оск ль у   ы к жа д й   оал гр и т м нж у о  реали з овы ват ь   ч н в р ую .  Ш аблон ы  C+ +  рше юа т   э т у   п р о б мл е у , п о з в о ля я о п р ел дят ь  таки е  вще и  еи дн оыжд . Ещ е  етс ь   щев и , нжн уы е   в  ощбо не о м  пмаригонв и , н о  нвиа мтсыпедр е в  C+ + .zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA  Ое ын щ б о  аы итгрмо л  — эт о  аориглмыт , коры т е  рюа отб т   с  омабиъкет ю а д о лб щ и м и  пожихм и  и н йерф тсами . Н е  ине ид тчн ы ми , ка к  в  он къбте о- ори не и т р о в ан о м  п рогам и рован и , а  и мне о  пожих м .  И сп оль з ован и е  н е  толь к о б и н ар н ы х  мо д те в  вы з ы вае т  п ромбле у  (см . разед л  2.1.3), и н рейфтс ы  факит ч еск и о п и с ы в аю с т я  с  п омщ ь ю  он д ог о  ти п а  (онд оснрт а я  алебгра) . Е сл и  м ы  вн и мелаьт н о  п осмрит м  н а  объкет ы  врод е  иоератв , т о  увидм , чт о  он и  муог т  бы т ь  оп и са н ы  толь к о  в  трем и н а х  н секоль и х  ти п ов : ти п  смаог о  иорате , ти п  з н ачен и я  и  ти п р а с о тя н и я . Дигрум и  словам и , ни одм хбе о  тр и  тип а , чоб т ы  оплиердт ь  и н ертфй с ы  дл я  онд ог о  ти п а . В  C+ +  лд я  эогт о  н е т  нжн у ог о   ап ар т . В  резльату е   м ы  н е м ож е м   о п р е лд и т ь   и ое р а т ы   и , солведьатн о ,  котм п и л роват ь   о б щ не ы е а лог р и м т ы . Н ап ри м ер , есл и  м ы  оплиерд м  аолгри т м   reduce таки м  образ ом :

,

template typename iterator_traits::value_type reduce(Inputlterator first. Inputlterator last. BinaryOperationWithldentity op) typedef typename iterator_traits::value_type T; if (first == last) return identity_element(op); T result - * first; while (++first !» last) result - op(result. * first): return

result;

}

н о  вмсте о  ++fi rst  !=  last н па и ш е м  + + first  )   ицнтн е о д  в е р ш и н е  и  (и  в е р ш и н е  v).  М н о ж е с тв а  с м е ж н о с т и   верш и н  г р а ф а  н а  р и с .  1.1 о п и с ы в а ю тс я   с л е д ую щ и м   образ ом : Adjacent[a]  =  {b, d) Adjacent[b]  =  [d] Adjacent[c]  =  {a, e) Adjacent[d\   ~ {c,  e) Adjacent[e]  =  {} Дале

е   з ап и сан

ы  и с хо д я щ и

е   р ебр

а   дл

я   к а ж до

й   в ерш и н ы

OutEdges[a]  =  {(a,  b),  (a,  d)} OutEdges[b]  -   {(b,  d)} OutEdges[c]  -   {(с ,  а) ,   (с , е) } OutEdges[d]  = {(d,  c), {d,  e)} OutEdges[e]  =  {} В хо д я щ и

е   р ебр

а   п р е дс та в л е н

InEdges[a]  = {(с,   а) } InEdges[b]  =  {(a,  b)} InEdges[c]  -   {(d,  )с } InEdges[d]  =  {(a, d),  (b,  d)} InEdges[e]  -   {(c,  e),  (d,  e)}

ы   а н а л о ги ч н о

:

:

26

в а Гл

а 1 • и н е  Вд е в

1.2. Гыво ф ар

е

е  концепи

и

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONM

нО д а   и з   о сн о в н ы х   з ад ч   о б щ не о й   б и л и оект и  — оп релди т ь   и н ертф й с ы , к о р ты е   п о з в о ля т   п и сат ь   а л ог р и м т ы ,  н е  з ав и сящ и е   о т   к о н к р не т о й   р ук т с ы г ан д ы х . З ам еит м ,  чт о   п о д zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFED  имойес фтнре   п р о а дз м евс а т я   н е  толь к о  н або р  п ро ои т п о в  фну к ц и й , н о  и  н абор ы  си н актси ч ески х  услови й , так и х  ка к  и м не а  фн у к ц и й   и  и х   амргуен отв ,  сем ан ит чески х   с л оу в и й   (вы з ы ваем ы е   нф у к ц и и  должн ы и м те ь   о п р е лд н ы е  э ф ек ыт ) , гар н ит и  то й  и л и  и н о й  слож н ост и   п о  врмен и и  п ам яит . П о л ь з яс у ь  терм и н олиг е й  и з  кн и г и  «Ообщ не о е  п рогам и рован и е  и  STL» (см . глав у  «Доп лн е и е  к  би бл оргафи ) , м ы  и сп ольез у м  слов о  кон ц еп ц и я  (concept) дл я  обоз н ачен и я  эогт о  боле е  бог та о  оп ленрд и я  и н ерфтй са . Ста-р дн ан я   т к и е о а л и б в шон лаб  (Standard  Template  Library,  STL)  оп релдя т   н аб о р к о н ц пе ц и й  иореатв , коры т е  опсчиебюав т  ощоб не ы й  мна хеи з м  одо хб а  и  до п у тс а  к  пльеонватсд я м  оовкбъет . Аниголча , ррасимтве я  в  эо т й  кн и г е BGL оп реляд т  н або р  кон ц пе ц и й  лд я  и зчену и я  гроаф в  и  м ан и пл у рован и я  и ми . В  дан о м  раз елд е  м ы  расмриот м  эт и  кон ц еп ц и . Приме ы  разелд а  н е  онт соя я к  кон крте ы м  ти п а м  графов . Он и  н ап и сан ы  ка к  ш нолба ы  фн у кц и й , гд е  гра ф  яв л ся е т я  п армоте м  ш балон . Обощ не а я  фн у к ц и я , напи сан а я  с  п омщ ь ю  BGL, м ож е т  п ри м ен ьятс я  к  лю бом у  ти п у  грфа а  и з  BGL и л и  даж е  к  ти п а м  гроафв , опре нле д ы м  п оль з овеламт .  В  разлед е   1.3 м ы  ои д усб м   к о н к н р ет ы е  гроафвы е  ксал ыс , п оасвтляем ы е  вмсет е  с  BGL.

1.2.1. О л е т ас и п

и ш  вир е

н  и  е б е р

В  BGL верш и н ам и  и  рберам и  можн н и п о л яр т у в , н аз ы ваем ы х  ои м я паитсле и м  рре б  (edge descriptors,). Говыфра лд я  свои х   о п и с е л а тй .  Н ап ри м ер е  — указ елти . Ти п ч и с ла , а  дигру п ун т ы  чер з  клас с  graph_traits.  оБле к сла о в  свой ст в  п ри енвд а  в  разелд н и о ст , в  раз елд е   14.2.1. О п и се л а т и   в ре ш и н  вы п олн юя з ат д ь  толь к о  п р и  п омщ и  конркатус п и р о в ат ь  п р и  ниодмебхст и  и л и н ы  оп и селаят м  верш и н , н о  паволюястрде ю С у д л ещ и й  ш абло н  фн у кц и и  демон рсит е у is_self_1oop(), оп леюярд щ йе , яв ляест

р

о  уп равлят

ь  п р

и  п омщ и  «н пе роз чан ы х »  ма  ( vertex descriptors)  и  о- я паитсле е  тип ы  муго т  и сп оль з оват ь  раз ли чн ы е  тип ы , н окреыт е  гроафвы е   итп ы   п р и м не ю я т   ц л ые е 1 ы  дескри п орт в  дл я  граофв г о  ти п а  вдгес а  дос е  пробнд а я  и н форм ац и я  п о  и сп ольз ван и ю е  2.4, а  клас с  graph_traits  ся таеждобу ,  в  чтса  вишнре

т   о нч е  сравн и т

ь  п ри м ит вн ы е  фну к ц и . И х  можн о  со , с о  з н ачен и ям и  п о  умолчан и ю , зе ат м  ско ь  н а  равен сот . Оп и селат и  рбе р  поб д т  дуост п  к  связ ан ы м  с  н и м и  вреш и н ам 2  реали з ац и ю  обощ не о й  н уф кц и я  л и  ррбе о  плйет :

. и

template  bool  is_self_loop(typename  graph_traits::edge_descriptor  e. const Graph& g) {

'  мриТе н   И з  эиксчет ге о  ангола

2

ы  «оьплеитас х   н ж е а р бо с и а  class.

» и  «диркоспет

» ознюач й  дл я  онел ипдр

т  он д я  пор тмеар

о  и  т о  же . — .че имрП  р.де в  шнолба а  м ы  иепсьзлоу

м  typename втсме

о

1.2.ы в о ф а Гр

е и ц п е но к

и

27

typename graph_traits: :vertex__descriptor u. v; u = source(e. g); v = target(e. g): return u == v;

1.2.2.и н е ж арбо т О

е тс й о в в

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJI

Г раф ы  с та н о в я тс я  п о л е з н ы м и  в  в и д е  м о едл й  дл я  з ад ч   и з  с п е ц и ф и ч е с к и х  о б л а с те й п р и  п о м о щ и  а с о ц и и р о в а н и я  о б ъ е к то в   и  в е л и ч и н  с  в е р ш и н а м и  и  р е б р а м и . Н а п р и м ер , д л я  г р а ф а  н а  р и с .  1.1  к а ж да я  в е р ш и н а  и м е т  и м я , с о с то я щ е е  и з  о дн о г о  с и м в о л а , а  к а ж до е  р е б р о   — в е л и ч и н у  з а де р ж к и  п е р да ч и  с и г н а л . В  BG L п р и к р е п л е н н ы е  си.тйвсоам   С щу е с т в еу т   мн ог о  в о з м о ж н о с те й о бъ ек т ы  и л и  в е л и ч и н ы  н а з ы в а ю тс я zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGF дл я  р е а л и з а ц и и , к о т р ы е  м о гу т  б ы т ь  и с п о л ь з о в а н ы  д л я  а с о ц и и р о в а н и я  с в о й с тв а с  в е р ш и н о й  и л и  р е б р о м : ч л е н ы   с т р ук т р ы   (struct); о тде л ь н ы е   м ас и вы , и н де к с и рован н ы е  н о м е р о м  в е р ш и н ы  и л и  р е б р а ; хэ ш - та б л и ц ы   и  т . п . О д н а к о  д л я   н а п и с а н и я  о б о б щ е н н ы х  а л г о р и тм о в   н а  г р а ф х   н а м  н жу е н  ун и в е р с а л ь н ы й  с и н та к с и с  д л я д о с т уп а   к   с в о й с тв а м ,  н е з а в и с и м ы й   о т   то г ,  к а к   о н и   хр а н я тс я .  Э то т   ун и в е р с а л ь н ы й  с и н та к с и с  о п р е д л я е тс я  к о н ц е п ц и я м и инея  оажр бто  ствйсоа  (property m ap). ин е а ж р б т о О   тйвсоа   — э т о   о б ъ ек т ,  о б е с п е ч и в а ю щ и й   о т браж ен и е   и з  м н о ж е с тв а   о б ъ е к то в - к л ю ч е й   в о   м н о ж е с тв о   о б ъ е к то в - з н а ч е н и й .  К о н ц е п ц и и   отбра ж ен и й   свой ст в   о п р ед ляю т   то л ь к о  тр и  ф ун к ц и и : •   get(p_map.  key)  — в о з в р а щ а е

т   о б ъ е к т- з н а ч е н и

•   put(p_map.  key.  value)—п р и с в а и в а е о т в е т с в ую щ е м у   клю ч у   key; •   p_map[key]  — в о з в р а щ а е В   с л е д ую щ е кот ра

мощ ь

дю у щ е с о з да н и свой ст

я   в ы в о ди

м   п ри м ер т   и м я  в е р ш и н

т   с ы лк е   п ри в ед н ы  v д л

е  д л т   з н ач ен и

е  value о б ъ е к ту- з н а ч е н и ю

у   н а  о б ъ е к т- з н а ч е н и е а   о бо бщ ен н а я   да н н о г

а   key; , с о -

. я   ф ун к ц и

о  о то б р а ж е н и

я   клю ч

я   pnnt_vertex_name(), я   с в о й с тв а   namejnap:

template void print vertex name(VertexDescriptor v. VertexNameMap namejnap) — std::cout « get(namejnap, v): } нА а л о г и ч н о  з а де р ж к а  п е р да ч и  с и г н а л а  д л я  р е б р а  м о ж е т  б ы т ь  н а п е ч а т н а  с  п о ю  ф ун к ц и и  pn n t_ tran s_ delay(): template void printjtransjjelay(typename graph_traits::edge_descriptor e. const Graphs g. TransDelayMap delayjnap. VertexNameMap namejnap) { std::cout « "trans- delay(" zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDC   « get(name_map. source(e. g)) « "." « get(namejnap. target(e. g)) « ") = " « get (delayjnap. e): } Ф ун к ц и и   print_vertex_name()  и  prin t_tran s_delay()  буд т   и сп оль з ован ы  в  с л е м   р а з де л е . О то б р а ж е н и я  с в о й с т в  о б сжу да ю тс я   боле е  п о др о б н о  в  гл а в е   15, в к л ю ч а я  п р и е м ы я  о то б р а ж е н и й  с в о й с вт , о п р е д л я е м ы х  п о л ь з о в а те л м . С п о с б ы  до б а в л е н и я в  в  г р а ф  и  п о л уч е н и я  с о тв е с тв юу щ и х   о т бр аж ен и й  о п и с а н ы  в  р а з де л е   3.6.

28

в а Гл

е zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDC

а 1 •и н е д Вве

1.2.3. о хб О

д ф ар г

а

б А с рт а к ц и я  «граф » со сти р а  гр аф , и с ох дя щ и е  и  в ох дя щ и а н а л о ги и  с  STL, BG L и с п о л ь з еу э ти х  н а б о р в . И м е тс я  п я т

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDC т  и з  н ес к о ль к и

х  в и од , с м е ж н ы

е  ребра т   и ет р а о р в  и те р а то р

ь  в и до

в  н або р е  в е р ш и н ы  дл я   о б ес п еч н и в  дл я   гр афо в

в  (collections): в ер ш и н ы  и  реб ы  дл я  к а ж до й  в е р ш и н ы . П о я  до с пту а   к  к аж од м у  и з , о ди н  д л я  к аж одг о  н абор :

1.zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   ар т о е И   и шн в р е   и с п о л ь з уе т с я  д л я   о б х д а   все х   в е р ш и н  г р а ф . Т и н и я   и те р а то р а   в ерш и н  — о п и с а те л ь  в е р ш и н ы . 2.  артоеИ

  ре б а   р еб

и те р а то р 3.  артоеИ

  и с п о л ь з уе т с р   — о п и с а те л

  и щх я д х и со р ебр а м  д а н н о й  в е р ш и н р а . К а ж д ы й  о п и с а те л с тв е   н а ч а л ь н о й  в е р ш и н

4.  артоеИ

я   дл ь   р ебр а

5.  артоеИ

  п р и м е н я е тс ы  и.  Т и п  з н а ч е н и ь  р еб р а , в ы да в а е м ы ы  и  с м е ж н у ю   с  и

  ре б ы  v. Т и п  з н а ч е н и й  э ти м  и те р а то р о м й  v я в л я е т с

 тисон же мс з н ач ен и

я   э то г

а   все

  ре б

  и щх я в д х о р а м  в е р ш и н в ы да в а е м ы ш ину , к  к о т р о

я   о б хд .

  п р и м е н я е тс

 де л а е о   и те р а то р

т   д о с т уп н ы м а   — о п и с а те л

р   гр а ф

. Т и

п  з н а ч е н и

я  до с тпу ь  р е б р а

а   к о  в с е

т  v в  к а ч е с тв , в  к а ч е с тв

. К а ж ды е  к о н е ч н о е   н ач аль н о

и   в ерш и н ы

м  в хо дя щ и й  о п и с а те л й  в е р ш и н й  в е р ш и н ы

г 1.1. ци к н у Ф

з а то р о

я дл

, с м е ж н ы

ь  в е р ш и н ы

е  да н н о й

и ме и

н и ш р ве

н ф а гр

Ф ун к ц и

. Т и

м а п

. , до

в -

,  а   в то

я

а

template void print_vertex_names(const Graphs g. VertexNameMap namejnap) { std::cout « "vertices(g) = { ": typedef typename graph_traits: :vertex__iterator iter_t: for (std::pair< iter_t. iter_t> p - vertices(g): p.first != p.second: ++p.first) { print_vertex_name(*p.first, namejnap): std::c out« ' '; } std::cout « "}" « std::endl: } П ри м ен ен и е  э то й  ф ун к ц и и  к  о б ъ е к т-у г р а ф у ,  м о де л и р ую щ е м у   сет в   (с м . р и с .  1.1),  п р и в о ди т   к  с л е дюу щ е м у   р е з ул ь т а у : ver t ic es(g ) = { a b с

п ри к реп лен н ы п о л ь з уе т с п ри сваи ван и

я т а че п

я

м  реб ь  р е б р ы  и  вер .

К а к   и  о п и с а те л и , к а ж ды й   гр а ф   и м е т   с в о и   с о б с тв е н н ы е   ти п ы   и те р а то р о в с т уп н ы е  и з  к л а с а  graph _ traits. Д л я  к а ж до г о   и з  то л ь к о  ч т о  о п и с а н н ы х  и те р а то р о BG L  и н те р ф е й с  о п р е д л я е т   ф ун к ц и ю , в о з в р а щ а ю щ у ю   st d :: pai г   о б ъ е к то в - и те р а то р о в : п е р в ы й   и те р а то р   ук а з ы в а е т   н а  п е р в ы й  о б ъ е к т   п о с л е до в а те л ь н о с ти р о й   и те р а то р   ук а з ы в а е т   з а   е е   к о н ец .  Ф ун к ц и я   print_vertex_name(),  в ы в о д я щ а н а  п е ч а т ь   и м ен а  в с е х   в е р ш и н  в  г р а ф е , п р и в е д н а   в  л и с ти н г е   1.1. Л ис т н

-

я  д л я   до с туп а   к о   в с е м   и с ох д я щ и я  э то г о  и те р а то р а   — о п и с а те л ь  реб й   э ти м  и те р а то р о м , и м е т  и  в  к а ч е  в е р ш и н у   в  к а ч е с тв е  к о н е ч н о й .

я  д л

я  — о п и с а те л , и м е я  с м е ж н о й

х   р еб

п  з н а ч е

ь   м а р ш р ут и

-

d e }

я   prin t_ tran s_ delay(),  к о т р а я   п еч ат е т   з а де р ж к и   п е р е да ч и   с и гн а л а е  к  к а ж до м у   р ебр у   гр а ф , п р и в е д н а  в  л и с ти н г е   1.2.  В  ф ун к ц и я   ф ун к ц и я  t i e ( )  (и з   boost/ tupLe/ tupLe.hpp) д л я   о с ущ е с тв л е н и я   п рям о г я   и з  st d :: pai г  в  с к а л я р н ы е  п е р е м е н н ы е  f i rst  и  1 a st.

, и  и с о

1.2.ы в о ф а Гр

Л ис т н

е и ц п е но к

и

29 zyxwvutsr

г 1.2. т а ч е П ь е жре д аз к template void prirvt_trans_delays(const Graphs g, TransDelayMap trans_delay_map, VertexNameMap namejnap) { typename graph_traits::edge_iterator first, last; for (tie(first, last) = edges(g); first != last: ++first) { print_trans_delay(*first, g, trans_delay_map. name_map); Std: :cout « std::endl; zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA В ы во д  эо т й  фн у кц и trans- delay(a.b) trans- delay(a.d) trans- delay(b.d) trans- delay(c.a) trans- delay(c.e) trans- delay(d.c) trans- delay(d.e)

и  дл

я  граф

а  с  ри с

. 1.1  ю услдещ и й

:

- 1.2 = 4.5 = 1.8 = 2.6 = 5.2 = 0.4 = 3.3

я  out_edges (), i n_edges () В  доп лн е и е  к  фн у кц и я м  verti ces () и  edges () и мюе с т и  adjacent_vertices(),  окрыт е  и сп ольюз у т  в  качвсет е  амнеурго т в  оп и селат ь  вре ш ин ы  и  объ-ект рга ф  и  воз врща юа т  п ар у  и ерота в . М н оиг е  аолгримт ы   н е  нюажсд ту я   в о  вес м  раз н о браз и и  дп уонст ы х   и ео р а т ров , и н одг а  граофвы е  ти п ы  н е  муго т  п авоирстде ь  э фекит вн ы е  реали з ац и и  дл я вес х  ти п о в  и ерота в . Оосртж н е е  п ри м ен яй т е  в  аолгрим та х   к о н к н р ет ы е  ти п ы р г а фо в , н ель з я  трбеоват ь  о т  н и х  и сп олн е и я  н перждио вамеы х  оп ерац и й . Есл и в ы  п оп ы есат ь  и сп оль з оват ь  гроафвы й  тип , корыт й  н е  п аоврследтя т   е рбу т м у ю   а ло г р и м т м   о п ре а ц и ю , воз н и кн е т  ош и бк а  к ом п и ляц и . С оп рвоаюжд щ а я ак у т ю   о ш и бк у   и н фо р м а ц и я  п ом же т   п о н яь т , к ак я  оп ерац и я  н е  р еали з о в ан а . В  раз елд е  2.5 эо т т  мреиат л  оп и са н  боле е  дальтен о . О п ер а ц и , дп уност ы е  дл я  дан ог о  гроафвг о  тип а , п риневд ы  в  омдкеун ацт и и к  эомт у  ти п у . Р аз ед л  «М леод ь  для » и з  сп равочн ы х  гал в   12- 14  режсоид т  и н фор м ца и ю  о  п роаедвстлям ы х  оп реац и хя , в  н е м  п речи слне ы  кон ц еп ц и , преждио в м еа ы е  дан ы м  гроафвы м  тип ом . Оп реац и , тмеырбу е   н о кр е ы т м  аолгрим т , ан д ы  в  домкеун ацт и и  к  аолргимут , гд е  п речи слне ы  кон ц пе ц и , меырбут е  каж ы д м  п армоте м  алогри мта .

1.2.4.и н а д зо С

е и и ц а к и ф им до

я ф ар г

а

Би б л и о е к т а  BGL п оз в ляе т  оп леирд т ь  и н ерфйт с ы  дл я  добавлен и н и я  врше и н  и  рбе р  граф . В  эо т м  разелд е  м ы  расмроит м  н беольш о з а нд и я  граф , млеиоюдру щ ге о   тес ь  м арш итрзуоа в , и з ображне ы С н ач л а  и сп оль зсету я  фну к ц и я  add_vertex()  лд я  добавлен и я  к  граф п а в рс т е л д я ю щ и х   м а р ш и т р уз о а ы .  Ф ну к ц и я  add_edge()  п ри м ен сяет об ч т ы  добави т ь  сиоед н е и я  мжде у  м арш итрзуоа м и . template void build_router_network(Graph& g, VertexNameMap namejnap, TransDelayMap delayjnap)

я  и л и  уела д й  п ри м е р  со х  н а  ри с . 1.1. у  п ят и  узлов , я  дл я   огт ,

3 0  в а л Г

а  1 ќ инед вВ

е

ь  ротазиушм ь  сине до

я   тес

{ = #1 ncl ude zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   п е р н и о дл ж  *

38

в а Гл

а

1 •  и н е д е в В

е zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFE

г 1.9 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   { пернио дл)ж zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

Л ис т н

#iinclude  #include  #include  int mainO { using namespace boost; color && x == p- >x && у p r ot ec t ed : f l o a t x. y: st d : : s t r i n g c o lo r : }:

П р и   п о п ы кт н е   з а м е с ти л щ а я   ош и бка

е  и с п о л ь з о в а т ь  эот т  к лас а   Poi n t :: equal  (). П р и  с о з да н и :

с  в ы яс н яе тс и  э к з е м п л я р

== p- >y: }

, чт о  ф ун к ц и я  Col orPoi n t :: equal () а  Col orPoi nt в о з н и к а е т  слюеуд -

44

Глав

а 2  • о  Он щ бео

е и н а вмо раи г о р п

е  в  C++zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONM

error: object of abstract class type "ColorPoint" is not allowed: pure virtual  function  "Point::equal" has no overrider ошибка : объек т  абстракног о   п и т а   с алк а   "ColorPoint" н е  стеашрз я создав ть : атсич я   аньл утрив я  фицкну я   "Point::equal" н е  нещ маз а zyxwvutsrqponmlkjihgfedcbaZYXWVUT П о л уч а е т с я , ч т о  п о  п р а в и л у  т и п и з а ц и и  ти п  п а р а м е тр а  ф ун к ц и и - м е то д а  к л а с а в   п р о и з в о дн ы х   клас а х   до л ж е н   бы т ь   ли б о   то т   ж е , л и б о   баз овы м   к лас о м   та к о г о ж е  ти п а , к а к  у  п а р а м е тр а  в  б а з о в о м  к л а с е . В  с л уч а е   с  к л а с о м  Col orPoi nt п а р м е т р д л я   equal ()  д о л ж е н   бы т ь   Point, а  н е   ColorPoint. О дн а к о   эт о   и з м ен ен и е   п р и в о ди т к   д р гу о й   п ро блем е .  В н утр и   ф ун к ц и и  equal ()  а р гму е н т   клас а   Point  до л ж е н   бы т ь п р и в ед н  к  ти п у   ColorPoint д л я   в ы п о л н е н и я  с р а в н е н и я . Д о б а в л е н и е  э то г о  п р и в е де н и я  о з н а ч а е т , ч т о  н а  э та п е  к о м п и л я ц и и  о с та е тс я  н е и з в е с тн ы м , я в л я е т с я  л и  п р о гр а м а ,  и с п о л ь з ую щ а я   ColorPoint, ти п о б е з о п а с н о й .  М е то д у   equal  О   п о   о ш и б к е може т   бы т ь   п е р е да н  о б ъ е к т  др гу о о  «то ч е н о г » к л а с а , в ы з в а в   и ск лю ч ен и е  в р е м ен и   вы п олн ен и я .  Н и ж е   оп и са н   клас с   Col orPoi nt2,  в   к о т р о м   п арам ет р   equalzyxwvutsrq  О и з м ен е н  н а  Point, а  та к ж е  до б а в л е н о  п р и в е д н и е  к  н уж н о м у   ти п у : class  ColorPoint2  :  public  Point { public: ColorPoint2(float  x.  float  y,  std::string  s)  :  x(x).  y(y),  color(s)  {  } virtual  bool  equal(const  Point*  p)  const  { const  ColorPoint2*  cp = dynamic_cast(p); return  c olor  —  cp- > color  &&  x  —  cp- >x  && у   ==  cp- >y; } p rot ec t ed : f l o a t  x.  y: std:  : s t r i n g  c o lo r : }:

Т еп ер

ь   п р е дп о л о ж и м , ч т о   в м е с т о   в и р т уа л ь н ы х   ф ун к ц и й  м ы  б ы   и с п о л ь з о в а л и ы   ф ун к ц и й  д л я   в ы р а ж е н и я   п о ли м о р фи з м а . Т о г д а   ф ун к ц и я   prin t_ equal') а   б ы  б ы т ь   н ап и сан а  та к : template  void  print_equal2(const  PointType*  a.  const  PointType*  b)  { std::cout  «  std::boolalpha  «  a- >equal(b)  «  std::endl: } Д л я   и сп оль з ован и я  э то й  ф ун к ц и и  к л а с с  ц в е тн ы х  то ч е к  н е  н уж да е тс я   в  н а с л е до в а н и и  и з  к л а с а  то ч е к , и  п р о б л е м ы  с  п р и в е д н и е м  ти п о в  н е  в о з н и к а е т . П р и  в ы з о в е  print_equal2()  с  д в ум я   о б ъ е к та м и  т и п а  ColorPoint п а р а м е т р   PointType п р и н и м ае т   з н ач ен и е  ColorPoint, ч т о   п р и в о ди т   то л ь к о   к  в ы з о в у   ColorPoint::equal О . Т е м сам ы м  п о д е р ж и в а е тс я   без о п асн о ст ь  ти п о в . ColorPoint*  a = new ColorPoint(0.0.  0.0.  "blue"): ColorPoint*  b = new ColorPoint(0.0.  0.0.  "green"): print_equal2(a,  b): Т а к   к а к  BG L р е а л и з о в а н а   н а  ш а б л о н а х   ф ун к ц и й , п р о б л е м а  б и н а р н о г о   м е то д а н а м   н е  уг р о ж а е т .  И   н а о б р о т ,  э т а   п р о б л е м а   воз н и кал а   б ы   н а   к а ж до м   ш а ге ,  е с л и BG L  б ы л а   осн ован а  н а  в и р туа л ь н ы х   ф ун к ц и я х .

ш аблон м о гл

2.2.  ощбн еО П р е дм е тн а п ри м ер

е  пимнарвго и я   област , с тр ук тур

ь   STL з а тр а г и в а е ы   м ас и во в   и  с п и с к о в

е  и  STL т   осн овн ы

е  а л г о р и тм , а л г о р и тм

ы   п ои ск

ы   и з  и н ф о р м а т и к а  и  с о р т и р о в к и )

и  (н а . Б ы л о

2.2.о н щ б ео О

мн ог ем лю щ и ние ни

о   «ф ун да м е н та л ь н ы х й  н а б о м  о б о б щ е н н о г К а к   о бъ ясн яю и  к  н е к о т р о 1.  О б н а р уж е н и

»  б и б л и о те к р  да н н ы

р  с тр ук ту

,  к о т р ы х  и  а л г о р и тм о в

о  п р о г р а м и р о в а н и я  (п р о ц е с о т  в  с в о е й  к н и г е  [35]  М а с е й  з а д ч е   с о с то и т   и з  с л е дую щ и е   п о лез н ы х   и  э ф е к т и в н ы

2.  О п р е д л е н и до г о   а л г о р и тм н ы м   бы л

е  и х  о б о б щ е н н о г а   та к и м   образ ом о  к а к  м о ж н о  м е н ь ш е )

3.  О п и с а н и е   н абор р ы х   э т и  а л г о р и тм 4.  С о з да н и бован и й Э то т   п ро ц ес Н а  п р а к ти к т   та к у

е  с р ед . с  о тр а ж е е  п р о ц е с ю  с тр ку тр у

а   (м и н и м а л ь н ы х ы   м о гу ы  р а з р а б о тк

о  п р е дс та в л е н и , ч то б .

е и н а вм о а р и г о р п

е и STL

е   п ы та л и с ь   п р е до с та в и т . О т  н и х  STL о тл и ч а е тс м  и  п р а к т и к о й ) р  и  С те п а н о в , п р о ц е с х   осн овн ы х   ш а го в х  а л г о р и тм о в .

ь   в сео бъ я  п р и м е н е

)  тр е б о в а н и й т   бы т

ь   в ы п о лн ен

,  п р

-

:

и  (framework),  о с н о в а н н о

я  к а ж м   да н

и   уд о в л е т в о р е н и

ы  э ф е к т и в н о

-

. с  О П  в  п р и м е н е

я   (т о  е с т ь  п а р а м е тр и з а ц и й   к  о б р а б а ты в а е м ы

ы   тр е б о в а н и

4 5 zyxwvutsr

-

и   кот

-

. й  н а  к л а с и ф и к а ц и

и  тр е

-

н   в  с тр ук тр е  и  ус тр о й с тв е   к о м п о н е н то в  STL. с  м и н и м и з а ц и и  и  п р о е к ти р о в а н и я  с р е д ы  р а з р а б о тк и  п о др а , гд е  а л г о р и тм ы  н е  з а в и с я т  о т  к о н к р е тн ы х  ти п о в  да н н ы х , з му е в а е с   кот ры м и  р а б о та ю т .  В е р н е , а л г о р и тм ы   п и ш ут с я   дл я   о б о б щ е н н ы х  с п е ц и ф и к а ций ,  к о т р ы е   бы л и   ус т а н о в л е н ы   в   ох д е   ан али з а   п о тр е б н о с те й   э ти х   а л г о р и тм о в . В  а л г о р и тм а х   обы ч н о  тр е б утс я   в ы п о лн ят ь  о бох д  с тр ку тр ы   да н н ы х  и  п о л уч а т ь д о с ту п   к  е е  э л е м е н та м . Е с л и  с тр ку тр ы   да н н ы х  п р е до с та в л я ю т   с та н да р тн ы й  и н те р фей с   д л я   о б ох д а   и   д о с пту а ,  о б о б щ е н н ы е   а л г о р и тм ы   м о гу т   бы т ь   см ел о   см еш ан ы и   с о гл а с о в а н ы   с о   с т р ук т ур а м и   да н н ы х   ( в   те р м и н о л о г и и   STL  — к о н т е й н е р а м и ) . Г лавн ы м   п омощ н и ко м  в  з а д ч е   р а з де л е н и я   а л г о р и тм о в   и  к о н те й н е р о в  в   STL я в л я е тс я zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   а ри т о е   (и н о г д а   ег о   н а з ы в а ю т  м ынещ б о  )меук азтл .   И те р а то р ы а  к о н те й н е р о в  и  до с тпу а   к   э л е м е н та м . И н те р п р е до с та в л я ю т   м е ха н и з м  дл я   о б х д фей с   м еж д у   а л г о р и тм о м   и  к о н те й н е р о м  с тр о и тс я   н а  о с н о в е  тр е б о в а н и й   к  и те р а то р у , к о т р ы м  до л ж е н  с о тв е тс в о в а т ь   ти п  и те р а то р о в  да н н о г о  к о н те й н е р а . О б о б щ ен н ы е   а л г о р и тм ы   н аи боле е   ги б к и , к о гд а   он и   н ап и сан ы  в  те р м и н а х   и те р а то р о в и   н е  п о л а г ю тс я   н а  к о н к р е тн ы й  в и д  к о н те й н е р а . И те р а то р ы  п о др а з де л я ю тс я   н а  н е с к о л ь к о  к а те г о р и й  (в и д о в ) , н а п р и м е р : InputIterator,  Forwardlterator,  RandomAccesslterator.  В з а и м о с в я з ь   м еж д у   к о н те й н е р а м и , а л г о р и тм а м и   и  и те р а то р а м и   п р е дс та в л е н а   н а  р и с . 2.1.

и сР

. 2.1.и н е л е д т О

е о р е нй т но к

в и м оти ро г л а

Б и б л и о те к а   STL  о п р е д л я е т   н або р  тр е б о в а н и В  тр е б о в а н и я х   г о в о р и тс я , к а к и е  о п е р а ц и и  (до п ус ти м ы д л я  да н н о г о  и те р а то р а  и  к а к о в  с м ы с л  к а ж до й  о п е р а ц и и н е к о то р ы е  т р е б о в а н и я  к  и те р а то р у   п рои з воль н ог в   с е б я   тр е б о в а н и я   к   F orwardlterator),  п р и в е д е н н ы

в с щм о ь п

ю ор т ар е ти

в

й  д л

я   к а ж до г о   ви д а   и те р а то р о в е   вы раж ен и я )  о п р е д л е н . Д л я  п р и м е р а  р а с м о тр и о  до с туп а   и з  STL  (о н   в к л ю ч а е е   в   та б л .  2.1.  Т и п   X о з н а ч а е

. ы м т т

46

в а Гл

а 2  • о  Он щ бео

и те р а то р н ы р а то р ы

й   ти п , Т  — ук а з ы в а е м ы ,  m — ч л е н   Т , п  — ц е л о

л а ц би Т

а   2. 1 .  ы р о т о к е Н В ы р а же н и а а а

е  

е   в  C++zyxwvutsrqponmlkjihgfedcbaZYXWVUT

е и н а в мо раи г о р п

е  ч и с л о

е и н а в об е р т Ти

й   ти п .

, U — ти

п   р е з у л ьт а т

я   к р о т иа р е т

п  ч л е н

а   Т . О б ъ е к т

у  го н ь ло в зио р п

а  

ы   а , Ь , и   г  — и те о  дп у тс о

Пр и м е ча н и

-

а   и з  STL

е

*а   —  *Ь

== b

bool

!= b

bool

!(а   ==  Ь )

 О

T& *а з ы а м Р е но и в а е  а a- >m U& (* а ) . т zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQP ++r zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA И з  г  == s еуд лс т  ++r == ++s X& - - Г X& И з  г  == s еуд лс т  - - г  == — s г

Приме

+= n

аТ ко

x&

a +n b - a d i s t a n c e d , a)

и сн о я а т Р

a[ n]

р иП в о д м ы

р  винелсчы

X е й к T

й  с  еинлпока

й  же

, ка

к  п  о т  ++г

{tmp  =  a:  return  tmp  +=  n;} (а    file_dep_graph2; М ы   та к ж е   и з м ен и л и   в то р о й   а р г му е н т   ш аблон а   adjacen cyjlist  с   vecS н а   li st s. Э т о   п р и в о ди т   к   важ н ы м   п о с л е дс тв и я м .  дУа л е н и е   в ерш и н ы   и з   гр а ф а   те п е р ь   вы е   в ерш и н ы  л и н е й н о  п о  ч и с л у   рве п о л н я е тс я  з а  п о с то я н н о е  в р е м я   (с  vecS уда л е н и ш и н   и  р е б е р ) .  С  др уг о й   с то р о н ы , ти п   де с к р и п то р а   в ерш и н ы   боль ш е   н е  я в л я е тс я ц елы м  ч и с л о м , п о э то м у  хр а н и т ь   с в о й с тв а  в  м а с и в а х   и  и с п о л ь з о в а т ь   в ер ш и н у  ка к см ещ ен и е  б о л ь ш е   н ель з я . О дн а к о   о тд е л ь н о е   хр а н и л и щ е   те п е р ь   н е  тр е б у тс я ,  та к к а к   м ы  с о хр а н я е м   с в о й с тв а   в ерш и н  в   г р а ф е . В  р а з де л е   1.2.2  б ы л о  в в ед н о  п о н я ти е  о то б р а ж е н и я  с в о й с тв . Н а п о м н и м , чт о   о т о браж ен и е   свой ст в   — э т о  о б ъ е к т , к о т р ы й  м о ж е т   бы т ь  и с п о л ь з о в а н  д л я   п р е о б р а з о ван и я   клю ч а   (н а п р и м е р ,  в е р ш и н ы )  в   з н а ч е н и е   (н а п р и м е р ,  н а з в а н и е   верш и н ы ) . К о гд а  б ы л и  з а д н ы   с в о й с тв а  д л я   adjacency_l  i st  (к а к  м ы  то л ь к о  ч т о  с де л а л и ) , о то браж ен и я   д л я   э ти х   с в о й с т в   м о гу т   бы т ь   п о л уч е н ы   с   п ри м ен ен и е м   и н те р ф е й с а х   о т браж ен и й PropertyGraph. С л е дую щ и й   ко д   п оказ ы вае т   п ри ме р   п о л уч е н и я   дв у о   — д л я   в р е м е н и   к ом п и ляц и и . с в о й с тв :  о дн о г о   — д л я   н а з в а н и й   в ерш и н   и  др гуо К лас с   свой ст в   propertyjnap  п р е до с та в л я е т   ти п  о то б р а ж е н и я   с в о й с тв . typedef  property_map::type  name_map_t: typedef  property_map::type compi1e_cost_map_t; typedef  propertyjnap': :type н е л О п ид р в ол р я т е д у

е   н ыво и   м а н рт с д

х  тоге

в  сйовтс

в  бы л .

о  б ы  з н чаьлие т

о   щпо р е

, елс

и  б ы  бьшло

е   к о м п ри т ял

в  C+ +

3.7. м е р В

я и ц я мл о и п к

и

71

distance_map_t; typedef property_map::type color_map_t: zyxwvutsrqponmlkjihgfedcba т  объке т  ообртажне и я  свой ст : Ф ну к ц и я  get () воз вращ ае name_map_t namejiap = get(vertex_name, g); compi 1 e_cost_map_t compile_cost_map = get(vertex_compile_cost. g); distance_map_t distance_map - get(vertex_distance, g): color_map_t color_map - get(vertex_color. g); т Д ан ы е  п о  оц не к е  вмрен и  ком п и ляц и и  дл я  кожад й  ц ле и  в  make- айф л е  бу д у р ан х и ь с т я  в  оьлне дот м  фай ле . Ф ай л  чситае я  п р и  пмщо и  std:: i fstream, и  свой ст а з а п и с ы в а ю ст я   в   гр а ф   с   и с п о л ь з о в а н и е м   о тб р а ж е н и я   св о й ст в   namejnap  и  compi 1e_cost_map. Э т и  ообтраж ен и я  свой ст в   ли мею о д р у т   LvaluePropertyMap, а  з н ачи т , и ю ме т  оп реац и ю  operator^ ] ( ), корат я  оожрбает т  и з  дскери по т в  врше и н  в  сыс л к и  н а  сювустоещ и е   о бъ ке т ы  свой ст в  вреш и н . std: :ifstream name_inCmakefi1e- target- names.dat"): std: :ifstream compile_cost_inCtarget- compile- costs.dat"); graph_traits::vertex_iterator vi, vi_end: for (tie(vi, vi_end) = vertices(g): vi != vi_end; ++vi) { name_in » name_map[*vi]: compile_cost_in » compi1e_cost_map[*vi]; } В  сю ущ дели х  ралезд х  м ы  и знме и м  фн укц и и  тоикспгчел й  си ортвк и  и  пиос к а  в  гибн ул , бо тч ы  иптьсзлаов ь  ийефрн т с нжеаирбо т й  сйотвс в  дл я п  ду тсо а  к  сйов ав т с м   ш р ев и н  втсме о  жког тсе о   п ро и ы с н в а и я  дп у тос а   ер ч з  улкеза т ь   н а  миса в .

3.7. м е р В

я и ц ям о л и пк

и

ю С у лд е щ и е  воп рсы , н а  корыт е  н а м  нжн у о  оиветь : «С коль о  врмен к о м п и л яц и я? » и  «С коль о  вмнер и  з ай ме т  ком п и ляц и я  н а  п ьлраен о ре?т » Н а  п ревы й  воп р с  оивте ь  лкего . М ы  п рост о  см уие р м   в р ме ц и и  дл я  вес х  вреш и н  граф . Р ад и  и н рес т а  вы п олн и м  эт о  вы чи слен и н фу к ц и и   std: accumulate. Чобт ы   и с п о л ь з в ат ь   на д у ю   н уф к ц и ю , нжну о рыт , корты е   п р и   р а з ы м ен о в а н и и  дюа т   о и ст м ь   к о м п и л яц и и  дл И е р о та ы  вреш и н  граф а  н е  паволрсюятде т   п о бн д й  воз м жн иост р а з ы м ен о в а н и и   ыв ю а д т   с е к др и п о р т ы   в ре ш и н . Втсме о   н и х   м ы   п р и м не и graph_property_i ter_range (см . разед л  16.8) дл я  гне рац и и  пщяод х и х graph_property_iter_range::iterator c i. ci_end; tie(ci. ci_end) = get_property_iter_range(g. vertex_compi1e_cost): st d : : c o ut « "пон л е мерв я о н ь л е т а во д е с л п й и ц мо я кл п « st d ::ac c um ulat e(c i. ci_end. 0.0) «

В ы во о н ло п

д  эогт е мерв

Т еп р м и  п роц есор в л и р о в ьа т с мат ь  к о м п и ляц и я ч ре з  гра н ы й  пт у ь

о  учкаст я о н ь л е т а в о д е сл о п

а   код

а  бе д у й и ц я м ол и пк

т  таки м

и  з ай м е т м  комп ью я  ком п и ля е  с  п омщ ь ю ы   и р ае т я  верш и н ы . , та к  ка к  п р и м   к л ас с  и ероат в .

: " st d : : e n d l:

: : 21.3

ь  ппрдеолжи м

, чт о  м ы  и ем м  п арлеь н ы . П р и  н али ч и  н ез ави с м ы х  дру я   н о д в р ме н о  н а  раз н ы х  п роц сеха ? Дл я  овте а  н а  эо т т  воп р с  ни одм хбе ф  фай ловы х  з ави с м оейст . И н ач е  говря  чре з  граф .

г  о т  дг ру . С коль

й  сп руекомп ью е т а  ц ел

о  н ай т , н а м  нжн у

й  он о  врмен и  кри тчески о  н ай т

р   с  снот я т  ком п и т  з ан и й  пт у и  смаы й  дли н

-

и  муог и  бе д у

ь -

72

в а Гл

м  BGLzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFE

а 3  • е  Иа ч у з

В клад ы   раз ли чн ы х   ц еле й  в о  в р е м я   к ом п и ляц и и  ф а й л а  libfoobar.a  и з о б р а ж е н ы н а  р и с . 3.3. Ч е р н ы м и  с тр е л к а м и   о бо з н ач ен ы  з а в и с и м о с т и   фай л а   libfoobar.a. П р е д п олож и м ,  ч т о   м ы   жу е   о п р е д л и л и ,  к о гд а   з а к о н ч и тс я   ком п и ляц и я   bar.o  и   foo.o. т   м акси м у о м   в р ем е н   к ом п и ляц и и Т о гд а   в рем я   к ом п и ляц и и  д л я   libfoobar.a  беду д л я   bar.o  и  foo.o  п л ю с   в р ем я   и х   комп он овк и  в  ф а й л   б и б л и о те к и . Т еп ер ь , к о г д а   и з в е с тн о , к а к  в ы ч и с л и т ь   «р а с то я н и е »  («distan ce») д л я   к а ж до й в ер ш и н ы , в о з н и к а е т  в о п р о с : в  к а к о м  п о р я дк е  м ы  до л ж н ы  о б о й т и  в е р ш и н ы ? П о н я т н о , ч т о  е с л и   е с т ь   р е б р о zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   (и,  и) ,  п р и н а дл е ж а щ е е   гр а фу , т о  н уж н о   вы чи сли т ь   р а с то ян и е  д л я   и  п е р д   v, та к  к а к  в ы ч и с л е н и е  р а с то я н и я  д л я   v тр е б у т  з н а н и я  р а с то я н и я   д о   и.   Т е п е р ь   н е о б ох д и м о   п р о с м о тр е т ь   в ерш и н ы   в   то п о л о г и ч е с к о м   п о р я дк е .

ч

ис Р

3.8. Оа нщбое и  псио

kilerapp -   '

. 3.3. Вд а л к

ы ы н  рч и л з а

я а ск те чи го лп у

к  в  гниб у л

Та

к  к а к  б ы л  з а м е н е н  ти п н ы м   и сп оль з оват ь   ф ун к ц и с тв и е  к а с е тс я  н е  то л ь к о neric_dfs_vl(),  к о т р ы й ч и слам и   (э т о   н е в р н о   дл боле е   общ е й   в ер си и   то п о л о г и ч е с к о в   глбуи н у .  П а р м е тр и з а ц и 1.  О тде л ь н ы й ти с м ен а   п а р м е тр в с е х   ти п о в  гр а фо в о х дя т   н а  п о м о щ ж е н  ти п  гр аф

х  це л е

й  в о м ве р

я  ки ц я лмио п

и  libfoobar.a

я  сквори тро

а

 г р а ф

а  с  f 11 e_dep_graph  н а  f 11 e_dep_graph2,  с та л о   н ев о з м о ж ю   topo_sort(),  р а з р а б о та н н у ю   в   р а з де л е   3.4.  Н е с о тв е   гр а фо в о г о  ти п а , н о  и  м а с и в а   col or, и с п о л ь з о в а н н о г о  в  де   п о к аз ы в ает ,  ч т о   де с к р и п то р ы   в ер ш и н   я в л я ю тс я   ц елы м и т   к   с о з да н и ю   да ж е я   fi!e_dep_graph2).  Э т и  п р о б л е м ы   в е ду й   с о р ти р о в к и   и   леж ащ ег о   в   е е   осн ов е   п ои ск а я  ф ун к ц и и  topo_sort () о сщу е с тв л яе тс я   в  н е с к о л ь к о  э та п о в :

п   file_dep_graph  з а м е н я е тс я  н а  п а р м ет р  ш аб ло н аб г р Ь . П р о с та я а   ш аблон а   н и ч ег о   н е  даст ,  ес л и   н е т   с ат н да р нт о г о   и н те р ф е й с а , к о т р ы е  м ы  хоит м   и сп оль з оват ь  с  а л го р и тм о м .  З де с ь  п р и ь   к о н ц еп ц и и  о бохд а  гр а фо в   и з  BG L. Д л я   topo_sort()  н а м   н у , к о т р ы й  м о едл и реу т   к о н ц еп ц и и  VertexListGraph  и  IncidenceGraph.

3.8.а н щ бе о О

2.  И с п о л ь з о в а н и к и м  о гр ан и ч ен и ем п о лаг е т  п р и м е н е н и Э т о  да е т  п о л ь з о в а те л

я а ск е ч и г о л п о т

я к в о р и т р ос

а и сио п

к в н иб у л г

а  уп о р я до ч е н и я  я в л я е тс я  с л и ш к о е  vertex_t* дл я   в ы в о д . О б щ и й  сп о с б  в ы в о д а  п о слеод в аетль н о ст и  э л ем н от е  и етр а от р а  в ы в оад , к а к  э т о  п р о и сохди т  в  а л го р и тм а ю  н а м н о г о  б о л ь ш е  в а р и а н то в  дл я  хр а н е н и я   р е з л у ь та о в

у zyxwvutsrqpon 7 3 zyxwvutsr

м  ж ес т в  п р ед х   STL. .

3.  Н а м  н уж н о  до б а в и т ь  п а р а м е т р  дл я  о то б р а ж е н и я  ц в е то в . Н е о б хо ди м о   чу е с т ь то л ь к о  с а м ы е   с ущ е с т в е н н ы е   м о м е н ты . Ф у н к ц и я  topo_sort()  д о л ж н а   и м ет ь воз м ож н ост ь  о то б р а ж а т ь  де с к р и п то р  в е р ш и н ы  в  о б ъ е к т- м а р к е р  д л я  д а н н о й верш и н ы . Б и б л и о те к а  Boost  P roperty  M ap Library  (с м . г л а в у   15)  о п р е д л я е т   м и н и м аль н ы й  и н те р ф е й с  д л я   о с ущ е с тв л е н и я   э то г о   о т браж ен и я .  В  н а ш е м  с л уч а е   и с п о л ь з уе т с я   и н те р ф е й с  LvaluePropertyMap. В н утр е н н е е   отбра ж ен и е   coiorjnap,  п о л уч е н н о е   и з   гр а ф а   в   р а з де л е   3.6,  р е а л и з уе т   и н те р ф е й с LvaluePropertyMap, та к  ж е  к а к  и  м а с и в  ц в е то в  и з  р а з де л а   3.3.4. Ук а з а те л ь  н а м ас и в  ц в е то в ы х   м арк еро в  м о ж е т  б ы т ь  п р и м е н е н  к а к  о то б р а ж е н и е   свой ст в б л а г о да р я   п е р е г р уж е н н ы м   ф ун к ц и я м   и з   boost/ property_map.hpp,  к о то р ы е а д п т и р ую т   ук а з а т е л и   п о д  и н те р ф е й с   LvaluePropertyMap. В   л и с ти н г о б с уж д а т ь с

е   3.8  п р и в е д н я   о бо бщ ен н ы

а   реали з ац и я   о бо бщ ен н о г о   t o p o so r t O .  Д а л е е  topo_vi si t o r  H generic_dfs_v2().

е   б ду

г 3.8.иц к н у Ф я topo_sort(), а р о т в я ис р е в я template void topo_sort(const Graphs g, Outputlterator topo_order, ColorMap color) { topo_visitor vis(topo_order); generic_dfs_v2(g. vis, color); } С ей ч а с  к л а с с  topo_vi si tor я в л я е тс я  ш а б л о н о м  к л а с а  (л и с ти н г  3.9), к о т р ы й  н жу н о  п р и с п о с о б и т ь  п о д  и те р а то р  в ы в о да . В м е с т о  де к р е м е н т а  в с та в л я е тс я  и н к р е м е н и те р а то р а   вы вод а   (де к р е м е н т   и те р а то р а   вы вод а   з ап рещ ен ) . Д л я   п о л уч е н и я   то г ж е  с а м о г о  о б р а щ е н и я , к а к  в  п е р в о й  в е р с и и  topo_sort(), п о л ь з о в а те л ь   може т   п ер д а т ь   в н ут р ь   о б р а тн ы й  и те р а то р  и л и , н а п р и м е р , и те р а то р  в с та в к и  в  н а ч а л о  с п и с к а

т

Л ис т н

т о .

Л ис т н

г 3. 9.с а Кл с topo_visitor template struct topo_visitor : public default_dfs_visitor { topo_visitor(OutputIteratorS order) : topo_order(order) { } template void finish_vertex(typename graph_traits::vertex_descriptor u. const GraphS) { *topo_order++ = u; } Outputlterator& topo_order; }: О бо бщ ен н ы й   п ои с к  в  г л уб и н у   (л и с ти н г   3.10)  и з м е н я е тс я  ч е р е з   п а р а м е тр и з а ц и ю  т и п а  г р а ф а  и  о то б р а ж е н и е  ц в е то в . Т а к  к а к  н е и з в е с те н  ти п  ц в е та ,  н е о б ох ди м о з а п  р о с и т ь  ти п  ег о  з н а ч е н и й  (с  п о м о щ ь ю  к л а с а  с в о й с т в  property  t r a i t s)  у  ColorMap. В м ест о   и сп оль з ован и я  к о н с та н т , та к и х   к а к  white_color,  м ы   п р и м е н я е м   ц в е то в ы е ф ун к ц и и , о п р е д л е н н ы е   в   co lo r_ t rait s.

Л ис т н

г 3.10. а н щ б ео О я и ц к н фу я generic_dfs_v2() template void generic dfs v2(const Graphs g, Visitor vis. ColorMap color) zyxwvutsrqponmlkjihgfedcbaZY  & п е р н и о дл ж

74

в а Гл

а 3 • е а  Ич у з

м  BGL

г  3.10 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   { пернио дл)ж

Л и с ти н

{

typedef  color_traits ::value_type >  ColorT; typename  g rap h_t rait s< Grap h> ::vert ex_it erat or  v i ,  vi_end: f o r  ( t i e ( v i .  vi_end)  =  ve r t ic e s( g ) :  vi  !=  vi_end:  ++vi) c o l o r [ * vi ]  =  Co lo r T: : whit e( ) ; f o r  ( t i e ( v i ,  vi_end)  =  ve r t ic e s( g ) ;  vi  !=  vi_end;  ++vi) i f  ( c o l o r [ * vi ]  ==  ColorT::whit e()) d fs_v2(g .  * v i .  c o lo r ,  vi s ) ;

} zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA т  и з мне и й , он д ак о  нжн у о  п рои з ве о иЛг ч е с к о е  срежодан и е  dfs_vl  н е  те бру тс и  н беольш и е  м оид ф кац и и  и з - з а  п армиет з ац и и  тип а  граф . Вмтсе о  жкогсте о з ан д и я   vertex_t  в  квачсет е  дсекри порт а   рвш е и н ы  м ы  и з влека м   ю ву тс ве о т щ и й  дсекри по т р  врше и н ы  и з  говгфра о  тип а , и сп ольз у я  ксал с  свой ст в  graphjxaits. П о лн ь с т ю  обощ не а я  вреси я  фн у к ц и и  п ио кс а  в  гби лун у   п р и не в д а  в  ли стн г е  3.11. Он а , в  сщ у н иост , ан алиог чн а  depth_first_  visit О  и з  BG L Л и с ти н г  3.11. Фиц кн у я  dfs_v2() template  void  dfs_v2(const  Graphs g, typename  graph_traits::vertex_descriptor  u, ColorMap  color,  Visitor  vis) { typedef  typename  property_traits::value_type  color_type: typedef  color_traits ColorT: color[u]  -   ColorT::gray(): vis.discover_vertex(u.  g): typename  graph_traits::out_edge_iterator  ei. ei_end: for  (tie(ei.  ei_end)  = out_edges(u.  g): ei  != ei_end:  ++ei) i f  (color[target(*ei. g)] == ColorT::white())  { vis.tree_edge(*ei.  g); dfs_v2(g.  target(*ei.  g). color,  vis): }  else  i f  (color[target(*ei. g)] == ColorT::gray()) vis.back_edge(*ei.  g): el e • ^  .,  ,* • vis.forward_or_cross_edge(*ei.  g); color[u]  = ColorT::black(): vis.finish_vertex(u.  g): } Р еа л ь н ы е  фну к ц и и  BG Ldepth_first_search()  и  topological_sort()  очне ь  по х ж и  н а  обощ не ы е  фн у кц и , корыт е  м ы  раз рболт и  в  эо т м  раз елд . Дальетн ы й п ри м е р   и сп о ль з о в ан и я   н фу к ц и и  depth_first_search()  расм оет н   в  разелд е   4.2, о  в  разлед е   13.2.3. Домкену ацт и я а  п олн о е  оп и сан и е  depth_f i rst_sea rch () п рине вд п о  topological  sort()  анд а  в  разелд е   13.2.5.zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFE

3.9. Врем

я  поньлеар

Тп е рь , кдог а  м ы  и ем м  ощбо не ы у  онпле дри н у , можн о  рше та ь  зча д н о м  ком п ью ре т . Во- првые х , пе рдов а л т зь у ы  в  вокерт е  topo_order. Зеат лд я  тог , чоб т ы  п чоилу т ь   п р ям о

й  компиляц е  топиглксуче я  п нол г м  топ лиг чскеу м  м ы  пи да ер й  топ лиг чсеки

и о  вмнре

ю  сиортвк и  ком п и ляц и ю  сиорт вку м  он трба ы й  п ордя

у  и  п ои с к  в  гиб ул и  н а  п арлеь , сранох и в  ре й  иоерат р  в  topo_sort () к  (а  н е  обрант ы й ) .

3.9. м е р В

я он ь ле л ар ап

й и ц я мл о и п к

и

75

std::vector topo_order(num_vertices(g)); topo_sort(g. topo_order.rbegin(). colorjnap); zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONM

П ре

д  вы чи нсел и е м  вмре н  ком п и лця и и  и одмн хбе о  пови тг д ь  ообржанет и е й  (ег о   м ы  бе д у м  и сп оль з оват ь  дл я   ранх е и я  роезльату в   в ы ч и с л ен и й и  к о м п и ляц и ) (ли ст н г  3.12). Д л я  вреш и н , корыт е  н е  и юме т   ящо д в х и х р  (бе д у м  счи ат ь  и х  инод схы м и  верш и н ам и ) , ини ц и ал з и еру м  и х  расотян и е , та к  ка к  к о м п и ляц и я  эи т х  ц ел й  в  make- айф л е  може т  н ьачст я  сраз у . Вес м м   в ре ш и н а м  п ри сваи сет я  бскеон ч о е  з н ачне и е  расотян и я . Н ай ед м  и с е  верш и н ы , п омчеа я  вс е  врше и н ы  с  вщяод х и м и  в  н и х  ребрам и .zyxwvutsrqponmlkjihg а к и н е лс и ч ы в ю ме рв н и ц я мл о и п к и zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQ г 3.12. к во т г до П graph_traits::vertex_iterator i, i_end: graph_traits::adjacency_iterator  vi. vi end;

р а с о тя н и в р ме н бр е нм е л у и г ру д н о д хы Л ис т н

//  тйан и   ындохси е  внишре ы   етуп м  к т е м о п и   есв х  вишре н  с  вмищядох и   марбе и for  (tied.  i_end) = vertices(g): i !-  i_end; ++i) color_map[*i] -  white_color; for (tied.  i_end) = vertices(g); i != i_end; ++i) for  (tie(vi, vi_end) = adjacent_vertices(*i. g); vi !» vi_end; ++vi) color_map[*vi] -  black_color; //  еуризлацн м   иняотс ар я  в  0, а  дл я  иындохс х  вишре н еави с рп м   мерв я   ицял пмок и for (tied.  i_end) = vertices(g): i != i_end; ++i) if (color_map[*i] - = white_color) distance_map[*i] = compile_cost_map[*i]: else distance_map[*i] = 0: Тпе р ь  вс е  гво т о  дл я  вы чинелс я  роняаст и я . М ы  пи до хр м  чре з  вс е  ршве и н ы , з па и с на ы е  в  topo_order, и  дл я  ко жда й  и з  н и х  онб еяовл м  рноя тсаи е  (п олн о е  вмре я к о м п и л яц и ) д о  ко жда й  сжнме о й  врше и н ы . Э т о  н ьколсе о  осил тчеа я  о т  тог , чт о оп и н а с о  вы ш е . Д о  эог т о  м ы  говри л и  о  тмо , чт о  о т  ко жда й  вшре и н ы  м ы  слремот и «в»врех ' п о  гфра у  дл я  вы чи нелс и я  ронясат и я  д о  эо т й  врше и н ы . Сйеча с  ж е  м ы  пе ли о р ф м е у в а и  вы чи нсел и я  тка , чт о  м ы  пкилаевотр м  ронясат и я  «вн и з » п о  гар уф . П ри ч н а  ткаог о  и з мне и я  сио тс т  в  тмо , чт о  дл я  пне жоди хр я  «вхрев » тубер с те я  ду тос п   к  вщя дои х м  рарбе м  вшре и н ы , а  эго т о  н а ш  ти п  гфар а  н е  птеваялосдр . std::vector::iterator ui; for (ui = topo_order.begin(): ui != topo_order.end(); ++ui) { vertex_t u = *ui; for (tie(vi. vi_end) = adjacent_vertices(u. g): vi != vi_end; ++vi) if (distance_map[*vi] < distance_map[u] + compile_cost_map[*vi]) distance_map[*vi] = distance_raap[u] + compile_cost_map[*vi]; } М ак с и м ал ь н о е  з н ачен и е  расоятн и я  сдре и  вес х  врше и н  деа т  н а м  и ском е  п ол н о е   в р ем я  п ар леь н о й   к о м п и л яц и . Д л я  созанд и я  иоерат в   св о й ст в  п о  рас н яо т и с м  вшре и н  нв о ь  псирнмет я я  graph_property_i ter_range. Ф н укц и я  std:: max_el ement() и сп оль сзет у я  дл я  ннеождхаи я   м ка с и у . graph_property_iter_range::iterator c i. ci_end: tie(ci. ci_end) = get_property_iter_range(g, vertex_distance); П и то р

в  н пнаевлр и

я  сколер т

. —.чеzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDC  Пимр  пве.р

76

в а Гл

а 3 • е а Ич у з

м  BGL

st d : : c o ut  «  "понл е   мерв я  о н ь л е л а р п й   и ц м о я л ик п :  " «  * std::max_element(ci.  ci_end)  «  s t d : : e r d l ; zyxwvutsrqponmlkjihgfedcbaZYXWVU

В  резльату о н лоп

е  бе д у е  м е р в

Д л я   о к жа д ал , оз н ачю щ и ск о м п и л р о в а ным и  сретлкам и

Ри с

т  вы невд

я о н ь л е л а р п

а  так й  и ц ямолипк

й   ц ел и  в  make- йаф ле е  врме я  ег о  свнеобст о н  п р и  п арлеьн о .

я  з ап и сь

:

:  11.9

, и з обржане о

м   н а  ри с и  и  врмея

й  ком п и ляц и й  ком п и ляц и

. К ри тчсеки

. 3.4, п оказ н , з а  корт й  пт у ь  ообз н чае

. zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA 3 . 4 . ме р В я и ц м о ля и п к и и о н а в м о р ул и к а е ме р в я и ц м ол я и п к и л д я о д аж к

3.10. Иго т

и

В  эо т й  глва е  м ы воз н и к н т у ь  п р и р кяд е   нжу о   со б и р ат С к о ль о   в р ме н п р и  расмроент и в ы ч и с л ен и и  аолгрим т П р и  реали з ац и м ы  и сп ольз вал о п т л о и г ч ес к о й мс е т  код а  о н  бы и сп о ль з о в ал и  п иосетл е т м  н ап и сал и  кон крте ы к и  и  обн жарену и М ы   актж е   р а с м о ел т п о з в ли и  п ри п и сат р гаф . П осл е  эогт р и з ац и и  граофв г н ы  топ лоиг ческа п и л яц и и  вес х  фай ло

 п ри мне и л  снаозди и   з ай м е и  топ лиг чсеког и   рше не и и  клас   с о ир т о в к л  п роебаз в я   ц и к ло в ь о  п ои с о  ти п я   с ои р т в к в

ы  дв а  чи с е  о н  бе д у н  чре

й н и ш ре в

т -

ы

и  BGL дл я  пчне оули я  оо тве в  н а  воп ырс , корыт е  му го и  сме итс ы  скроб и  пмнар го о   п нс ч е б о и я : в  кока м  п о ь   ц ле и   make- афй л ?  Н е т   л и   ц и кли ч ески х   з а в и с м о ес й т т   к о м п и л яц и я ?  твеО ы   н а  эт и   воп рс ы   бы л и   ч нп е о у л о  упорчяден и я  ори ен ит рован ог о  граф а  и  ег . м   п о и ск а  в  гби лун й  дл я   павлснетрд и я   р га ф а   фа й л о в ы х   з ав и с м е о с т с   adjacency_l  i st  и з  BGL. Бы л а  н ап и сан а  п арост я  реали з ац и и   и  обн жеару и я   ц и к ло в . П осл е  оп елрнд и я   ощб и н  в  ощоб не у ю  раели з ац и ю  п ои ск а  в  гби лун у . М й  аолгрим т а  дл я  п армиет з ац и и  п ои ск а  в  гби лун у   и  з а х  пилеотс й  дл я  раели з ац и и  топ лиг чсеко й  сиорт в . и   р аз ли ч н ы е   в ар и н т ы   к л ас а   adjacencyjist,  окрыт  свой ст а  (и м я  врше и н ы  и  врме я  к о м п и ляц и ) к  врше и н а к  в  гби лун у   а т с л   ео б л е  ощоб не ы м  барлогд я   п ар м т е а  и  мод те а  п уостд а   к  свой асмт . Н акон ец , бы л и  п ри м не а  и  п ои с к  в  гби лун у   лд я  вы ч и слен и я  врмен и  ком  н а  п арлеьн о м   к о м п ь ю ре т .

т ? ы о й я х ы е м -

ы н во с О м ти ро г л а

е ы н а а ф ар г

4.1. сио П

х

к в шн и р

т

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

у

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFED

П ои с к  в  ш и р н у  (breadth- first  search, BFS) — иод н  и з  осн овн ы х  сп осб в н и я   и н фо р м а ц и и  о  греаф ,  корыт й   м ож н о   п р и м ен и т ь   п р и  рше не и и   м н о ж в се т р аз ли ч н ы х  зачд .  Би бли оект а  BGL и ме т  ощоб не у ю   р еа л и з а ц и ю  п ои ск ри н у  в  ви д е  алогри мт а   breadth_first_search().  оЭ т т  фн у кц и он аль н ы й  ш бало р а м еи т з о в а н , помэт у  може т   ыб т ь  и сп оль з ова н  в о  мн иог х  сиацут ях .  В р а з ел д е  бе д у т  оп и са н  и  п ри мне н  дл я  вы чи слен и я  чи се л  Бэкон а  аолгри т м в  ш и р н у .

4.1.1.и н е л д е р п О

  п ч е о лу

а

а  в  ш и н  па  дан о  п ои ск

м а

я

П ои с к   в   ш ирн у  — оо хб д   ар ф г ,  корыт й   п ощ с е а т   вс и з  дан о й  инодсх й  вреш и н ы . П ордя к  п осще не и я  врше и ян и е м  о т  инод сх й  врше и н ы  д о  кожад й  вреш и н ы  граф щ юа с т я   р ан ь ш е , че м  боле е   а лн е д у ы е . о ри г л т А м   п о и ск а  в   ш и р н у   м ож н о   п а в с ир т е д ь   б ес . Врше и н р а с п р о с ат н с я е т я   о т  кам н я , брош не ог о  в  вуод н с оя т д а х я  н а  оид н аков м  раосянт и и  о т  ин од хс й  вреш и н ы п ор г с т о  граф а  п оказ н  н а  ри с . 4.1. П ордя к  п осще не и я ел ьт н о с т ь   {d}, {/, g},  {с , h, b, e), {а}  (верш и н ы  сп ргу и рован в ер ш и н ы  d). П р и  п осещ ен и и  врше и н ы  v ррбе о  (и,  v), корт е  п ри вле . рм о р бе  Вс е  вмтсе е   р весн д ы е   рбе з ы в с а ет я  м ынвеср д в  шиунр  с  корн е м  в  инодсх й  вреш и н е . Д л я  дан ог о  дрвесн ог ш ин а  и   н аз ы всает я  ,кмо депр   и л и , рме итле д о   лд я   v. Древсн ы о б з н ач н е ы  чрен ы м и  ли н и ям и , а  вс е  оальстн ы е   — среы м и В рш е и н ы  граф а  п омчне ы  кайтишмрч  ринме ятоса К ч рай т ш е е   р а с о тя н и е   5(s, v)  о т   н оркет й   рш в е и н ы м ал ь н о е  коли чвест о  рбе р  в  лю об м  пт у и  и з  s в  v. Кайтишрч

е   в ре ш и н ы н  оп реслядт . Бли ж н и

,  оидст ж м ы

е я   ор а с т ы  п оес

е  верш и н

е   в  ви д ы  н а  грбне . П ои с

е   в о лн ы

е  он д о к  в  ш и р н  вреш и н  и ме т   п о в с л ад е ы   п о  и х  раосянт и о  к  е е  п ощсе н и ю а  оюбрза у

т  двеор о  рбер е   бр е

.  о т  инод сх   5 д о   вреш и н  путь

-

,  корта й  волн

я ы у  дл

я -

ю  о т

, н а  пкисоа а  {и,  v) вер а   н а  ри с . 4.1.

й  вреш и н ы   v — м и н и  — ь тп у , дли н

ы  d. а

78

ко р т г ным к о р ит м

в а Гл

а 4  • ы н Ов о нс

о  равн

е м т и  ар о г л

а  8(s, о ) . П он ят о й  осонбе ьост

. Г лавн о и  крчатй ш и м

В  гвал

е  5 м ы  зйа мес я  смо у

4.1.2. Ш тс е И н ер с т о п е н тс е ра м не н У и в ер с и т е Бк р о м П Ф ас и нр с т у д ол л о фе н р е ак т рм и те ч н ы он о

.  4 . 1и н. е н а р тс о р пс а Р

й  ввосе

и  кйчаштр и х  рарб е

й  Кн и в е

е  п ри лож ен и

й  пт у

а  Бн о кэ

а  в  шн и р

у  п о ф  га р

у

х  пйе т у , в  кыро т , а  н е  тпсор о  чиолс

м  пи г у

х  дил н м  реб

а  пт у р  пи т у

и .

а

а  в  ш и р н у  воз н и кае т  в  п оплярну о й  и рг е   «Ш тсе ь я  ирг ы  сои тс т   в  том , чоб т ы   с в яз а т ь   н кг о е о  ае кт 1  с  К веи н о м  Бэ кон о м  чре з  ц пеочк у  ареоквт , корыт е  сн и м али с ь  в  ки н о  ве тмс , е  че м  з а  ш сет ь   ш оаг в . Н ап ри м ер , Тоед р  р у б с е Х г  (з ажслеун ы й   п р зе и н д т м   р Ге и а   Н р -о т Д а м  в  оасвтке ) сн и м алс я  в  фи ль м е  «Rudy» с  ареокт ,  корты й   с н и м алс я   в   фи л ь м е   «Sleepers»  вмсте е   с   К ве и н о м  Бэ кон ом . о  каки м - т о   н еи з в н ес т ы м   н а м   п ри ч н а м   р т и   н е ад т у с ,  М ай к  Дж и н ел и ,  К рэ й н  яв ляест я  ц ен ралть н о й   ифр о у г й е  и  Бр ай а н  Т елрт , рше и л , чт о  К веи н  Бэ ко ю  иург , вы ч и сля я  сво е zyxwvutsrqp  ч-ис и  раз влеч н и й . М миеатк и  июраг т  в  пожу х  Эа,ше д р  корт е  яв ляест я  чи осл м  робат , н ап и сан ы х  в  соварест ,  — эт о  чи с  оеляд т т   и х  о т  и з нвсет ог о   П л ау я   ш Э е рд а . И рг а  «Ш сет ь  спе тн е й  К веи н а  Бэкон а » н а  смао м  дле е  яв ляест я  зачед й  н а  гар . Д л я  тог о  чоб т ы  павистрде ь  эт у  зча д у  в  ви д е  гафр , нжну о  н аз н ачи т ь  врше и у  дмву я   в р е ш и н ам и  в  то м   чеаслу ,  лсе и у  комжад у   а ерк т у   и  созатд ь   бр е а   ж мд е ы  сн и м али с ь  в  он д о м  фи ль м е . П оскль у  он т ош не и я  мжед у  ареамкт и  си м , рбер а  н е  и юме т  н ап рвлне и й  и  гра ф  псчтаеолу я   н ео р и н и т р о в а н ы м . П р о б лме а  н онеждах и я  чдре ы  ареокт в  д о  К веи н а  Бэкон а  сант ови ст я  тирадц и й  граофв й   з а ч ед й   н о е ж д ах и я   т п у и   ж мд е у  дмву я   в ер ш и н а м и . П оскль у й  К еви н

По

д  а к те р а м

е  п ои ск

ь   м ож е т  бы т ь   н е  еидн вест я  то , чт о  вреш и н ы  с  беол е е   в р ше и н  с  больш и м .zyxwvutsrqpo

у  яв ляест я   п жре д

е  пксио

я  вы чинелс мя , пирпнас ы

ь  се н п е т

х zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQP

, чт о  кчрайт ш и а  в  ш и р н и   п щ еос ю а т

ю   п о и ск и  пмя т у

си Р

с т е я л по д е р

ы  н а а ф  га р

а  Бэ к он а»

и  м ы  б деу

. И ед

м   п он и м ат

ь  и  а к тр и с

.

4.1. с и о П

к в н иш р

у

7 9 zyxwvutsr

м ы  хиот м  н ай т и  пт у ь  с  лид н о й  мне е  ш тсе и  ш овга , в  иале д е  бы л о  б ы  н пе лох о  н ай у  вреш и н ами . К а к  бы л о  п оказ н о  в  пщы друе м   р за е д т и  кчратй ш и й  пт у ь  мжде ле ,  п ои с к  в  ш и р н у  може т  бы т ь  и сп ольз ва н  дл я  ннеождхаи я  кчратй ш и х   й е тп у . П о бн д о  чи сл у   ш е Э др а , м ы е бд у м  н аз ы ват ь  дли н у  кчарйт ш ге о   тп у и  о т  дан ог о ре а к т а   к  К веи н у   Бэ к о н у zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCB  чм о лис  кан.эоБ  В  сю ущ дел м   п р и м ре е  бе д у т  п оказ н о , ка к   и с п о л ь з о в а т ь  фн у кц и ю  breadth_fi  rst_search(), чоб т ы  вы чи сл т ь  чи сл а  Бэ к о н а   лд я  гп ру ы  аеркотв .zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

онд хВ

й  ф а й

В  дна о ан д ы ре сж о д и п о к аз н з в ан и и с п о л ь сз ет у

е  гфар

а

м  п ри ме е  бе д у т  и сп ольз вна а  н ьолбше а я  чтса ь  фи ль м о в  и  реокат в  и з  бза ы х  п о  ки н офи ль м а м  Internet Movie  Database1.  Ф ай л   example/ kevin_bacon.txt т   сп и со к  п а р  реоаквт , корыт е  сн и м али с ь  в  он до м  и  то м  ж е  фи ль м е . К а к о  в  сю ущдел м   р ф м а г не т , кажд я  срокт а  фай л а  срежоид т  и м я  ареакт , н а е  фи ль м а  и  и м я  дог ру о  арект а  и з  огэт о  ж е  фи ль м а . В  качвсет е  раз елди т я я  точ к а  с  запояйт . Дл

о сн о в е

л  и  синадзо

Patrick Stewart;Prince of Egypt. The  (1998):Steve Martin я   н ач л а  п рочиае т м  фай л  с  п омщ ь ю  std: :ifstream  и  си одаз .

м   рг а

ф  н а  ег о

std::ifstream datafile("./kevin- bacon.dat"): if (! datafile) { std::cerr « "No ./kevin- bacon.dat file" « std::endl: return EXITJAILURE;

}

Дл п р и з н ак о в ан и п о л ь сз ет у

я   п а р в с т е дл н и м  тог я  вреш и н а я  дл

я   р фа г а   и с п о л ь с з ет у , чт о  гра ф  н еори ен ит рован ы й м  и ме н  арековт , а  ррабе я  одбавлен и я  эи т х  свой ст

я   adjacency_list,  a undirectedS  жислу . К а к  и  в  разелд е  3.6, дл я  присваи м  — н аз в н и я  фи ль м о в  клас с  property и с в  врше и н а м  и  рберам .

typedef adjacency_list Graph; Graph g; Д л я  дп уост а  к  свойаст м  объкет ы  оображтне и н ы   и з  граф . Сю у длещ и й  ко д  овитг т  э т и  ообртажне и я юз у с т я  дескри п ортам и  вреш и н  и  рбе р  дл я  п уостд

й  свой ст

в  должн , корыт

а  к  связ ан ы

ы  бы т е  п ознд е м  с  н и м

typedef property_map::type  actor_name_map_t: actor_name_map_t  actorjiame = get(vertex_name. g ) ; typedef property_map::type movie_name_map_t; movie_name_map_t connectingjnovie = get(edge_name. g): Ф ай л  чисает я  прочстн о  и  раз би срает я  в  сп и со к  лкемс , разелнд ы м и   с  з ап оятй . Дл я  созанд и я  «вльаниу ртог » кон йе тн ре а  лкес м  и сп оль зте у л и ео к т а  лкеси чеког о  раз бор а  Boost Tokenizer Library. К о д  дл я  рза бор ным и  п ри евд н  в  ли ст н г е  4.1.

Internet Movie Database ис те пьзслуо ф а   к  и х  «Ол куар у   экБон »а

я о те  фьл ука .

м  ии кнтмароф

и  Утнеиср в

ь  пчеолу е  и сп оль и  и мне ам

а  Вжи ндр

-

.

х  точка а  фай л

т

я  би б а  дна

и  дл я  фа

-

-

80

в а Гл

а 4  • ы н Ов о нс

е  м т и р о г л а

ы  н а а  гф а р

х zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQ

Л ис т н

г 4 . 1 .   о б з Ра р л  фай а  с м ы дн а и zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA for (std::string  line: std::getlineCdatafile.line): ) { char delimiters_separator  sep(false, "",  " ; " ) : tokenizer  line_toks(line. sep): tokenizer::iterator i = line_toks.begin(); ( Втяз ь   м и я  пговре о  аретк а  и  тивабод ь   нишрев у  к  гфар у  ) second; оВ р а т

а е кр о т в оби з о в ан и я

я  лексм . Онд ак х  акертов

а  (н аз в н и о  рбре . П оэмт

е  фи ль м а о  н е  може у  н аз вн и

) з акреп слят т  бы т ь  сонза д е  фи ль м а  сранохс тея

.   ќ

, п ок

я  з а  ррбоме а  н е т  дескри п орт я  дл я  пю у щодсел г

, си доен юя щ и

м  дву н  дл

в  врше и о   и сп о ль

х я -

4. 1 . с и о П Т р е ть е

й   лек сем о й   в ерш и н

в е т с в ую щ е

й   я в л я е тс ы   и с п о л ь з уе т с

я   им

я   в то р г о   а к те р а я   от т   ж е  с п о с б

.  Д л я   в к л ю ч е н и , ч т о   и  д л

к в нир ш

у

я   в   гр а о   а к те р а

я   п ер в о г

ф   со т

8 1 zyxwvutsrq

.zyxwvutsrqponm

(zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   тязВ ь  им я го ртв о  аретк а  и  дтивабо ь  к  гф а р у  )  s tietpos, inserted) = actors.insert(std: :make_pair(*i, VertexO)); if (inserted) { v = add_vertex(g):zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA actor_name[v] = * i ; pos- >second = v; } else v = pos- >second: Н а   п о с л е дн е

м   ш аг е   до б а в л я е о   и х  ф и л ь м а е   р ебр а   н е  п о п а д ю

о б ъ е ди н я ю щ е г п арал ель н ы

. Т а

м   ребр к  к а к  дл т   в  г р а ф

о   м еж д я   п а р а м е тр .

у   а к те р а м

( тив аб До ь рб е о , щ ею а в ы з я в с е ув д х е рт а к о в , к ф ар г graph_traits< Graph> ::edge_descriptor  e; t i e ( e ,  insert ed )  =  add_edge(u,  v.  g ) ; i f  (inser t ed )  connecting_movie[ e]  = moviejname;

и с В ын е ч л

е  чисе

В  н аш е Бэ к о н и х  хр а н и ть с к р и п то р н а   м о гу

м  п о хд а   в ы ч и с л я ю тс

л  Боэнк

а  с  пом ощ ь

и   и  з а п и с ы в а е а   EdgeLi st  и с п о л ь з уе тс

м   н аз ван и е я   sets,  т о

у > •

ю  поис к

а   в  ш ир н

у

е   дл

я   в ы ч и слен и я  ч и с е л   Бэ к о н а  с  п о м щ ь ю  п о и с к а  в  ш и р и н у   ч и сл а я   дл я   в се х   в ер ш и н   гр а ф а   и   п о э то м у   н е о б ох д и м о   г д е - н и б ду ь . Т а к  к а к  м ы  и с п о л ь з еу м   adjacencyj  i st  с  п а р м е тр о м  VertexLi st= vecS, де ы  в е р ш и н  я в л я ю т с я   ц елы м и  ч и с л а м и   и з  ди а п а з о н а   [0, |zyxwvutsrqponmlkjihgfedcbaZ  V |). Ч и с л а   Бэ к о т  б ы т ь  з а п и с а н ы  в  std:: vector, и н едк с о м  к о т р о г о  бед у т  де с к р и п то р  в е р ш и н ы .

std::vector  bacon_number(num_vertices(g)):

лА г о р и т в ерш и н с о т в е т с в ую щ е (и м я - в е р ш и н а )

м   breadth _first_search ()  п р и н и м а е у   и  и м е н о в а н н ы е  п а р а м е тр ы .  И с хо дн а й   К ев и н у   Бэ к о н у , и  м о ж е т   бы т . Ч и с л о  Б э к о н а  дл я  с а м о г о   К ев и н

т   т р и   а р г му е н т а :  г р а ф я   в ерш и н а  до л ж н а   бы т ь   п о л уч е н а   и з  о то б р а ж е н и а  Б э к о н а  р а в н о , р а з ум е тс я

,  и с хо дн у ь   в ерш и н о й

ю , я   actors ,  н лу ю .

Vertex  src  = actors["Kevin  Bacon"]; bacon_number[src] = 0;

Дл п ту е й н и е   дл в   а л го р и т м о д е л и р ую щ и л я ть с др е в е с н о с  р е а л и з а ц и е о с т а в ш и хс ун и в е р с а л ь н ы м ны й   Лист ин

я   вы ч и слен и . В  ч а с тн о с ти я  v м о ж е м   п ои ск

я   чи се л   Бэ к о н а   ф и к с и р ую т с я   р а с то я н и я   в до л ь   к р а тч а й ш и х у  (и , v), р а с то я , к о гд а  п о и с к  в  ш и р и н у  н а ох ди т   др е в е с н у ю   г ду т   бы т ь  в ы ч и с л е н о  к а к  d[v]  zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFE template  void  find_loops( typename graph_traits::vertex_descriptor  entry. const Graph& g, Loops& loops) // Кенйто р  с  нор ба м   ишрев н •

function_requires(); typedef typename graph_traits::edge_descriptor  Edge: typedef typename graph_traits::vertex_descriptor  Vertex; std::vector back_edges; std::vector color_map(num_vertices(g));

Н а   п ер в о м  ш а г е  с о з да е тс я   back_edge_recorder  и з  DFSVisitor, к о т р ы й  бдеу т  з а п и сы ват ь   о б р а тн ы е  р е б р а   в о  в р е м я  п о и с к а  в  гл бу и н у .  Ч т о б ы  с де л а т ь   э то т   к л а с с  п о в то р н о   и с п о л ь з уе м ы м ,  м е ха н и з м   хр а н е н и я   о б р а тн ы х   р еб р   н е  з а д н ,  а  п а р м е т ри з ова н   к а к   Outputlterator.  К л а с с   back_edge_recorder,  к а к   о б ы ч н о ,  н а с л е ду т   defaul t_df s_vi  si tor, с  те м  ч то б ы  и м е т ь  п су ты е  з а г л уш к и  д л я  ф ун к ц и й  с о б ы ти й н ы от ч е к , к о т р ы е  back_edge_recorder  н е  о п р е д л я е т . Р е а л и з о в а т ь  н жу н о  то л ь к о  ф ун к ц и ю - м е то д   клас а   back_edge().  В   л и с ти н г е   4.5  п р и в е д н ы   код ы   ш аблон а   клас back_edge_recorder  и  ф ун к ц и и  д л я   п о р о ж де н и я   о б ъ е к то в  э то г о   к лас а .

и з х а

86

в а Гл

а 4  • ы  Он в о нс

г 4.5.   с а Кл

Л ис т н

е м т и ар о г л с ро  рт а р тси г е

х zyxwvutsrqponmlkjihgfedcbaZYXWVUTS

ы   н а а  гф а р а  оы н т а рб

х  ре б е

р zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJ

: : ve r t e x j t e r a t o r  v i ,  vi_end: f o r  ( t i e ( v i .  vi_end)  =  ve r t ic e s ( g ) :  vi  !=  vi_end:  ++vi) i f  (reachable_from_head[ * vi] !=  Co lo r : : whit e( ) &&  r e ac h ab l e _t o _t ai l [ * vi ] !-   Co lo r : : whit e( ) ) l o o p _s e t . i n s e r t ( * vi ) :

Ри с

. 4 . 5 . ы н и ш ер В

, и з ы р от к

х е п тс у о д

н ло б

к  Вzyxwvutsrqponmlkjihgfedc 7

чадаЗ и н е д жо х а н ш й а чи т а р к

и я х е т уп

В  эот й  глав е  м ы  рше а м  н кеорыт н и е м  аолгрим т в  ннеождхаи я ч йа ш г е о   тп у и   о б ъ я с н я е т я  в н и я .  оВрт й   р аз е д л   я в л е ст Т ри ет й  и  чвыерт й   р а з ле д ы о кт л а   м а р ш и т р зу а ц и и   п а о к ет р и м то в  с  п омщ ь ю  BGL.

5.1.и н е л д е р п О у т мП е акт я

я

 н аз ы всает , чт о  кожад е а  с о  сю ущдел о   тп у и   о к ж а д я  ка к

не ч йа ш г е о п р е л с дя т

й

е  зачд  кчйарт ш и  ощб е я   к р иа т   о п и с ы в юа

и  м арш итрзу ац и х  пйе т у е   и  н ап оми н аю с т

м   ви д

м   нев д и е т  дв а  н аи боле в  и  павлсюятрде

zyxwvutsrqponmlkjihgfedcbaZYXWVUT

и  поакте м  рлзеа д я  н окерыт

. В  п рвое м   в   п на к е т у е  чсат т   р ае л и з а ц и

в  с  и сп ольз ва е  п ромбле е  оплерд ю   м а р ш и т р уз а ц и ю о  и сп оль зем ыу ю   и х  осн овн ы

а  ктра

.

х  п ро х  аолг

-

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCB

я   п о л е ь вс д а т н о с т ь   в ре ш и н    в  граф е   G =  (V, Е ) ,  и з  реб р  (х> „ vX4l)  ниосдтах я  в  н обар е  Е (к аж дя   в ре ш и н а  си дое й   в р еш и н о й  п оследваьтн оист ) .  В  зча д е   н о еж д а х и я   к р та е   рб е о  (и,  v) и ме т   ев с  w(u, v). Все  пути  (и л и  диан л  пути)  см у а  восе в  кго жад о  рбре а  пи т у :

4- 1 w(p)  =  Yw(vitvi+l).zyxwvutsrqponmlkjihgfedcbaZYXWVUT

i- 0 Все в ес

 Ъ{и,

 v) кагйетшроч

х  воз м жн ы

 пути й  и з  и  в  о . Е сл

х  пе т у

 и з  врше и н и  пт у

ы  и  в  верш и н и  и з  и  в  v н е  сщте ув с

у  v — эт о  м и н и м у м  всое , 5(м , v) -   »:

в

f  min{w(p):u- +v}

айитшмрч К ш ге

 путме о  пит у

. П ри м е  кагйетшроч

а ч дЗ чйа ш г е

о  пи т у

 н аз ы всает р  кчарйт ш ге

о  пт у  пути

, сиоден юя щ ге

у д же  м о  дв е  дан ы

я  лю об и  п оказ  дя вум

й  пь т у

, ве с  коргт о  раве н  все н  н а  ри с . 5.1. и ашнмвре  сои тс т  в  ннеождхиа е  вреш и н ы . За ч д  кайтишхрч

у  кчратй

и  ктра

 путйе

 из

90

в а Гл

а 5  • ч За д а

и и н е д  нж о х а

я ш й иа  кч т а р

х  е т у п

й zyxwvutsrqponmlkjihgfedcbaZYXWV

 виышнре   з а к л ю ч а е тс zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA я   в  н а хо ж де н и и   к р а тч а й ш е г о   п ту и   о т  з а д н н о й  в е р ш и н ы  д о  в с е х   др уг и х   в ерш и н  г р а ф .  Н а б о р  к р а тч а й ш и х   п т еу й , и с хо дя щ и х   и з  о дн о й в ерш и н ы , н а з ы в а е тс я  дмвеор  кайтишхрч   п у т й е.  За ч д  кагйетшроч  пути  - же м у д   и мв е с  пи амр   и шн в р е   гр а ф а   с о с то и т   в   н а ох ж д е н и и   к р а тч а й ш и х   п ту е й   и з  к а ж до й   в е р ш и н ы  г р а ф а   в  к а ж ду ю   д р гу ю .

й он д о

и сР

. 5.1. Кшй аи ч т а р

й  пт у

К а к   оказ алось , д л я   р е ш е н и м и   н е  с ущ е с тв уе т   а л г о р и тм о в м и ,  ч е м   а л г о р и тм ы   дл я   р е ш е н и Б и б л и о те к а   BG L  в к л ю ч а е т к р а тч а й ш е г о  п ут и   и з  о дн о й Ф о р да .  Т а к ж е   BG L  в к л ю ч а е у   в сем и  п а р а м и п ут е й   м еж д л А г о р и тм ы   н а хо ж д е н и я о б л а с тя х .  О д н и м   и з  в а ж н ы п а к е то в   в  И н т е р н е т . П р о т к о л ы та м и  п р и  п е р е да ч е  ч е р е з  И н те р н е т со к ращ ен и я   в рем ен и   п р о х ж де н и

5.2. Ми ц а зи штруа К о гд т е н -и р а к лт о п р п ак е та к и Е сл то р ы рам и

а  к о м п ь ю те

ь  о т  вш нрие

я  з а д ч ,  к о т р ы я   з ад ч   в   с е б я   дв  в е р ш и н ы т   а л го р и т  в е р ш и н .   к р а тч а й ш и х   со в р ем ен н ы , к о т р ы , и с п о л ь з ую я   п ак ет

я  в т е н р  Ие т н р   о тп р а в л я е

ы zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQP  а  д о  е е ч а н зоб н м чы н р е и м а к л е ср т и

и   к р а тч а й ш е г о   п ту и   м еж д у  дв ум е   бы л и   б ы   а с и м п то и ч е с к и   боле и   к р а тч а й ш и х   п ут е й   и з   о дн о а   к лас и ч еск и х   м е то д а   дл я   р е ш е н и : а л г о р и т м  Д е й к с тр ы   и  а л г о р и т м м   Дж он сон а   д л я   н а хо ж д е н и я   х   п т еу й   ш и рок х   п ри м ен ен и е   уп р а в л я ю т   а л г о р и тм а  д о  ег о  н а з н а ч е н и я

о   п р и м е н я ю тс й  я в л я е т с т   и н фо р м ац и о н н ы м ы  к р а тч а й ш и

я   в ер ш и н а е   б ы с рт ы й   в ерш и н ы я   з ад ч   Бел м ан а к р а тч а й ш и

, и х

я   в о   м н о ги

х

я   м а р ш р ут и з а ц и

я х  п теу

и  п а к е й  дл

я

.

е

т   со бщ ен и е  др гу о м у   к о м п ь ю те р у   с  и с п о л ь з о в а н и е м   ( I P ) , содер ж и м о е  с о б щ е н и я  ук л а ды в а е тс я   в  п а к е т . К а ж ды й т  п о м и м о  да н н ы х  с о б щ е н и я  (п о л е з н а я  с о с та в л я ю щ а я ) в к л ю ч а е т   м е ат д н н ы е , е  та к  а др е с а   и с то ч н и к а  и  п р и е м н и к а , дл и н а  да н н ы х , п о р я д к о в ы й  н о м е р  и  т . п . и   со бщ ен и е  б о л ь ш о е , да н н ы е   р а з б и в а ю тс я   н а  м е н ь ш и е  ч а с ти ,  к а ж да я   и з  к о х   п а к уе т с я   о тде л ь н о .  И н ди в и дуа л ь н ы е  ч а с т и   сн абж ен ы   п о р я дк о в ы м и  н ом е , т а к  ч т о  и с хо дн о е  с о б щ е н и е  м о ж е т  б ы т ь  с о б р а н о  н а  п р и н и м а ю щ е й  с то р о н е . Е сл и   а др е с   н аз н ач ен и я  д л я   п а к е т а   н а хо д и т с я   вн е   л о к ал ь н о й   с е ти ,  п а к е т   от п р а в л я е тс я   с   и с хо д н о й   м аш и н ы   н а  итен-р утришза о ма   (in tern et  router). М а р ш р ут и з а т о р  н а п р а в л я е т  п о л чу а е м ы е  п а к е т ы  др гуи м   м а р ш р ут и з а т о р а м ,  и с ох д я и з   та б л и ц ы  м а р ш р ути з а ц и и , к о т р а я  с о з да е тс я  н а  о с н о в а н и и  п р о т к о л о в  м а р ш р у ти з а ц и и . П уте ш е с тв у я   с  о дн о г о  м а р ш р ути з а то р а   н а  с л е дую щ и й   (т о  е с т ь  с о в е р ш а я ,дхеопр   hop),  п а к е т ы   п ри бы ваю т   н а   м ест о   н аз н ач ен и я . Е с л и   с е т ь   п е р г р жу е н а , т   бы т ь   п о те р я н ы . Д л я   н а де ж н о й   до с та в к и   п р и м е н я ю тс я н ек о т ры е   п ак ет ы   м о гу п роткол ы  б о л е е  в ы с о к г о  ур о в н я , н а п р и м е р  пклто р инея уапврл   й е а ч д е пр   (Transmission  C on trol P rotocol, T C P ) . О н  и с п о л ь з уе т   к в и ти р о в а н и е  (ус та н о в л е н и е  с в я з и ) м е ж д у   о тп р а в и те л е м   и  п о л чу а те л м ,  ч то б ы   п о те р я н н ы е  п а к е т ы   п е р е да в а л и с ь

5.3.ти ро г Ал

вн овь ж е т  б ы т уз л а м К он еч н а н аз н ач ен и м н о ж е с тв м а р ш р ут и з а т о р о в собн ост м еж д З ад ч к а ж да м а р ш р ут и з а т о р а м п ус к н а н а   ри с м а р ш р ут и з а ц и

м - а ндмрал Фо е Б

.  П р о г р а м ь  и с п о л ь з о в а н   И н те р н е та

а и и ц а з и т шур м а

а   с и с те м а  д л

я с щ м оь п

ю ро т к е в

9 1 zyxwvutsrq й

ы   U nix  traceroute  (и л и   е е  Windows- а н а л о я   п ро слеж и в ан и я  п ту и   о т  в а ш е г о   к о м п ь ю те р

г   tracert) м о а  к  др уг и м

. я  ц е л ь  п р о ц е с а  м а р ш р ути з а ц и и  с о с то и т  в  до с та в к е  п а к е то в  д о   п ун к т а я   к а к  м о ж н о   б ы с тр е .  Н а   п р о д л ж и те л ь н о с т ь   до с та в к и   п ак ет а   в ли яе т о   ф а к то р о в , н а п р и м е р   к о л и ч е с тв о   п е р ох д в   (hops),  з а де р ж к и   в н ут р и , з а де р ж к и  п е р да ч и  м е ж д у  м а р ш р ути з а то р а м и , п р о п ус к н а я  с п о ь  с е т и  и  т . д . П р о т к о л  м а р ш р ути з а ц и и  до л ж е н  в ы б и р а т ь  н а и л уч ш и е   п ту и у  м а р ш р ути з а то р а м и   — эт а  и н ф о р м а ц и я  хр а н и тс я  в  та б л и ц е  м а р ш р ути з а ц и и . а   м а р ш р ут и з а ц и и   може т   бы т ь   с м о де л и р о в а н а   в   в и д е   гр а ф ,  в   к о т р о м я   верш и н а  я в л я е т с я  м а р ш р ути з а то р о м , а  к а ж до е   п рям о е  с о е ди н е н и е  м е ж д у и   — р е б р о м . Р е б р у  п р и п и с а н ы  та к и е  да н н ы е , к а к  з а де р ж к а  и  п р о я   с п о с о б н о с ть .  Г р а ф   д л я   п р о с то й   с е т и   м а р ш р ут и з а т о р о в   п р е дс та в л е н . 5.2.  У   с о е ди н е н и й  о б о з н а ч е н ы  с р е дн и е  з а де р ж к и   п е р да ч и . Т е п е р ь   з ад ч а и   св ед н а   к  з а д ч е   к р а тч а й ш и х   п т уе й .zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQ Г  

\

1.2ms j j , F и сР

5.3. тиро г л А с м ощ п ь Н е к о то р ы

. 5.2.ы ро- т ае знир е тш рму на И

ю ро т к е в

р  р а с то я н и й у  р а с то я н и

G

\^ ,ы н е н и д еос

е ур д

м - а нм алд р е БФо е  и з  п е р в ы   а ц и м р о и фн

уйтронш ма в е к то р е  о ц е н к

а и н я о тс а р

а и и ц а з и шт м р у а а и н я о тс а р

г с о г ур д

м

я

й

х   и н те р н е т- п р о т к о л о в  м а р ш р ути з а ц и и , н а п р и м е р zyxwvutsrqponmlkjih   к лт о п р   (R outin g Information P rotocol, R I P ) [19], и с п о л ь з о в а л и . О с н о в н а я  и де я  R I P — п о д е р ж и в а т ь   н а  к а ж до м   м а р ш р ут и з а т о х  м а р ш р туи з а то р о в  и  п е р и о ди ч е с к и  с р а в н и в а т ь я  д о  в с е х  др гуи

92

в а Гл

а 5 • ча даЗ

и н де ж о х на

я и ш й а ч т а кр

х ет у п

й zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLK

и  с о  с в о и м и  с о с е дя м и . Е с л и  м а р ш р ути з а то р  уз н а е т  о  б о л е е  к о р о тк о м zyxwvutsrqp  пути эт и   з ап и с д о  н е к о т р о г о  п ун к т а  н а з н а ч е н и я  о т  о дн о г о  и з  с в о и х  с о с е д й , о н  о б н о в л я е т  з а п и с ь о   р а с то я н и и  д о  э то г о  п ун к т а  и  и з м е н я е т  с в о ю  та б л и ц у   м а р ш р ут и з а ц и и  та к , ч то б ы  п а к е т ы  в  э то т  п ун к т  ш л и  ч е р з  да н н о г о  с о с еад . П о  п р о ш е с тв и и  н е к о т р о г о  в р е м ен и  о ц е н е н н ы е  р а с то я н и я , хр а н и м ы е  та к и м  р а с п р е д л е н н ы м   сп особом , га р н ти р о в а н н о   с хо д я т с я   к   и с ти н н ы м   р а с то я н и я м , да в а я   м а р ш р ут и з а т о р а м   то ч н у ю и н фо р м ац и ю  о  н а и л уч ш е м   п ут и . л Аг о р и т м  п р о т к о л а  R I P я в л я е т с я  р а с п р е д л е н н о й  ф о р м о й  а л г о р и тм а  Б е л м а н а- Ф орд а  д л я  н а хо ж де н и я  к р а тч а й ш е г о  п ту и  и з  о дн о й  в е р ш и н ы  [5,13]. О с н о в н о й ш а г  а л г о р и тм а   Бел м ан а- Ф о рд а  н а з ы в а е тс я  ракцсийел   а р бе   и   с о т в е т с в еу т срав н ен и ю   свои х   з ап и се й  с  с о с е дя м и .  О п е р а ц и я   релак сац и и , п р и м е н е н н а я  к  р е б р у   {и,  v),  в ы п о л н я е т  с л е дюу щ е е  о б н о в л е н и е : d[v]  = min(w(u,  v)  + d[u],d[v]). и т гр м о л А

л   п о   все м   р еб р а м м  п о в то р я е т о  р а с то я н и я  г а р а н ти р о в а н н я  д о  м и н и м а л ь н о , в  г р а ф е  н е т  ц и к л а  с  о тр и ц а те л ь н ы м  в е с о м ) . Е с л и  в  г р а ф   ц и кл , т о  в  н е м  бду т  н е п р а в и л ь н о  м и н и м и з и р о в а н н ы е  р е б р а р ебр о   (и,   v),  та к о е  ч т о   w(u,  v)  + d[u]   • template  typename  g r ap h_t r ait szyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   <  VertexListGraph  > ::degree_size_type edge_connectivity(VertexListGraph  & g,  Out p ut lt er at or  disconnecting_set) { ( ти л е д е р п О ь  тип ы  )

(  т а дзо С ь   а р г ф   о в к пт й   сте и   и з  гон аври тнеро о  ф а р г а  > {  т й а Н и  нш ир е в у  о н ь л м аи нм и й  снеп т и   и  ти лс чы в ь   е д со й   S и   н е   е дсо й   S ) ::ver t ex_d esc r ip t or  ver t ex_d esc r ip t or ; typedef  typename  g r ap h_t r ait s  < VertexListGraph  > ::degree_size_type d egree_size_type; typedef  c o l o r _t r a i t s   Color: typedef  typename  a d j a c e n c y j i s t _t r a i t s  ::edge_descriptor  edge_descriptor; typedef  a d j a c e n c y j i s t   FlowGraph:

В  ли ст н г е  8.3 м ы  и сп ольез у м  std:: set  лд я  мн овжсет (п ремн а я  nei ghbor_S), п оскль у  п р и  вавскт е  должн н ьо ст . М н вожсте о  5  * (п ерм н а я  S st a r )  и  мн вожсте nonneighbor_S) павлнестрд ы   std:: vector  в  связ и  с  тме м еы е  элем н т ы  бу д у т  ун и каль н ы м и .

а  S и  мн овжсет а  гарн и трьовса о  н е  се дос , чт о  м ы  з н аме

а  се дос я  ун и каль й  S (п ерм н а , чт о  вавстля

й  S я -

1 2 0 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 8  • ы н ь  Мл м аис к а й  по то к Л ис т н

г 8.3.и н е л Од е р п

е  ы н м е р п

х

( т и л е д е р п О ь   ы н ме р е п е   )  • vert ex_d esc rip t or  u.  v.  p.  к : edge_descriptor  e l ,  e2: bool  inser t ed ; typename  g r a p h j t r a i t s  : : ve r t e x_it e r at o r  v i .  vi_end ; degree_size_type  d e lt a.  alpha_star,  alphajSjk: st d : : se t    S.  neighbor_S; st d :  - .vector    S_star,  nonneighborjS; st d : : vec t o r   c olor(num _vert ic es(g )): st d ::vec t or   pred(num_vertices(g}); zyxwvutsrqponmlkjihgfedcbaZYXWVU

Г ар о д е   рб е

к у  и  онбрат о б р аж н е и Л ис т н

ф  ПО В ОК Т О о  п октв г Й

е  ребро я  свой вст г 8.4.и н а д з Со

 сте

и  сосзатед я  н а  осн ов е  внод хг о  граф а  и ме т  тр и   свой ат : п роскпн у . Ду отс п  к  эи т м  свойаст м  ощ су влетя : cap, res_cap и  rev_edge свнесто о е  гф а р

а  пов к то

й  ст е

о  граф

а  (ли ст н ю  сп осбн ьост я  чре

г  8.4).zyxwvutsrqpo   жа К , н евзя з  оы ктъбе- о т -

.

и  и з го н авори нт н еиро

о  гф а р

а

minjdegree_vertex(Graph  &  g) { typename  g r ap h j t r ai t s  : : ver t exjd esc r ip t o r  p; typedef  typename  g r ap h jt r ait s  ::degree  sizejt yp e  sizejt yp e; sizejt yp e  d elt a  =  st d : : num er ic _lim it s  ::max(); typename  g r ap h j t r ai t s  : : ver t ex_it er at o r  i .  iend: f o r ( t i e d ,   iend)  =  ve r t ic e s( g ) ;  i  !=  iend ;  ++i) i f  ( d eg r ee( * i.  g)   = template  void  neighbors(const  Graph & g. typename graph_traits ::vertex_descriptor u, Outputlterator  result) { typename graph_traits ::adjacency_iterator  ai, aend; for  (tie(ai, aend) = adjacent_vertices(u,  g): ai !-  aend; ++ai) *result++ = *ai;

template   & g, Vertexlterator first,Vertexlterator last. void neighbors(const GraphzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA Outputlterator result) { for (; f ir st != last: ++first) neighbors(g. * f ir st , result): Н а   н ач аль н о м   ш аг е   а л г о р и тм а   (л и с ти н г  8.7)  о с ущ е с тв л я е тс я   п ои с к  в е р ш и н ы м и н и м аль н о й   с те п е н и / ? , з а те м zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   S = р,   а  п о с л е  э то г о  в ы ч и с л я ю тс я  с о с е д и  и  н е  с о с е д и  S. М ы  и с п о л ь з уе м   std:  :set_difference()  д л я   в ы ч и с л е н и я   V-   5, гд е   У —  м н о ж е с тв о  в е р ш и н  г р а ф . Л ис т ин

г 8.7. с и о П

к ш нр и е в

ы

и и н е лс и ч ы в

е е д ес о

й и н е е д ес о

 з

.

а   м н о ж е с тв о   н е  с о с е д й   5  с та н о в и т г  8.8)  м а к с и м а л ь н ы й  п о т к  м е ж д у  р а   Э дм о н дс а - К а р п а   (с м .  р а з й   ц в ет , в о  в р е м я  н а хо ж де н и я   м акси м  н а  о дн о й   с то р о н е  м и н и м а л ь н о г о  н а  д а н н ы й  м о м е н т  н а и м е н ь ш и й , о к я  в  5*, з а те м  k до б а в л я е тс я   в  S, с о с е д и

1 2 2 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 8  • ы н ь Млм иас к а й  по т к Л ис т н

г 8.8.  Глы н в а

й  цки

л

(  Главны й  к и ц л   ) = while  (!nonneighbor_S.empty())  { k  -   nonneighbor_S.front(); alpha_S_k  •   edmunds_karp_max_flow (flow_g.  p.  k.  cap.  res_cap.  rev^edge,  &color[ 0] .  &pred[0]); i f  (alpha_S_k 
{ knight_adjacency_iterator() { } knight_adjacency_iterator(int i i . Position p, const knights_tour_graph & g) : m_pos(p), m_g(&g), m_i(ii) { valid_position(): } Position operator  *() const { return m_pos + knight_jumps[m_i]: } void operator++  () { ++m_i; valid_position(): } bool  operator == (const knight_adjacency_iterator & x) const { return m_i == x.m_i: } protected: void valid_position(); Position m_pos; const knights_tour_graph * m_g: i nt m_i: i.

126

в а Гл

а 9 • вны я Не

е ы ф а гр

: обхо

д е н ко

м zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQP

В  фн у кц и - модет е  клас а  va I  i d_pos i t i on () счите к  хо д в  увели ч и васет , п ок а  н е  бе д у т  н йане д а  п оз и ц и я  н а  докс е  и л и  н е е бд у т  ди онтсг у void knight_adjacency_iterator::valid_position() { Position new_pos = m_pos + knight_juraps[m_i]: while  (m_i = m_g- >m_board_size)) {

п ор

я  д о  те х т  кон е

ц  мисав

.zyxwvut

++m_i;

new_pos = m_pos + knight_jumps[m_i];

лд ов д х

Ф ну к ц и я   н ач ль н о

я  adjacent_vertices()  осеаз д й   п оз и ц и и  и ероат а   одх

т  п ра

у  иореат в   и  8 дл

в  смжен иост

г 9.2. с а Кл

же в на

й  п оз и ц и

, и сп оль з у и  и ерота

я  О

а . std::pair  adjacent_vertices(knights_tour_graph::vertex_descriptor v. const knights_tour_graph & g) { typedef knights_tour_graph::adjacency_iteratorzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHG   Iter: return std::make_pair(Iter(O, v, g). Iter(8, v.  g)); } К с ал с  knights_tour_graph  (ли ст н г  9.2) сржеиод т  тольк о  раз м е р  доск и  (к а к  п о е   лд я   AdjacencyGraph.  Ф ну к ц и я   num_vertices() л е )  и  оп еорат ы   typedef, тмеы бру в о з р ащ ае т  ч и сл о  ко тле к  н а  доске . Л ис т н

я   к о н че н о

с knights_tour_graphzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJ

struct knights_tour_graph { typedef Position vertex_descriptor; typedef std::pair < vertex_descriptor, vertex_descriptor > edge_descriptor; typedef knight_adjacency_iterator adjacency_iterator; typedef void out_edge_iterator: typedef void in_edge_iterator; typedef void edgejterator; typedef void vertex_iterator: typedef int degree_size_type: typedef int vertices_size_type; typedef int edges_size_type: typedef directed_tag directed_category; typedef disallow_parallel_edge_tag edge_paranel_category: typedef adjacency_graph_tag traversal_category; knights_tour_graph(int n): m_board_size(n) { } int m_board_size: }: int num_vertices(const  knights_tour_graph & g) { return g.m_board_size * g.m_board_size; } Т еп р ь , кдог а  ход ы   к он е м  ообржанет ы   в  горвфа м  и н ерйфт с м  расмроет ь  олеьнд т ы е  гроафвы е  аолргимыт , корыт е  муог ы  дл я  реш ен и я  зачд и  оод хб а  кон е м  ш нмта хо й  доски .

е  Boost, м ы  мо т  бы т ь  и сп оль з о

-

9.2. с и о П

9.2. сио П

к с о т а р в зо

м н а ф ар г

е

к с о т ар в зо в

м

е zyxwvutsrqponm 127

н а ф ар г

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQ

И де я   а л г о р и тм а zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   к и п с оа   с  взавмтор   ан   е г а ф р   (backtracking  graph  search)  п о д б н а п ои ск у   в  гл бу и н у   в  то м , ч т о  п ту ь   и с л е дутс я   д о  тех   п о р , п о к а  н е  беду т   о б н а р жу е н т уп и к . П о и с к  с  в о з в р а то м   о тл и ч а е тс я   ет м , ч т о   п о с л е  до с ти ж е н и я  тпу и к а   а л го р и т м в о з в р а щ а е тс я   о б р а тн о , с н и м а я  п о м е тк и  с  тпу и к о в о г о   п ит у , п ер д   те м   к а к  п р о д л у  п тиу . В  л и с ти н г е  9.3  п о и с к  с  в о з в р а то м  р е а л и з о в а н  с  п о м о жи т ь   п ои с к  п о  др гуо м щ ь ю  с те к а  (в м е с т о  р е к ур с и и ) , а  п о р я до к  п о с е щ е н и я  к а ж до й  в е р ш и н ы  з а п и с ы в а е тс я с   п омощ ь ю  о то б р а ж е н и я  с в о й с тв а . С те к  с о с т и т  и з  п а р  о тм е к а  в р е м е н и  — в е р ш и н а , ат к   ч т о  п р а в и л ь н а я  о тм е тк а  п о с е щ е н и я  до с пту н а  п о с л е  в о з в р а щ е н и я  и з  тпу и к а . П о и с к   з а в е р ш а е тс я , к о гд а  в с е  в е р ш и н ы  п о с ещ ен ы  и л и  в с е  в о з м о ж н ы е  п ту и  и с ч е р п а н ы . Хо т я   гр а ф , о п р е д л е н н ы й  в   п р еды щду е м   р а з де л ,  б ы л   н е я в н ы м  и   п р е дс та в л я , в   ч а с тн о с ти , о бох д  ш амх тн о й  до с к и  к о н ем , о н  те м  н е  м е н е е  м о де л и р еу т  к о н ц е п ц и ю Graph и з  BG L, т о  ес т ь  а л го р и т м  п о и с к а  с  в о з в р а то м  р е а л и з о в а н  дл я  к о н ц е п ц и и  Graph, а   н е  д л я   к о н к р е тн о г о   гр а ф а   о б хд а   к о н ем . П о л уч и в ш и й с я   в  р е з лу ь та е   а л го р и т м можн о  п о в то р н о  и с п о л ь з о в а т ь  д л я  л ю б о й  с тр ку тр ы   да н н ы х , м о де л и р юу щ е й  Graph. Л ис т н

г 9.3.тиро г л А

ш ин

м

кс и о п

а с о т ар в зо в

м

template < typename Graph, typename TimePropertyMap > boo! backtracking_search(Graph & g. typename graphjtraits < Graph >::vertexjjescriptor src, TimePropertyMap timejnap) { zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA ( Стадзо ь  сет к  и  итаворизл цн ь   ктем о у   нем рв и  > S.push(std::make_pair(time_stamp,  src)): while  (IS.emptyO) { // цк и л   к о п а  сет к  н е  с у п т ( Получит ь   нишрев у  с о  стека , зтасип ь   мерв я  и  птирево ь   инешр ваз ( Птижол ь   св е  сынжем е  нишрев ы  н а  етс к  > ( Елс и  в  текипу , осьтиак я  > }  //  while  (IS.emptyO) return  false; } Д л я   з ап и с и  в е р ш и н , к о т р ы е  н уж н о   п р о в е р и ть , и с п о л ь з уе тс а  з а н о с и тс я  в  с те к  в м е с т е  с  о тм е тк о й  п о с е щ е н и я .

е  >

я   st d :: stack.  В ер

-

< т а д зо С ь с ет к и т а во ри з л аи ц н ь м окт е у нме р в и >= typedef typename g r ap h_t r ait s < Graph > : : ve r t e xj j e s c r i p t o r Vertex: typedef s t d : : p a i r < i n t . Vertex > P; st d : : st ac k < P > S:

int time_stamp = 0: с те к с л уч а

С л е д ую щ и а   и  п р о в е р и ть е   а л го р и т

й   ша м  ус п е ш н

г   — з а п и с а т ,  н е   з а н е с н

ь   о тм е тк ы   л и   жу о  з а в е р ш а е тс я

у   п о сещ ен и е   в   с ет .

(  тичулоП ь   нишрев у  с о  акетс , зтасип ь   мерв я  и  птирево Vertex x:  tie(time_stamp. x) - S . t o p O : put(time_map. x. time_stamp); //  св е  внишре ы   ынещ соп , успех ! if (time_stamp == num_vertices(g) -  1) return true;

я  дл к   вс е   в ер ш и н ь   инешр ваз

я   в ерш и н ы   гр а ф

ы   гр а ф а   н ав ерх .  В   п о с л е дн е е  ) = .

у м

1 2 8 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 9  • ы н  Нв я е е ы  гф а р : оо хб д  ке н о м zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQP Т пе р

ь  п росм иат вю ст я  вс е  смжен ы е  врше и н ы , и  есл а   п щ о ес н а , он а  кс телад я   в  ске т . Овсит у е   мс ж е н ы .zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

н е   бы л п у ит к а

е д уб щ не и у д уб

и  см еж н а х   в ре ш и

( Птижол ь  вс е  сынжем е  внишре ы  н а  сет к  ) ќ boo! deadend -  true:  //  ан ем р п я   л д я  иицак дн и  кипут а typename graph_traits ::adjacency_iterator  i. end: for (tied, end) = adjacent_vertices(x, g): i != end; ++1) if (get(time_map, *i) == - 1) { S.push(std::make_pair(time_stamp + 1, *i)); deadend = false; } Е лс и   а ол г р и т м   и о с т аед г т   п уи т к а ,  рвше и н ы  вы алкти ваю ст т  н айнед а  ещ е  н е  и совледан а я  вреш и н а . В  п роц се е  воз врат я  дл я  коажд й  вреш и н ы  сбрасы вю ся т , помэут , воз м жн о т  диостнг у ы   п о  боле е  пщяод хме у   и пт у . ( Ел с и  в  екипут , осьти ак я  ) з if (deadend) { //  лсе и  ипут к put(time_map, x. - 1): S.popO: tie(time_stamp, x) = S.topO: while  (get(time_map. x) != - 1) { //  тиако ь  сет к  д о  пенд лсо й   н е  ион ав делс put(time_map. x, - 1): S.popO: tie(time_stamp.  x)  = S.topO;

9.3.  ки ст рв Э

а ф р о д Вс н р а

а

й  нишрев

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQ

int s_x -  0; typename graph_traits ::adjacency_iterator  i. end; for (tied, end) -  adjacent_vertices(x, g); i != end; ++1) if (get(time_map, *i) —  - 1) return  s_x;

е к

я   и з  скае т , п ок а  не : а  окмте и  п ос е , эт и  ж е  врше и н ы

  од х   о п е л нр д и

а   з а к л ю ч ас е т

я я  тоег , м  эт о  чм о лис  п-е лс о я  дл я  су дел , чо т , п щоес а я  в  н а х   п ут и к о в . т  чи сл о  п о -

г 9.4.   иц кн у Ф я  number_of_successors() template  int number_of_successors(Vertex  x. Graph & g, TimePropertyMap  timejnap)

}

а  ещ

ы

а  Вф р о дснар  дл я   вы бор а   ю у с л ед щ е й   к л ет и   лд я тивЭсрк а в   п ю а ж ре д у щ е м   п р о см т е   о г жк а д о   и з  воз м жн ы х  одх в  дл я ск о ль о  даль н ей ш и х  хо д в  воз м жн ы  и з  эо т й  кклиет . Н аз ове йе.в аотле д   К к л те а  с  н иа мне ьш и м  чи сло м  п леовсадт й   в ы б и ср а е т ю щ ге о  ха од . П ри ч н а , п о  корт й  эт а  эври ст к а  ртеабо , в  том ч ал е   н аи б о л е е   о гр а н и ч е н ы е   в ер ш и н ы , м ы   и з аебг м   п ое н т ц и а л ь н ы ю у С щ д ел а я   н фу к ц и я  number_of_successors()  в  ли ст н г е  9.4  вы ч и сляе о с ел в д а т й  верш и н ы . Л ис т н

я  врше и н н  — призна

9.3. к и тс и р в Э

Р еа л и з а ц и

я  эври стк

ов мр а т ит ровк п о м ще не и н ес и о ч др е

, н о  вмсте а   в ер ш и и  смжен ы я  верш и ь  си гн али з и еру

Л ис т н

г 9.5. и ц а з и л а Ре

и  Врна офдс о  з алтк и ван и я  смжен ы н   п о   к о л и ч в ес т у   п о с л ев д ай т х   в р ше и н  в  одчре н  в  очдре ь   он и  и з влекаю ст т   о  тп уи ке . я к и ст р э в

и ф р о дс н р а В

а ф р о дс н р а В

а  (ли ст н

г  9.5) н чаи н с теа я  с  аорлгим т а  с  воз н  в  се т к  сн ачл а  п роидсх т  сор .  С оирт вк а   в ы п о л н ясе т я   пр ь   п о  п ри о ет у   (priority queue). П осл е  з а я  д у т о а  и  п омще юас т я   в  ске т .  П асту а

bool  deadend = Q. empty О : //  тисемрп ь  нишрев ы   и з  лоньлак й  одер ч и  в  етс к for (: IQ.emptyO: Q.popO) { tie(num_succ. x) = Q.topO: S.push(std::make_pair(time_stamp + 1. x)); if (deadend) { put(time_map. x. - 1); S.popO: tie(time_stamp. x) = S.topO: while  (get(time_map. x)  != - 1) { //  тиако ь  сет к  д о енд л соп й  н е он ав дел с и й   нишрев put(time_rnap. x, - 1); S.popO; tie(time_stamp. x) = S.topO:

) •

5

3

a

r

3

7

5

-

х   в р ше и

template < typename Graph, typename TimePropertyMap > bool warnsdorff(Graph & g, typename graph_traits < Graph >::vertex_descriptor src, TimePropertyMap timejriap) { zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA  • typedef  GRAPH  graph_t: graph_t  leda_g: typedef  g r ap h_t r ait s  : :vert ex_d esc hp t or  ver t ex_t ; st d : : vec t o r    ve r t ( 7 ) : ver t [ O]  •   ad d _vert ex(st d ::st ring (" з а б р а т ь   е те д й   и з   ш ыо"лк ) .  leda__g); v e r t [ l ]  =  ad d _vertex(std ::string (" к у п и т ь   прыот"дук ) .  leda_g); ve r t [ 2 ]  •   add_vertex(std::string(" nofly4HTb  г ьнед и   в   б а н о к м е а т" ) .  leda_g): ve r t [ 3 ]  =  add_vertex(std::string(" npnBecTH е т е д й   н а   р т е н и р о в ук " ) .  led a_g ): ve r t [ 4 ]  =  add_vertex(std: :string("npnroTOBHTb  и ну ж" ) ,  led a_g ): zyxwvutsrqponmlkjihgfedcbaZYX   r,™nn™,ou,  ^  о Л О рП Ж с Д И Н

  *У

1 3 2 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 10 •   имВаз вйеосдт е   с  дргуим и   о ыв м ф ра г и   б и м а л е ко т и Лист ин

ф ун к ц и

г 1 0 . 2 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   { пернио дл)ж vert[ 5]  -   add_vertex(std::striп'Сд збарт ь   е тед й   с  "и кворине т ) .  leda_g); vert[ 6]  = add_vertex(std::string("сес т ъ ь   "ни жу ) ,  1eda_g); zyxwvutsrqponmlkjihgfedcbaZYXW С л е д ую щ и й   ш а г   — до б а в л е н и е   р еб р   к  г р а ф у .  В н о в ь  м ы  и с п о л ь з уе м   обы чн у ю ю  add  edgeO.zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA ь  ррбе а  к  гф а р у  LEDA > =  • (  std::vector   topo_order; node_array    color_array(leda_g): topological_sort(leda_g.  std::back_inserter(topo_order). color_map(make_leda_node_propertyjnap(color_array))): std::reverse(topo_order.begin().  topo_order.end()); int  n = 1: for  (std::vector  ::iterator  i  = topo_order.begin(): i  != topo_order.end();  ++1,  ++n) std::cout  «  n «  ":  "  «  leda_g[ * i]  «  std::endl:

10.2. Ии н а во з ь ло пс и з  BGL с о  гф а р

е о тске чиголп м   и з  SGB

й   к во р и тс

и

Б и б л и о те к а   Stanford  G raphBase  о п р е д л я е т   с т р ук т р у   Graph, к о т р а я   р е а л и з уе т с т р ук т ур у   да н н ы х   в   с ти л е   сп и ск а   с м е ж н о с ти .  П е р е г р уж е н н ы е   ф ун к ц и и   в   boost/ у  Graph к  и н те р ф е й с у   BG L. П о м и м о graph/ stanford_graph.hpp  а д п ти р ую т   с т р ук т р в к лю ч ен и я  з а г о л о в о ч н о г о  ф а й л а  stanford_graph.hpp  н е о б ох ди м о , ч то б ы  б ы л а  усат н о в лен а   б и б л и о те к а   SG B и  п р и м е н е н  ф а й л   и з м ен ен и я  PROTOTYPES (и з   ди с тр и б у ти в а  SG B). Э т о  н е о б хо ди м о   п отму , ч т о  о р и г и н а л ь н ы е  з а г о л о в о ч н ы е  ф а й л ы  SG B н е   о п ред ляю т   п рот и п ы   ф ун к ц и й  с о г л а с н о   с та н д а р т у   AN SI, ч т о  тр е б уе тс я   дл я к о м п и л я то р а   C + + . П р и  к о м п и л я ц и и  п р о г р а м ы  с  и с п о л ь з о в а н и е м  SG B- BG L и н те р ф е й с а  н е о б ох ди м о  ус та н о в и т ь  п ту и  к  з а г о л о в о ч н ы м  ф а й л а м  и  б и б л и о те к а м  д л я

10.2. и н а в о з ь л о пс И

е о ск е ч и г о л п т

о  та к ж е  с о б р а т SG B,  н жу н и   SG B  з а до к ум е н ти р о в а д л я  г р а ф а  и з  SG B п р и в е д

й к в о р и т р ос

ь  п р о г р а м н   в   р а з де л н  в  л и с ти н г

г 10.4. а ске чи го л п Т

Л ис т н

у  с  б и б л и о те к о е   14.3.4.  П р и м е е   10.4.

я к в о р и т р ос

а ф ар г

и и з BGL с о ф а р г

й  SG B. И н те р ф е й р   то п о л о г и ч е с к о

м

и з SGBzyxwvutsrqponm 1 3 3 zyxwvutsrqponm

с  м е ж д й   с о р ти р о в к

у  BG L и

а и з SGB

< topo- sort- with- sg b .c pp > з f in c l u d e < vector> f i n c l u d e < st ring > i i n c i u d e < iostream> # i nclude < boost/ graph/ topologica1_sort.hpp> # inc lud e < boost/ graph/ stanford_graph.hpp> in t

mainO { using namespace boost; ( т а д зо С ь SGB- а р г ф > < т а д зо С ь км те и л д я ин а д аз й > ( тив аб До ь рб е р а к SGB- ф а р г у > ( ти н лопыВ ь у с е ки о ч п г л т ю с и ор твк gb_recycle(sgb_g); ret urn EXIT_SUCCESS:

М ы   с о з да е

м   SG B- г р а

ф  в ы з о в о

у н а

SGB- ф а р г

м   SG B- ф ун к ц и

е >

и  gb_new_graph().

( т а д зо С ь SGB- а р г ф )  • const  i n t  n_vertic es  -   7; Graph  *sgb_g -  gb_new_graph(n_vertices):

Дале

е   м ы   з ап и сы вае м   м е тк и  д л я   з а д н и й   (в е р ш и н ы ) в   г р а ф . О т   д е с к р и п то р а ы  в  SG B л е г к о  п е р й т и  к  ц е л о м у  ч и с л у , и с п о л ь з у я  sgb_vertex_i djnap, о п р е й   в  stanford_graph.hpp,  п о э то м у  хр а н е н и е  м е то к  в  м а с и в е   ду о б н о .zyxwvutsrqponmlkjihg й  > ќ ( Стадзо ь  мкте и  дл я ина д з const char *tasks[] = { "зтарб ь  дет й  и з  "ылокш . "ктипу ь   "ыткудорп . "птичуло ь  дгьне и  в  банкомте" . . "птсевир и  дет й  н а  "укворинет "птивогр ь  ужин" , "зтарб ь  дет й  с  т"икворне , "стсеъ ь  ужин " }: const  int  n_tasks  = sizeof(tasks)  /   sizeof(char * ) ; SG B- г р а ф  хр а н и т   в ерш и н ы  г р а ф а  в  м а с и в е , п о э то м у  м о ж н о  п о л уч и т ь   д о с ту п к   лю бо й   верш и н е  п о  и н де к с у  в  м а с и в е . Ф у н к ц и я  gb_ne_edge() п р и н и м а е т  дв а  а р г му е н т а   Vertex* и  в е с  р е б р а   (н а м  о н  н е  в а ж е н ) .

в ерш и н де л е н н ы

vertices 0.  sgb_g- >vertices 3.  0); sgb_g- >vertices 3,  0); gb_new_arc(sgb_g- >vertices sgb_g- >vertices 4,  0); gb_new_arc(sgb_g- >vertices sgb_g- >vertices 1,  0): gb_new_arc(sgb_g- >vertices gb_new_arc(sgb_g- >vertices 3,  sgb_g- >vertices 5,  0); gb_new_arc(sgb_g- >vertices  + 4,  sgb_g- >vertices 6,  0); gb_new_are(sgb_g- >vertices  + 5.  sgb_g- >vertices  + 6,  0); З а те м   о с ущ е с т в л я е т с я   то п о л о г и ч е с к а я   с о р ти р о в к а .  М ы   п е р да е м   в   а л го р и т м  SG B- г р а ф . Н а  э то т  р а з  в м е с т о  я в н о г о  с о з д а н и я  о то б р а ж е н и я  ц в е то в  м ы  п о з в о   а л г о р и тм у   сам ом у   с о з да т ь   его . О дн а к о  д л я   э то г о  ф ун к ц и я  topol ogi cal _sort () я   в  о то б р а ж е н и и   в ерш и н  в  ц е л ы е  ч и с л а .  И н т е р ф е й с  м е ж д у   SG B  и  BG L т  та к о е  о то б р а ж е н и е  с в о й с тв а . О то б р а ж е н и е  в е р ш и н  в  и н де к с ы  м о ж н о

1 3 4 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 10  •и в тс й Ве дм ои а з е  с м и дг у р и м ы в о  гф а р и м а к е т о и лб и и zyxwvutsrqponmlkjihg п о л уч и т в ед Л ис т н

ь   вы з ово м  get (vertex_i ndex,  sgb_g). К о д  то п о л о г и ч е с к о й  с о р ти р о в к и  п р и  н   в  л и с ти н г е   10.5. е о ске  тчи го лп й  сквори тро и  SGB- ф а гр а zyxwvutsrqponmlkjihgfedcb г 10.5.   и н е лс и ч ы В ( Втинлопы ь  туксечиголп ю  скворит у  н а  SGB- фарг е  >  ќ typedef graph_traits ::vertex_descriptor  vertex_t; std::vector  topo_order; topological_sort(sgb_g, std::back_inserter(topo_order). vertex_indexjnap(get(vertex_index,  sgb_g))): int n = 1; for (std::vector ::reverse_iterator i -  topo_order.rbegin(): i != topo order.rend(); ++i, ++n) std::cout «  n «  ": " «  tasks[get(vertex_index.  sgb_g)[*i]] «  std::endl:zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

10.3. ицазлеР

я  оретпад

в  графо

в

Н ап и сат слож н о де та л ь н о

ь   а д п те р   д л я   д р уг и х   гр а фо в ы х   б и б л и о те к   и  с тр ук т р   да н н ы х   совсе м  н е .  В   к а ч е с тв е   п ри м ер а   с о з да н и я   н овы х   а д п те р о в   э то т   р а з д е л   п р е дл а г е т е   о бъ ясн ен и е  р е а л и з а ц и и  и н те р ф е й с а  BG L д л я   г р а ф а   и з  LED А . П ер в о е , с  ч е м   н жу н о  о п р ед л и ьт с я , — э т о  к а к и е  и з  к о н ц е п ц и й  бед у т  р еа л и з о в ы  в а т ь   BG L  г р а ф .  С л е дую щ и е   к он ц еп ц и и   л егк о   реали з оват ь   п о в ер х   клас о в  и з LED A: VertexListGraph,  BidirectionalGraph, VertexMutableGraph  и  EdgeMutableGraph. В с е  ти п ы , а с о ц и и р о в а н н ы е  с  г р а ф о в ы м  к л а с о м  и з  BG L, м о ж н о  п о л чу и т ь  с  п о  • мощ ь ю  к л а с а  graph_t r a it s. Э то т  к л а с с  с в о й с т в  м о ж е т  б ы т ь  ч а с ти ч н о  с п е ц и а л и з и  1 рова н   дл я   г р а ф о в о г о   клас а   GRAPH и з zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONM   LED  А   (л и с ти н г   10.6).  Т и п ы   node и  edge я в л я ю тс я   э к в и в а л е н та м и  де с к р и п то р о в   в ерш и н  и  р е б р .  К л а с с  GRAPH п р е дн а з н а ч е н дл я   о р и е н ти р о в а н н ы х   гр а фо в , п о э то м у   м ы   вы би рае м   ет г   directed_tag  д л я   direcи  н е  з а п р ещ а е т  в с ат в к у   п ар л ель н ы х ted_category.  Т а к  к а к  к л а с с  GRAPH авот м а ит ч ес к р еб р ,  в   н а ш е м   с л уч а е   ус т а н а в л и в а е т с я   allow_paranel_edge_tag  д л я   edge_paг а   1 1 el_category.  Ф у н к ц и я  number_of_nodes () и з  LED А  в о з в р а щ а е т  ц е л о е  ч и с л о , п о э то м у да н н ы й   т и п   ук а з а н   д л я   vertices_size_type.  Т и п   етга ,  и с п о л ь з уе м ы й   д л я   traversal_category, д о л ж е н  о тр а ж а т ь   м о д е л и р уе м ы е   гр а фо м  к о н ц е п ц и и  о бохад ,  п о э то м у м ы   с о з да е м   те г о в ы й   к лас ,  н а с л е дую щ и й   о т   bidirectional_graph_tag,  adjacency_graph_tag  и  vertex_l i st_graph_tag.  Т и п ы  и те р а то р о в  о п и с а н ы  да л е е   в  э то м   р а з де л . г 10.6.   в тс й о в С

Л ис т н

а  о ф а р г

в   в  LEDA

(  в стйов С а   о ф ар г в   л д я   LEDA- ф а р г а   > • namespace  boost  { st r u c t  leda_graph_traversal_category  : p ub lic  vi r t u a l  b id ir ec t io nal_g r ap h_t ag , p ub lic  vi r t u a l  adjacency_graph_tag. p ub lic  vi r t u a l  ver t ex_list _g r ap h_t ag  {  } : template  st r u c t  g r ap h_t r ait s  { typedef  node  ver t ex_d esc r ip t o r ; typedef  edge  edge_descriptor: typedef  d ir ec t ed  tag  direc ted_c ategory:

Н ек о т р ы ли з ац и ю сп ец и али з и рова п ри м ен е

е  н есатн адрнт ы . Д л

я  до с пту

н  к л а с - о б о л о ч к а

е  к о м п и л яот р ы а   к  а с о ц и р о в а н н ы н   д л я   к о н к р е тн ы , с о д е р ж а щ и

х  ти п о

, н ап р и м е р  Visual  C + + 6.0, н е  п оедр ж и в аю м  ти п а м  в  э от м  с л чу а е  к л ас с  с в о й с т в   в ер ш и н  и  р е б р .  В  а л ь те р н а ти в н о й   LED A- г р а ф  и  тр е б уе м ы е   влож ен н ы

т  ч асит ч н у ю  с п ец и а в  до л ж е н  б ы т ь  п о л н о с ть м   вари ан т е   може т   бы т е  о п р е д е л е н и я  т и п о в

ю ь .

10.3. и ц а з и л а Ре typedef typedef typedef typedef typedef < и Т п ро т а р е т и / / ир гд у }: } //

я оре тп а д а

в о ф ар г

в zyxwvutsrqpon 135

е

allow_parallel_edge_tag edge_parallel_category; leda_graph_traversal_category traversal_category; int vertices_size_type: int edges_size_type: int degree_size_type: а щ яи д о х с и typedef л д

х шир е в я о р т а р е ти

н

) в

...

namespace boost zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

С н ч ал а  м ы  н паи ш е м о кр а т я  яв ляест я  чь тса ю LED А  в  кв тчсае е  пр тмеа и  воз врща меаог о  ти п а  дл ш р ве и н ы  и  рарбе , н а  пиркат с те д я  и з м ен и т ь  асоц и ровна ы н о м   тм с е е  врн т у и   с п ц е и ал з ац и ка к   LEDA  паволеястрд

 фн у кц и  кон ц пе ц и

и  source() и  targetC) дл я  кон ц пе и и  IncidenceGraph, и  BidirectionalGraph. М ы  и псеьолз у м  ти п  GRAPH  и з а  дл я  гфар а  и  graph_traits  л д я  зна д и я  пр тмае а  рбре а я  врше и н ы . Хот я  тип ы  LED А  муго т  бы т ь  п ри мне ы  дл я е  лчш у е   и с п о ль з в т а ь  graph_traits.  а дТог , есл и  п ри й  ти п  вшре и н ы  и л и  рарбе , эт о  мжон о  стале д ь  в  од и  graph_traits,  а  н е  в о  вес м  код е  п рмаогы . Т а к т   н уф к ц и и  sou ге е  О   и  target О , м ы  п ротс о   и х   в ы з ы в а ме .zyxwvutsrqpo

 • s t r u c t  led a_out _ed g e_it erat or_p olic ies { s t a t i c  void  init ialize( led a_ed g e&  )  {  } template  s t a t i c  void  inc r em ent It er &  i ) {  i.baseO  =  Succ_Adj_Edge(i  .baseO.  0 ) :  } template  s t a t i c  void  decrement It er &  i ) {  i.b aseO  =  Pred_Adj_Edge(i  .baseO,  0 ) :  } template  s t a t i c  leda_edge  dereference(const  It er &  i ) return  i. b ase O:  } zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA п е р н и о дл ж

1 3 6 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 10  •и в тс й Ве дм ои а з е  с ми дг у р и м ы в о  гф а р и м а к  бе т о и лб и и   { пернио дл)ж zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA г 10.7 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA template  static bool  equal(const  Iter& x. const  Iter& y) {  return x.baseO  ==y.base(); } }:zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA Т еп ер ь  iterator_adaptor и с п о л ь з уе тс я  в  к а ч е с тв е  ти п а  ed gejt er a t o r .  П е р в ы е  дв а п а р а м е тр а  ш а б л о н а  д л я  e d ge jt e r a t o r  — а да п ти р уе м ы й   клас с  и  к л а с с  п р а в и л . С л е д юу щ и е   п а р а м е тр ы   ук а з ы в а ю т   ас оц и и рован н ы е  ти п ы   и те р а то р а ,  та к и е   к а к  ти п з н ач ен и я  и  ти п  с с ы л к и .

Л ис т н

(  и Т п   ор т ае ит а  щ яи д о хс и х  ш и р е в н   > • typedef  iterator_adaptor< leda_edge,  led a_out_ed g e_1terator_p olic ies. leda_edge.  const  leda_edge&.  const  leda_edge*. st d : : f o r war d _it e r at o r _t ag .  s t d : : p t r d i f f _t > out_ed g e_iterator:

П осл де л и т щ аем о и с п о л ь з уе ф ун к ц и п ер в о г окон ч ан и вори Л ис т н

е  о п р е д л е н и я  и те р а то р а   и с хо д я щ и х   р еб р  в  к л а с е  с в о й с т в  м о ж н о  о п р е ь   ф ун к ц и ю   o u t ed gesO .  В   с л е дюу щ е м   о п ред лен и и   (л и с т и н г   10.8)  в о з в р а е  з н а ч е н и е  д о л ж н о   бы т ь   п аро й  и те р а то р о в   и с хо д я щ и х   в ерш и н , та к  ч т о   м а  к  и те р а то р н ы м  ти п а м . В  те л м  st d :: pai r и  з а те м  graph_trai t s д л я  до с тпу и   м ы   с о з да е м   и те р а то р ы   и с хо д я щ и х   р еб р ,  п е р е да в а я   п ер в о е   р ебр о   дл о   и те р а то р а   и  н о л ь  — дл я   в то р о г о   (в   LED A с  п о м о щ ь ю  н ул я   о б о з н а ч а е тс е  п о с л е до в а те л ь н о с ти ) . Н о л ь  в  к а ч е с тв е  а р г ум е н т а   к  Fi rst_Ad j_Edge() го т   LED A, ч т о   м ы  хо ти м   о б р а б а ты в а т ь   и с хо д я щ и е  р еб р а , а  н е  в хо дя щ и е .

ы е я я -

я  out_edges() дл я  LEDA г 10.8.   иц к н у Ф ( Фицкну я  out_edges() дл я  LEDA > ќ template  std::pair out_edges(typename graph_traits::vertex_descriptor u, const GRAPH& g)

typedef typename graph_traits::out_edge_iterator  Iter: return std::make_pair(  Iter(First_Adj_Edge(u.O)). Iter(O) ); } О с та л ь н ы

е   ти п П олн ы й  к о д  дл я  и н те р фе й с В  л и с ти н г е   10.9 м м и   в  п р а в и л ь н о с т п о в ед н и е  в р е м е н Л ис т н

ы   и те р а то р о а  о бо л ч к ы  и с п о л ь з уе и   реали з ац и и  и с п о л н е н и

в   и  и н те р ф е й с н ы х   ф ун к ц и й  п и ш утс я   а н а л о ги ч н о . и  к  LED A н оаихд ст я  в   boost/ graph/ leda_graph.hpp. м   п р о в ер к у  к о н ц е п ц и й  BG L, ч то б ы   бы т ь  ув е р е н н ы и   и н те р ф е й с а   с   BG L.  Э т и   п р о в е р к и   н е   т е с т и р ую т я  (э т о  те с ти р уе тс я   в  test/ graph.с р ) .

г 10.9.   к р е в о р П а  ицпе но к и го н а во зи л а е р (  leda- concept- check.cpp  > • finclude  #include 

о с й е  иф р е т н

int main() { using namespace boost: typedef GRAPH Graph; function_requires (); function_requires (): function_requires (): function_requires (): return EXIT SUCCESS;

а

оу к Р в д с в т п о п р о и з в о д и е т лн ь о с т

о

 

т

 

Щ

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIH

и

zyxwvutsrqponmlkjihgfe

В  э то й  г л а в е   м ы  о б с диу м   вли ян и е  то г о   и л и  и н о г о  в ы б р а н н о г о  г р а ф а  и з   с е м е й с тв а гр а фо в  BG L ad jacency_l  i st  н а  п р о и з в о ди те л ь н о с ть .  Ц е л ь  э то й  гл а в ы   — да т ь   п о л ь з о т в а те л я м   BG L  н е к о т р ы е   баз овы е   св ед н и я   о   то м ,  к а к и е   и з   ти п о в   гр афо в   м о гу бы т ь   н аи боле е   э ф е к ти в н ы   в   раз ли ч н ы х   с и т уа ц и я х .  М ы   п р е дс та в и м   сери ю   те с то в ,  о т б р а ж а ю щ и х   п р о и з в о ди те л ь н о с т ь   раз ли чн ы х   баз овы х   о п ерац и й   н еск о ль ы   скорост и   вы п олн ен и я к и х   р а з н о в и дн о с те й   a d ja c en c ylist  и з   BG L.  И с л е до в а н х   раз о п ерац и й   н а д   раз реж ен н ы м и   и   п л о тн ы м и   гр а фа м и   с   и сп оль з ован и е м   дв у ли чн ы х   к о м п и л я то р о в   (M icrosoft  Visual  C + +  и  G N U   C + + ) . К а к   осн овн о й   ком п он ен т   BG L- г р а ф а ,  a d ja c e n c yjist  п о м о г а е т   п о л ь з о в а те л я м   к о н тр о л и р о в а т ь   ф а к ти ч е с к и е   с т р ук т ур ы   да н н ы х ,  п р и м е н я е м ы е   д л я   в н ут рен н и х   с т р ук т у р   гр афа .  П е р в ы е   дв а   п а р а м е тр а   ш аблон а ,  EdgeLi st  и  VertexLi  st, и с п о л ь з ую т с я   дл я   в ы б о р а   ф а к ти ч е с к и х   к о н те й н е р о в   дл я   п р е дс та в л е н и я   по с л е до в а те л ь н о с те й   и с хо д я щ и х   ребе р   и   верш и н   с о тв е тс тв е н н о .  П о л ь з о в а т е л и м о гу т   п ри м ен ят ь   vecS,  l i s t s  и л и   set s  д л я   EdgeLi st  д л я   в ы б о р а   к о н те й н е р о в st d ::vec t o r ,  st d :  : l i st  и л и   st d :  :set  с о т в е т с т в е н н о .  О н и   т а к ж е   м о гу т   ук а з а т ь vecS и л и   1 i stS  д л я   в ы б о р а   st d ::  vector  и л и   st d ::  1 i st  с о т в е т с т в е н н о   в   к а ч е с тв е осн овы .

11.1. и н е в а р С

я ы во ф ар г

х ос а л к

в

М ы   сравн и вал и   п р о и з в о ди те л ь н о с т ь   раз ли чн ы х   в а р и а н то в   adjacency_l  i st .  Э к сп ери м ен т ы   п окры ваю т   б о л ь ш и н с тв о   баз овы х   оп ерац и й  н а д   г р а ф а м и :  в с т а в к а и   уд а л е н и е   верш и н   и   ребер ,  о б хо д   гр аф а   п о   верш и н ам ,  р е б р а м   и   и с хо д я щ и м ребра м   к а ж до й   верш и н ы . Т е с т ы   бы л и   вы п олн ен ы   с  р а з р е ж е н н ы м и   и  п л о т н ы м и гр афам и   м алог о   (100  в е р ш и н ) , с р е дн е г о   (1000  в е р ш и н ) и  б о л ь ш о г о   (10  000  в е р ш ин )  р а з м е р а .  Д л я   р а з р е ж е н н о г о   гр аф а   чи сл о   ребе р   в   10  р а з   б о л ь ш е   чи сл а

138 в а Гл

а 11  • в тс д Ро в к у

и zyxwvutsrqponmlkjihgfedcbaZYXWVUTS

о   п о тс о н ь л е т и д о в з и о р п

о   гр аф а   п олн о е   чи сл о   ребе р   равн о   к в а др а т у   чи сл а   в ер верш и н .  Д л я   п л о т н о г ш ин . З ам ер ы   врем ен и   п р о в о ди л и с ь   н а   к о м п ь ю те р е   D ell  с   д в у м я   п роц ес орам и п о   733  М Г ц , с  п а м я т ь ю   512  М б а й т . Т е с т ы   бы л и   п р о д уб л и р о в а н ы   д л я   дв у х   ком п и л я то р о в :  M icrosoft  Visual  C + +  6.0  и   G N U C + +  2.95.3  (п о д   cygwin ).  Д л я   Visual  C + +  б ы л   у с т а н о в л е н   реж и м   о п ти м и з а ц и и   п о   с к о р о с ти .  Д л я   G N U C +  + бы л и  ус т а н о в л е н ы   оп ц и и   - 03 и  - funroll  - loops.  З а м е т и м , ч т о  р е а л и з а ц и я   adjacenc y^  i st  и с п о л ь з уе т   к ом п он ен т ы  и з  STL, к о т о р а я   п о с та в л я е тс я   в м ест е   с  к о м п и л я то р о м . В   та й м е р е   п ри м ен ялас ь   п ер ен о си м а я   P OSI X- ф ун к ц и я   clock(), к о т р а я   и ме т до в о л ь н о  н и з к о е  р а з р е ш е н и е . П о  э то й  п р и ч и н е  э к с п е р и м е н т ы  в ы п о л н я л и с ь  в  ц и к л е   д о   те х   п о р ,  п о к а   з а тр а ч е н н о е   в р ем я   н е   п рев ы си л о   м и н и м аль н о е   раз реш ен и е п о   край н е й  м е р е   в  с т о  р а з . К а ж ды й   те с т   б ы л   п о в т о р е н   3 р а з а , и  в з я т о   м и н и м аль . М ы  з а м е ти л и , ч т о  с та н да р тн о е   о тк л о н е н и е  в  и з н о е  в р е м я  и з  э ти х  тр е х  п р о г н о в м ерен и я х   в рем ен и   с о с та в л я е т   п р и б л и з и те л ь н о   10 %. Дале е  п р и в е д н  п о л н ы й  н а б о р  г р а ф о в ы х   ти п о в , и с п о л ь з о в а н н ы х  в  те с та х . Т а к ж е   ук а з а н ы   а б р е в и а т ур ы ,  к о т р ы е   бы л и   п ри м ен ен ы   в   р е з ул ь т и р ую щ и х   ди а г рам ах .

•   veczyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA adjacency_listzyxwvutsrqponmlkjihgfedcbaZYXW ќ  list adjacency_list ќ set adjacency_list •   listlist adjacency_list

11.1.1. Р т а т ь л узе о б в еа л н и Д

ы   и и н е д  ж субо е  рбе

р  и  вреш и

е н

В  п е р в о м  э к с п е р и м е н т е  ч е р дюу тс я   вы з ов ы  в  add_vertex()  и  add_edge(), п о к а  ч и с л о р еб р  г р а ф а  н е  до с ти г н е т zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   \ Е  | р е б р  и  | V | в е р ш и н . Р е з ул ь та ы   э к сп ери м ен т а  п о к а з а н ы   н а  р и с .  11.1. П о б е ди те л ь   в  э то м  э к с п е р и м е н т е  — о ди н  и з  к л а с о в  adjacencyj  i st с  п а р а м е тр о м   VertexLi st—1 i stS.

о б в еа л н и Д В з ул ь т а ся Пр дл

е  рбе   э то

р

м   те с т е   до б а в л я ю тс я   Е   р еб р   к  гр а ф у ы   п оказ ан ы  н а  р и с . 11.2.  О ч е в и дн ы   adjacency_l  1 st  с  VertexLi st= vecS, н е з а в и с и м и   и сп оль з ован и и   G N U  C + +  п о б е ж да е я   раз реж ен н о г о   гр а ф .

,  к о т р ы й   жу е   и м е т   | V | в е р ш и н . Р е м   п о б е д и те л м   д л я  Visual  C + +  я в л я е т о  о т  р а з м е р а  и  р а з р е ж е н н о с т и   гр а ф . т   клас с   adjacency_list  с  EdgeLi st= l i stS

11.1.и н е н в а Ср е н ы зай р Р е ж

,

е н ы й за р Р е ж

Visual C++

,

я ыво ф ар г

х ос а кл

лПо н ы т й , Visual C++

GNU C++

в

139

Пл о н ы т й , GNU C++

i 0.8 izyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

3 m к   0,6 m ш го

 0,4 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

с га

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

о .

I vec mist И   set CD  listlist ГН Т Г

0 1 0 0

Ри с

1 0 0 0 1 0 0 0 0

. 1 1 . 1 . т а ь л з уе Р е н ы а з Рр й е ж

ы

1 0 0

и зм ер ни

1 0 0 0 1 0 0 0 0

я в р ем ен

,

и лд

е н ы й за р Р е ж

Visual C++

1 0 0

я э ск п ер и м ент

1 0 0 0

а с о д б в а ел н и

,

м

лПо н ы т й , Visual C++

GNU C++

1 0 0

р еб

1 0 0 0

р и вер ш и Пл о н ы т й , GNU C++

I 0,8 ш I 2 о с  0,6 2

ш

О

гша

 0,4

0 100

си Р

1000 10000

. 11. 2.т та ь л у з Ре

100 1000 10000 ы и н е р м зе и

я нм е р в

и лд

100 я т м н и е р п с кэ

1000 а с еи н е л в або д

100 м еб р

р

1000

н

140 в а Гл

а 11  • в тс д Ро в к у

ине л а д У

е  рбе

о   п о тс о н ь л е  т и д о в з и о р п

и

р zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

В  э то м  те с т е  д о б а в л я ю тс я   и  уда л я ю тс т ы   п оказ ан ы   н а  р и с .  11.3.  Р е з ул ь та ясн о , ч т о   ad jacen cyjist  с  п а р а м е тр о боль ш и х   гр а фо в . е н ы а з Рр й е ж

,

  \ Е  | р е б р   гр а ф а  с  | V | в е р ш и н а м и . Р е з лу ь та я zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIH т   н еясе н  д л я   г р а ф о в   м алог о   раз м ера .  О дн а к о м   VertexLi st= setS я в л я е т с я   п о б е д и те л м   дл я

е н ы й за р Р е ж

Visual C++

л но П ы т й , Visual C++

, GNU  C++

л но П ы т й , GNU  C++

i  iS 0,8

1 П I 3zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA к   0,6 9 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

Q. zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA В

0,4

га Q. ^ 0,2

• •  vec CZH set

С И   listlist

1 100 

1000  10000

Ри с

и ен л а д У

. 1 1 . 3 .  та ьлзеу Р

е  верш и

100 

1000  10000 ы  и зм ер ни с  уелниад

1000

100 я  врем ен м   р еб

и  дл

я  э ск пери м ент

100 а

р

н

В   э то м  те с т е   до б а в л я ю тс я   | V | в е р ш и н  и   \ Е  | р е б р   к  г р а ф у ,  а  з а те м   уд а л я ю т с в ерш и н ы .  Р е з ул ь та ы   п оказ ан ы   н а  р и с . 11.4.  О ч е в и дн ы м   п о б е ди те л м   я в л я е тс l i s t l i s t ,  к о т р ы й   сп ец и аль н о   р а з р а б о та н   д л я   э то й   о п е р а ц и и . Д р уг и е   вари ан т adjacencyj  i st  и м е ю т  о ч е н ь  п л о ух ю   п р о и з в о ди те л ь н о с ть , та к  к а к  э т а  о п е р а ц и п о л н я е тс я   н е  з а  п о с то я н н о е  в р е м я .

и ч с кО т

а  верш и

1000

я   вс е я ы я  в ы -

н

В  э то м  те с т е   сн ач ал а  до б а в л я ю тс я   | V | в е р ш и ю тс я   и   уд а л я ю т с я   вс е   в ерш и н ы .  О п е р а ц и в с е  р еб р а , о тн о с я щ и е с я  к  в е р ш и н е . Р е з ул ь та ч ен и и   раз м ер а   гр а ф а   adjacen cyjist  с  п а р а м е тр о б е ди те л м .

н  и  \ Е  | р е б р  к  г р а ф у , а  п о т м  о ч и щ а я   clearj/ ertexO  о б ох ди т   гр а ф ,  уд а л я я ы   п оказ ан ы  н а  р и с . 11.5. П р и  ув е л и м   VertexList= vecS  с та н о в и тс я  п о -

11.1. и н е н в а р С е н ы й за р Р е ж

,

е н ы й за р Р е ж

Visual C++

я ы во ф ар г

х ос а л к

л но П ы т й , Visual C++

, GNU C++

в

141

лПо н ы т й , GNU C++

0,8 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

С О

к

0,6

I 0) о

0, 4 С го Q-

• •   vec

С И   set CZD listlist zyxwvutsrqpo

I

100  1000 10000  100 1000 10000  100  Рис . 11.4.  татьлузеР ы  иинер мз я  внем р и  дл я т н е м и р е п с к э е н ы а з Рр й е ж

,

е н ы й за р Р е ж

Visual C++

1000  а  с еин л аду

100  1000zyxwvutsrqp м  верши н

лПо н ы т й , Visual C++

, GNU  C++

лПо н ы т й , GNU  C++

i  0 , 8

з 0,6 2 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA а> а. а

га  0,4

I а.

100 

Ри с

П   veIc • IHst t.m ..,.[  SSI 1 1 1000  10000 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA 100  1000  10000 100 1000 100 I—I lis1tl0is00t

.  1 1 . 5 .та  ьлезу Р

ы  изм ерни

я   в р ем ен

и  дл

я   э ск п ер и м ент

а  с  о чи с окт

й   вер ш и

н

1 4 2 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 11  •  овскдут Р о  п о  пронисзвеьлтд и

о бх О

д  верш и В  эот

н zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

м  тест а   к ажо д в   гр а ф

е  о бохядст я   вс е  верш и н ы  граф , ч и ат я  з н ач ен и е  в н ртеун н ег о  свой й   в ер ш и н ы . Р ез льу ат ы   п о к аз н ы  н а  ри с . 11.6.  С ред и   п ер в ы х   ре т х ит п о а   н е т   ч ке т о г о   п о б е ид т л я .  Ообх д   в ер ш и н   б ы л   б ы рс т ы м   л д я   иэ т х к лас о в , та к   к а к  он и  и мюе т   о ид н а к о в ы й   п а р м ет р   Vertexl_ist= vecS.  Д л я   боль ш и х   гр а ф о в   ит п а   l i st l i st  о бх д   б ы л   м ле д н е , та к  к а к  он и  и сп о ль зюу т   VertexList= listS. вст

е н аз ыР р й е ж

е н ы й за р Р е ж

,

л но П ы т й , Visual C++

,

Visual C++

GNU C++

л но П ы т й , GNU C++

0,8 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

ш

к   0,6

ш

Q. S га  0,4

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

га

а. vec list set listlist 100 

1000  1 0 0 0 0

си Р

обхО

д  рбе В  эо т

ог д

м  тсте о  рбера

1 0 0 

. 11.6.т та ь  Рел у з

е  ос тяодбх . Р езльаут

д  исщоядх и В   о эт ыт в а н и г о  рбера

ы и ин е рм з

100

10000

м в тс  ме ж о н

я  внм е р

а  вш рие

1000

и л д я тмниер эпс к н

100

1000

а

р я  вс е  ррбе ы  п оказ н

adjacency_l i st  с  п а р м е тр о

обхО

с о д оо х б

1 0 0 0 

м  тест е   с ят о д б х и  з н ач ен и .  Р езльаут

а  гарф , чиа т я  з н аче и ы  н а  ри с . 11.7. Явн ы

е  врнет у ге м  п иолебдт

о  свой ст м  зесд

а  кжа ь  яв ляест

я

м  EdgeLi st=vecS.

х  бер

р

я   вс е   щ яи о д с х я  вн рет у н ег ы   п о к аз н

adjacency  l i s t с EdgeList=vecS .

о  свой ст ы  н а  ри с

е   бр е а   о кж а д й   в р еш и н ы   р аг ф , п р а  кажод й  вреш и н ы  и  коажгд о   и оя щ д с х е . 11.8. Явн ы м  пилеодбт м   з се д ь   я в л се т

и  счи

я

-

11.1. и н е н в а р С э

а з е рн ы ж й

э

,

Visual C++

а з е р н жы й

,

я ыво ф ар г л но П ы т й

GNU C++

х ос а л к

,

в

143

лПо н ы т й

Visual C++

,

GNU C++ a |-

IIOJ

i 0,8 iCD X : к 0,6zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA .; к s p ОQ. zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA



'• •

0>

о

i ra 0,4 a mо i3 2 D. ?0,2

i

• :•

i  • •   vec |   И Я   list ~Г П   set 1  CZJIist list

; :

n

100  1000  10000  Ри с

. 1 1 . 7 .   т а ь л з уе Р е н аз ыР р й е ж

100  1000  10000 

ы   и зм ер ни ,

Visual C++

я  врем ен е н ы й за р Р е ж

и  дл

100  я   э с к п ер и м ент

, GNU  C++

1000  а  с  ообдх

100  м   б на о р

лПо н ы т й , Visual C++

1000

а   р еб

р

Пл о н ы т й , GNU  C++

з а

о :  0,6

0,4

0,2

vec list zyxwvutsrqponml !  О

С  I

zyxwvutsrqpon 100  1000zyxwvutsrqpo х  реб р listlist

0

Рис

100  1000 10000  . 11.8.  та ьлузеР ы  иинер мз

100  1000 10000  я  внем р и  дл я т н е м и р е п с к э

100 

1000  а  с од хб м  иищядохс

144 в а Гл

а 11 •в тс д о в Рк у

11.2. Иго т Р аз н ы с а  мжде л о ж ен и

е  ком би н ац и у   ск о р ь т я  яв л яю ст •   И сп о ль з о в ан и п о  иящодсх и •   И сп о ль з о в ан и о х д  м н ожвест •   Э феки т в н о н и о ст з о в ат

о  п тсо н ь л е т и д о в з и о р п

и в га л

ы

и  альернт иа ю  оод хб я  резалмьту

и

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFE

в  являю ст

я  раз ли чн ы м

а   и  скьорст

и  вари н амт я  и  уалден и я .

ю  добавлен и х  эксп ери м ен овт

и   н ша и

е  vecS дл я  EdgeLi st  ыоб чн м  рберам .

о  оспбе чи веа

е  vecS дл я  VertexLi st  ыоб чн а  вреш и н . е  уалнед и , дл я   п олеьвсдатн ост ь   std:  - .set.

е   ршв е и

•   Д л я  э фекит вн ог о  добавлен и я  реб EdgeLi st. •   Е сл и   а л ед н у и е   в ре ш и н   п р ио д с х VertexLi st, та к  ка к  std:: 11st а  квачсет н ы  з а  п остян о е  врем я . •   Д л я  очи кст и  врше и н  хорш и ц и я  clear_vertex()  може р еб ) .

м  вы орб т  и сп оль з овьатс

т   о ч са т е  онс ов

т  э фекит вн ы

о  п ри м ен ят

-

й  оо хб

д й  об -

я   sets дл я   EdgeLi St. В  чтса р   м ож н о  бы л о  б ы  и сп оль

х   бр е р  нжн у

е  п о

т  э фекит вн ы о  обспе чи вае

н  преждио свате и   щ я и о д сх

и  комп р и с .  ю уСщдел и

ь  vecS и л

,  нж у о   и сп о ль з о в ат ы  вы п олн яе

м  дл я  VertexLi st яв ляест я  дл я  уаледн и я   в се

т  уалнед и

-

и  11 stS дл

я

ь   list s  лд я е  врше и я  vecS (н уф к х  и н ц ине д т ы :

:

1

ст а Ч о н ч в арп С

ь

в с о дт к ур

о

е

148

в а Гл

а 12  •  Концеп и

и  BGL

а   1 2 . 1 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA  { пернио дл)ж

Та б л и ц В еы н р и а ж

В о з в р ща еа м ы е

BidirectionalGraph е я н чо т у

num _vertices(g) vertices(g)

num _edges(g) edges(g) source(e, g) target(e, g) edge(u, v, g)

12.1.1. Н ы н а во ри т н еи ро е

И те р а ц и я  п о  в хо дя щ и м  р е б р а м std ::pair< in_edge_iterator,  in _edge_iterator> degree_size_type degree_size_type И те р а ц и я   п о  с м е ж н ы м  в е р ш и н а м . std::pair

т   Graph

graph_traits< G > ::edge_descriptor graph _traits< G > ::edge_iterator graph_traits< G > ::edges_size_type

AdjacencyMatrix  оутнчяе

е

т   Graph

graph _ traits< G > ::vertex_ iterator graph_traits< G > ::vertices_size_type

EdgeListGraph  оунтчяе

и   о п и с ан и

т   Graph

graph_traits< G > ::adjacen cy_iterator adjacent_vertices(v,  g) VertexListGraph уонтчяе

п   ил

т   IncidenceGraphzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONM

graph _traits< G > ::in _edge_iterator in_edges(v,  g) in_degree(v,  g) degree(e, g) AdjacencyGraph  онтчуяе

й   ти

Т и п  о б ъ е к т а  д л я  о б о з н а ч е н и я  р е б р И те р а ц и я   п о  н а б о р у  р е б е р   гр а ф а Ц елы й  б е з н а к о в ы й  ти п  д л я  п р е дс та в л е н и чи сл а   р еб р edges_size_type std::pair< edge_iterator,  edge_iterator> vertex_descriptor vertex_descriptor я

т   Graph

std::pair< edge_descriptor,  bool>

е  гф а р

ы

И н те р ф е й с , к о т о р ы й  BG L п р е до с та в л я е т   дл я  до с туп а   и  м а н и п ул я ц и и   н е о р и е н ти рован н ы м и  г р а ф а м и , то т  ж е , ч т о  и  д л я  о р и е н ти р о в а н н ы х   гр а фо в . И н т е р ф е й с  о ди н , та к   к а к   е с т ь   о п р е д л е н н а я   э к в и в а л е н тн о с т ь   м еж д у   н е о р и е н ти р о в а н н ы м и   и   ори е н ти р о в а н н ы м и   гр афам и .  Т о   е с т ь   л ю б о й   н е о р и е н ти р о в а н н ы й   гр а ф   м ож е т   бы т ь п р е дс та в л е н   к а к  о р и е н ти р о в а н н ы й , е с л и  н е о р и е н ти р о в а н н о е  р е б р о  (м , zyxwvutsrqponmlkji  v)  з а м е н и т ь д в ум я   о р и е н ти р о в а н н ы м и   (м , v)  и  (v,  и) .   Т а к о й  о р и е н ти р о в а н н ы й   гр а ф   н аз ы в ает с я   вйитнаоер   ий е с в р   н е о р и е н ти р о в а н н о г о   гр а фа .  Н а  р и с .  12.2  п о к а з а н  н е о р и е н ти р о в а н н ы й   г р а ф  и  ег о  о р и е н ти р о в а н н а я   в ерси я . З а м е ти м , ч т о  д л я   к а ж до г о р ебр а   н е о р и е н ти р о в а н н о г о   гр а ф а   о р и е н ти р о в а н н ы й   г р а ф  и м е т  дв а   р е б р а .  Т а к и м а   к  и н образ ом , BG L и с п о л ь з уе т   ф ун к ц и ю  out_edges  ()  (и л и  1 n_edges ( ) ) д л я  до с туп ц и де н тн ы м   р ебр а м   в  н е о р и е н ти р о в а н н о м   гр а фе .  нА а л о г и ч н о   sourceO  и   t arget  О п р и м е н я ю тс я  д л я   до с туп а   к  в е р ш и н а м . С н а ч а л а  э т о  м о ж е т   п о к а з а ть с я   п р о ти в о р е чи вы м  ф а к то м . Н о , уч и ты в а я   э к в и в а л е н тн о с т ь  м е ж д у   н е о р и е н ти р о в а н н ы м и  и  о р и -

12.1. и ц п е ц н о К

ен и т р о в а н ы м ен и т р о в а н ы м

и  графм и , BGL п оз в ляе , та к  и  к  н оери н и трован ы

и сР

. 12.2. ы н а вори т н еиро е Н

т  п ри м ен тя

й

м  графм

ар г

ф

и до хбо

ь  мн иог .

и г е о ы н а во ри т н еи ро

в zyxwvutsrqpo 1 4 9 zyxwvutsr

а о ф ар г

е  аолргим т

ы  ка к  к  ори

й н е л а в и эк

-

т

ю С у л де щ и й   п ри м е р  в  ли ст н г е  12.1 дмеон ристе у т   и с п о ль з о в ан и е  out_edges ( ), source() и  target О  с  н оери н трован ы м  гроафм . Хот я  оыб чн о  н ап рвлен и е  рбре а н е  п ри н и мсате я  в о  вн и мна и е  дл я  н ореи н трова н ы х  говфра , в  сча ул е  п ри мне и я н фу к ц и и  out_edges () к  вреш и н е  иzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDC  н ачльн а я  вреш и н а  дл я  дескри порт а  рбер а  все д г а  и,  а  кон ечн а я  — смжен а я  с  и.  В  фн у к ц и и  in_edges(), свнесто о , н аобрт . Л ис т н

г 1 2. 1 . и ц а р тсмно Де я ы ро т к е н х иц к н фу й л д я го н а во ри т н еи ро н о ф ар г template void undirected_graph_demol() { const int V = 3; UndirectedGraph undigraph(V); typename graph_traits::vertex_descriptor zero. one. two; typename graph_traits::out_edge_iterator out, out_end; typename graph_traits::in_edge_iterator in, in_end; а

zero = vertex(0. undigraph): one - vertexd. undigraph): two = vertex(2, undigraph); add_edge(zero, one, undigraph); add_edge(zero. two. undigraph): add_edge(one, two, undigraph); zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

: ": std::cout «  "и(еищядохс )О for  (tie(out, out_end) = out_edges(zero.  undigraph); out != out_end; ++out) std::cout «  *out: : "; Std::COUt «  Std::endl «  "в(еищядох )О for (tie(in. in_end) -  in_edges(zero. undigraph); in != in_end; ++in) std: :cout «  *in; std: :cout « std::endl;

В ы во

д  бе д у

(ещ и я)дОо х с и (ещ и я О)д о х в

то Х и мюе с т

т   ю у дщ с л е и м

:

: (0,1) (0,2) : (1,0) (2.0)

я  и н ерфтй я   н к е о р ыт

с  дл я  н оери н трован ы е   л ои т ч

я   в   п нео в д и

х  и  ори не и трован ы и   н фу к ц и й

, п оск ль

х  горфа у   р а в ен с т

в  ои дн аков

, о   бр е

р

1 5 2 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 12  •  Ки ц п е ц но и  BGL

graph_traits::directed_categoryzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLK

Т ег

и  д л

я   э то

й  к а те г о р и и

: di rected_tag  и  undi rected_tag.

•   graph_traits::edge_parallel_category

О п и сы в ает ,  п о з в о л я е т   л и   гр а фо в ы й   к лас с   о с ущ е с т в л я т ь   в с та в к н ы х   р еб р   (р е б р а   с  о дн о й  и  то й  ж е   п а р о й  н а ч а л ь н о й  и  к о н е ч н о ет г а :  al Iow_paral Iel_edge_tag  и  disallow_paralle1_edge_tag.

у   п арал ель й  в е р ш и н )

. Д в

а

•   graph_traits::traversal_category

О п и сы вае С л е д ую щ и

т   в и д ы   обхд а   и те р а то р а м и ,  к о т р ы е   п о держ и в ае т   да н н ы е   клас ы  те го в   о п р ед лен ы : struct  incidence_graph_tag  {  }; struct  adjacency_graph_tag  {  }: struct  bidirectional_graph_tag  :  public  virtual  incidence_graph_tag  {  }; struct  vertex_list_graph_tag  {  }; struct  edge_list_graph_tag  {  }: struct  adjacency_matrix_tag  {  };

й   гр а ф

.

1 2 . 1 . 3 . Incide nce Gra ph

К он ц еп ц и я   IncidenceG raph о б е с п е ч и в а е т   и н те р ф е й с   дл я   э ф е к ти в н о г о   д о с т уп а к   и с хо д я щ и м   р ебр а м   к а ж до й   в ерш и н ы  г р а ф .  И с хо дя щ и е  р е б р а   (out- edges)  до с т уп н ы   ч ер з   и те р а то р ы   и с хо д я щ и х   р еб р .  Ф у н к ц и я   out_edges(v,  g)  п о   да н н о м у де с к р и п то р у   в ерш и н ы   v  и   г р а ф у   g  в о з в р а щ а е т   п а р у   и те р а то р о в   и с хо д я щ и х   в ер ш и н .  П е р в ы й  и те р а то р  ук а з ы в а е т   н а  п е р в о е  и с ох дя щ е е  р е б р о  в е р ш и н ы zyxwvutsrqponmlk  v, а  в то р о й и те р а то р   — з а   к о н е ц  п о с л е до в а те л ь н о с т и   р еб р .  Р а з ы м е н о в а н и е  и те р а то р а   и сох дя щ и х   в ерш и н  в о з в р а щ а е т   де с к р и п то р   р еб р а .  И н к р е м е н т  и те р а то р а   п ер м ещ ае т ег о   к  с л е дую щ е м у   и с хо д я щ е м у   р ебр у .  П о р я до к  п о я в л е н и я  и с хо дя щ и х   р еб р  пр и и те р а ц и и   н е  ф и к с и р о в а н , хо т я   к о н к р е тн а я  р е а л и з а ц и я  г р а ф а   може т   и м ет ь   н ек о то р о е   уп о р я д о ч е н и е .

о н еч т и У

е  дл

я

Graph с А о ц и р н в ыа

е  тип

ы

Ниж е   п ри в ед н ы  а с о ц и и р о в а н н ы е  ти п •   graph_traits::edge_descr1ptor

ы  д л

я   к о н ц еп ц и

и  I ncidenceG raph.

Д е с к р и п то р  р е б р а  с о тв е тс в еу т   ун и к а л ь н о м у   р ебр у   в  г р а ф е DefaultConstructible, Assignable и   EqualityComparable.

. О н  до л ж е

н   бы т

ь

•   graph_traits::out_edge_iterator

И те р а то р   и с хо д я щ и х   ребе р   дл я   в е р ш и н ы   v  о б е с п е ч и в а е т   до с ту п   к   и с хо д я щ и м   ребра м   верш и н ы  v. Т и п  з н а ч е н и я  и т е р а т о р а   — edge_descriptor  о т   с в о е г о   гр афа .  И т е р а т о р   и с хо д я щ и х   верш и н  д о л ж е н   о тв е ч а т ь   тр е б о в а н и я м   MultPasslnputlterator.zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCB

ќ  graph_traits::degree_size_type Эт ны

о  б е з н а к о в ы х   р еб

й  ц е л ы р  в е р ш и н ы

й  ти п .

, п р е дс та в л я ю щ и

й  ч и с л

о  и с хо дя щ и

х  и л

и  и н ц и де н т

-

12.1. онцКеп и

о п с у и мД т ы

е е н и в ы р жа

а о ф раг

в

153

я zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDC

Ниж е   п ри в ед н ы  до п ус ти м ы •   source(e,  g) Ти

и о дб х

п   р е з ул ь т а

е   в ы раж ен и

я  д л

я   к о н ц еп ц и

и  IncidenceG raph.

:  vertex_descriptor.

С е м а н ти к а н о г о  ч е р е

:  в о з в р а щ а е з  е .

П р е д ус л о в и е

т   де с к р и п то

:  е  — до п ус ти м ы

ы zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPO   и  д л я   р е б р а   (и,   v),  п р е дс та в л е н -

р   в ерш и н й   де с к р и п то

р   р ебр

а   гр а ф

а  д .

•   t ar g e t ( е .  д )

Ти

п   р е з ул ь т а

:  vertex_descriptor.

С е м а н ти к а н о г о  ч е р е

:  в о з в р а щ а е з  е .

П р е д ус л о в и е

т   де с к р и п то

: е  — до п ус ти м ы

р   в ерш и н й   де с к р и п то

ы  д л р  р е б р

я   р еб р

а   v  {и,  р ) ,  п р е дс та в л е н

а   гр а ф

-

а  д .

•   out_edges(v,  g) Ти

п   р е з у л т аь

: s t d : :pair< out_ed g e_iterator,out_ed g e_iterator> .

С е м а н ти к а :  в о з в р а щ а е т   п ар у   и те р а то р о в щ и м   ребра м   (д л я   о р и е н ти р о в а н н ы н е о р и е н ти р о в а н н ы х  г р а ф о в ) в е р ш и н в о  в с е х   и с хо дя щ и х   р ебр ах .  В е р ш и н ы хо д я щ и х   р ебр а х   (н е в а ж н о , о р и е н ти р о в а н н ы П р е д ус л о в и е

:  v — до п ус ти м ы

,  о б е с п е ч и в а ю щ и х   гр афо в )  и л ы  у.  В е р ш и н , с м е ж н ы е  с й  г р а

й   де с к р и п то

х   д о с ту и   и н ц и де н тн ы а  v п о я в л я е т с  v, я в л я ю т с ф  и л и  н е т )

р   в ерш и н

ы  г р а ф

п   к   и с ох д я м   р ебр а м   (д л я я  к а к  н а ч а л ь н а я я   к о н еч н ы м и  в  и с .

а  д .

•   out_degree(v.  g)

Ти С е м а н ти к а фов ш ин

п   р е з ул ь т а

:  degree_size_type. :  в о з в р а щ а е

)  и л и   ч и с л ы  V.

П р е д ус л о в и е

и рн т а Г

и  снос тл ж

Ф ун к ц и м я . Ф у н к ц и и с хо д я щ и

т   чи сл

о   и с хо д я щ и х   р ебе

:  v — до п ус ти м ы

й   де с к р и п то

х   ребе р   (д л я   н е о р и е н ти р о в а н н ы р   в ерш и н

я   о р и е н ти р о в а н н ы х   гр афо в ы  г р а ф

х   гр а )  в е р

-

а  д .

и

P . . J -   _х . -   I/ - . B i d i r e c t i o n a l G r a p h

я   BidirectionalG raph  ут о ч н я е я   э ф е к ти в н о г о  д о с т уп а   к  в хо д я щ и ц и я   в ы де л е н а   и з   IncidenceG raph,  п о т о м д о с т уп а   к   в хо д я щ и м   ребра м   о р и е н ти р о в а н н о г п а м я ти , а   м н о г и е  а л г о р и т м ы   н е  тр е б ую ти р о в а н н ы х  г р а ф о в  э т о  н е с ущ е с т в е н н о б уе т с я .

дл

р   (д л

и   source(), target О   и  out_edges()  д о л ж н ы  в ы п о л н я ть с я  з а  п о с то я н н о е  в р е я  out_degree()  до л ж н а   в ы п о л н я ть с я  з а  л и н е й н о е  в р е м я  п о   к о л и ч е с тв у х   р ебе р  в е р ш и н ы .zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

- 1 - 1  1   И   1 2 . 1 . 4 . 

К он ц еп ц и

о   и н ц и де н тн ы

т   IncidenceG raph: д о б а в л я е т с м   ребра м   к а ж до й   верш и н ы у   к а к   п р е до с та в л е н и о   гр аф а   обы чн т  д о с т уп а   к  т а к и м  р е б р а м , т а к   к а к  д о п о л н и т е л ь н а

я   тр е б о в а н и . Э т а  к о н ц е п е   э ф е к ти в н о г о   т р е б уе т   боль ш . Д л я   н е о р и е н я  п а м я т ь  н е  т р е

е о е -

154

о тнч е У и

в а Гл

а 12 • и Кц п е ц но

и  BGL

е  дл я zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA IncidenceGraph

с А о ц и р н в ыа

е  тип

ы

Н иж е  п ри евд н  асоц и рован ы й  ти п  дл я  кон ц пе ц и и  BidirectionalGraph.zyxwvutsr ќ  graph_traits::in_edge_iterator И е р то а р   щя о д в х и х   бр е р   л д я   рвш е и н ы zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPON   v  оспбе чи веа т   у о стд п   к   щя о д в х и м бр а е м  вреш и н ы  v. Ти п  з н ачен и я  иореат а   — edge_descriptor  о т  сгвое о  граф . И е тр а о р   и о ся щ д х и х   в ре ш и н   о лд ж е н   в о ечт а ь   р те б о в а н и я м   MultiPassInputIterator.

о п с у и мД т ы

е  вени ыржа

я

Н иж е  п ри енвд ы  диопстмуы е   в ы р а ж ен и я  дл я  кон ц пе ц и и  BidirectionalGraph. •   in_edges(v.  g) Т и п   р е з ла ь т у :  std: :pair. С ем а н и т к а : воз вращ ае т  п ра у  иореатв , опсебчи вюа щ и х  дуост п  к  вщяод хи бр а е м  (дл я  ори ен итрован ы х  графов ) и л и  и н ц ине д т ы м  рбрае м  (дл я  н оери ен и т р о в а н ы х  графов ) врше и н ы  v. Вшре и н а  v п оявлсет я  ка к  кон чен а я  в о  вес щя о д в х и х   р бе а х . Врше и н ы , дл я  корыт х  вреш и н а  v — смжен ая , являю ст я  н а ч аль н ы м и  в о  вщяодх и х   рб а е х   (н еважн о , ори ен ит рован ы й  гра ф  и л и  н )ет . П с л о ру в е д и •  Ти п С ем а н и т к а и   ч и сл П с л о ру в е д и •  Ти п С ем а н и т к а в ан ы в р еш и н

: v — оипсдтмуы й  дсекри по т in_degree(v,  g)   р е з ла ь т у :  degree_size_type. : воз вращ ае

  р а ез л ь т у

:  degree_size_type. : воз вращ ае т   ч и сл о  вщяод хи х  гр афо в ) и  чи сл о  и н ц инед т ы ы  v. : v — доипстмуы

и  сно с лтж Ф н у кц и

з а  ли н ей н о

о  вщяод хи р  (дл я  н оери н и трован ы й  дескри пот

: v — оипсдтмуы degree(v,  g)

П с л о у вр е ид

и рн т а Г

т  чи сл х  рбе

о  и н ц и енд т ы

я  i n_edges () джнло е  врем я , п о  чи сл

р  вреш и н

х  рбе

ы  граф

р  (дл

х  рбе

й  дескри пот

х   и  ищяод сх и р  (дл р  вреш и н

-

х  графов

х  графов ы  граф

х   р бе

) вреш и н

) ы  v.

а  д .

р  (дл

я  н еори н ит рован ы

я  ори не и тро

х  графов

ы  граф

х

а  д .

я  ори ен ит рован ы

р  вреш и н

м

)

а  д .

и а  вы пьнслотя у   щя о д в х и

я  з а  пняо тс х  рбер

е  мяерв , н уфкц и я  i n_degree () — .zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPO

1 2 . 1 . 5 . Ad ja c e nc yGr a p h К о н ц еп ц и я  AdjacencyGraph  оплеярд т  и н ерфтй н ам .  С мжен ы е  вреш и н ы  муог т  бы т ь  такж е  пчнеолу щя о д х и х   р еб .  Онд ак о  дл я   н оркыет х   а ло г р и м т и   б о ле е  уонб д о  п чоатлу ь   у о тс д п   к  смжен ы м  врше и н а

с  дл я  дп уост а  к  смжен ы м  вреш и ы  ка к  кон че ы е  вреш и н ы  и с в   и щя о д с х и е   рбе а   н е  нжн у ы м  н еп вонстрд о .

12.1.zyxwvutsrqponmlkjihgfedcbaZYXWVUTS и цеп н Ко и до хбо а о фа р г в 155

о н ечт и У

е дл

я

Graph

с А о ц и р вн а ы

е ит п

ы zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

Н иж е  п ри евд н   ас о ц и р о в ан ы й  ти п  дл я   кон ц пе ц и и   AdjacencyGraph.zyxwvutsrqponml ќ  graph_traits::adjacency_iterator И е рт а о р  смжен ост и  дл я  вреш и н ы zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFE  v п оарвседлтя т   у о тс д п   к  вреш и н ам , смже н ы м  с  верш и н о й  v. Ти п  з н ачен и я  иореат а   см ж е н о ст и   — дескри п от р   в р еш и н ы   с в о ег о  граф . И ероат р  долж е н  овечта ь  требован и я м   MultiPassInputlterator.

о п с у и Д мт ы

е е ни в ы рж а

я

Н иж е  п ри енвд о  диопстму е   в ы р а ж не и •   adjacent_vertices(v.  g) Ти

п   р е з у л т аь

и   AdjacencyGraph.

: st d : :p air< ad jac enc y_it erat or,ad jac enc y_it erat or> .

С ем а н и т к а у т п   к  вреш и н ам п ч о ен л у и П с л р оу е д в и е

и рн т а Г

: воз вращ ае

т   и д ап з о , смжен ы

ю   к о н че ы

х  врше и :  v — доипстмуы

и  сно с тл ж Ф ну к ц и

е  дл я  кон ц пе ц и

н   з н а ч ен и м   с  вреш и н о н  дл я  кго жад й  дескри пот

й   о и р ае т ,  осбпе чи вюа щ и й  v. Бо ле е   к о н к р ет о : эт о  э кви ален т о   щ я и о д сх г е о   бр е а  вреш и н р  вреш и н ы  грфа а  д .

й   осд

о

ы  v.

и

я  adjacent_verti  ces()  олдж н

а  оырабт в

ь   з а  п оняст о

е  врем я

.

1 2 . 1 . 6 . Ve r t e xList Gr a ph К о н ц еп ц и в р ше и

н  граф

о н тч е и У

я  VertexListGraph  оп леярд .

е  дл

т   р ебт о в а н и

я  дл

я  э фекит вн ог

о  оод бх

а  все

х

я

Graph

с А о ц и р вн а ы

е  тип Н иж •

е  п ри невд

ы

ы  асоц и рован ы

е  тип

ы  дл я  кон ц пе ц и

и   VertexListGraph.

g г а ph_t ra it s < G> ::vert ex_it erat or

И е р то а р  вреш и н  (пчмаеолыу й  чре з  verti ces (g)) опсебчи ва в ер ш и н а м  граф . Ти п  иоерат а  долже н  овечта ь   р еб т о в а н и я Iterator. Т и п  з н ачен и я  иореат а  врше и н  долже н  бы т ь  дескри порт •   graph_traits::vertices_size_type Э т о   б ез н ак о в ы й   ц ел ы й   ит п ,  котры м   м ож н о   п р е сд а т в и т в  графе .

о п с у и мД т ы

е  вени ыржа

ь   ч и сл

о   в ер ш и

я

Н иж е  п ри невд ы  диопстмуы •   vertices(g) Т и п   р е з у л та ь

т  дуост п  к о  вес м м   MultiPassInputм  верш и н ы .

е   в ы р а ж ен и

я  дл

я  кон ц пе ц и

и   VertexListGraph.

:  st d : : p air < ver t ex_it er at o r . ver t ex_it er at o r > .

н

1 5 6zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA ва Гл а 12 • и цеп н Ко и BGLzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGF

С ем а н и т к а : воз вращ ае т  ди ап з о есв м  вреш и н а м  граф а  д . •   num vertices(g) Ти

п   р е з у л та ь

С ем а н и т к а

: воз вращ ае

т  чи сл

и  сно с лтж

, обсеп чи ва

я  ду отс

п  к о

о  врше и

о н ечт и У

е  д .

ь   з а  п оняст о о  з ави сет

о  ли н ей н

е  врем я ь  о т  ч и сл

. В рме а  верш и н

я  вы п онл е .

-

Edge List Gra ph я   EdgeListGraph  очтн у ея я  обсеп чн и е  э фекит вн ог

м  яв ляест

н  в  граф

и

я  verti ces О  должн а  оырабт в и  num_vertices()  олждн

12.1.7. К о н ц пе ц и н ие

й  иорает

: ver t ic es  size  type. _

и тн р а Г Ф ну к ц и н и я  фн у кц и

н  з н ачен и

е  дл

т   к о н ц пе ц и о  дп оуст

ю  Graph. Доп лн и ельтн ы а  к о  вес

м   аво б е р т м  рбера

м  граф

.

я

Graph

с А о ц и р н вы а

е  тип

ы

Н иж е  п ри невд ы  асоц и рован ы е  тип ы  дл я  кон ц пе ц и и  EdgeListGraph. •   graph_traits::edge_descriptor Д ес к р и п о т р  рбер а  се вустое т   н у и к ал ь н о м у  ррбе у  в  граеф . О н  долже н  бы т ь DefaultConstructible, Assignable и  EqualityComparable. •   graph_traits::edge_iterator И е р о ат р  реб р  (п чоенлу ы й  чре з  edges (g)) оспбе чи веа т  дуост п  к о  вес м  рб е ар м  граф . Ти п  edgeiterator дожле н  свотас е ь  трбеован и я м  Inputlterator. Ти п  з н ач ен и я  иоерат а  реб р  дожле н  бы т ь  таки м  же , ка к  у  дескри порт а  реб р ан д о г о  граф . •   graph_traits::edges_size_type Э т о  без н аковы й   ц ле ы й  ти п , и сп ольмезыу й   л д я   п а р в с т е дл н и я   ч и сл а   еб р р в  граеф .

о п с иу м т Д ы

е  вени ыржа

я

Н иж е  п ри невд •   edges(g)

ы  доипстмуы

Ти

: s t d : :p air< ed g e_it erat or,  edge_iterator> .

п  р е з у л таь

С ем а н и т к а : воз вращ ае ра м  граф а  д . •   source(e,  g) Ти

п   р е з у л та ь

е  вы раж ен и

т  ди ап з о

я  дл я  кон ц пе ц и

н  з н ачне и

и  EdgeListGraph.

й  иореат

а  дл я  дп уост

а  к о  вес

м  рбе

-

: vertex_d esc rip tor.

С ем а н и т к а :  воз ращ ае т   ес к д р и п о т бр а  (и,  v), занд ог о  чре з  е . П с л о у вр е ид : е  — оипсдтмуы й  дескри пот

р   в ре ш и н

ы  дл я   н ачльн о р  рбре

а  граф

й   в ер ш и н а  д .

ы zyxwvutsrqpo   и  ре -

12.2.и ц п е ц но К

и лд

я и н е мзи

я о ф ар г

в

157

•   target(e.  g) zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA :  vertex_descri ptor. Т и п  раезльту

С ем а н и т к а :  воз вращ ае бр а  (и,  v), занд ог

о  чре

т   е с дк р и п о т з  е .

П с л р оу е д в и е : е  — доипстмуы •   nurn edges(g) Ти

п  резлаьту

й  дескри пот

ы   лд р  рбре

я   к о н че н о

а  грфа

й   в ер ш и н

ы zyxwvutsrqponmlk   v ре -

а  д .

:  edges_size_type.

С ем а н и т к а

: воз вращ ае

и рн т а Г

т  коли вчсет

и  снос тлж

Ф ну к ц и Ф ну к ц и

р   в ер ш и н

о  рбе

р  в  граф

е  д .

и

и  edges(),  source()  и  target О  должн я  num_edges() должн а  вы п олн ьятс

ы  орыабт в я  з а  ли н ей н о

ь   з а  п осятн о е  п о  чи сл у  реб

е  врем я р  врем я

. .zyxwvutsrqpon

1 2 . 1 . 8 . Ad ia c e nc yM a t r ix К о н ц еп ц и р ебт о в а н и н ы м  н ач ль н о

я   AdjacencyMatrix  очтну яе е  обсеп чн и я  э фекит вн ог й  и  кон чен о й  вреш и н ам

о н тч е и У

е  дл

т   к о н ц пе ц и о  дп уост .

ю  Graph и  и ме а  к  лю моб у   рб е

т   о д п л н и е л ть н о у  в  граф

е е  п о  занд

-

я

Graph о п с у и Д мт ы

е  вени ыржа Н иж •  Ти п С ем а н и т к а е т  л П с л р о у е вд и

я

е  п ри невд о  диопстму е   в ы р а ж не и е  дл я  кон ц пе ц и edge(u.  v,  g)  резлаьту :  std:: pa i r. : воз вращ ае т  п руа е  g ррбе о  мжде : u, v — иопстдмуы

и  в  граф

и р на т Г

и  сно с лтж Ф ну к ц и

я  edge() долж н

12.2. Кицпе но оЭ т т  разед л  оп и сы вае н и я  и  уаледн и я  врше и и  рберам и  свой ст . К а р га ф а  разробнлед ы  н чи ка м  алогри мт в  хорш и м ов . В  табл .  12.2 п ри невд о ж д ак й  кон ц пе и , а ц и мя и  миод ф кац и и ак ж т е  фир угю т  н

, сощяст у ю  и з  флаг , п окза ы вюа щ оге у  и  и  v, и  дескри порт а  ррабе е  дл я  граф а  g дсекри по т

и   AdjacencyMatrix.

, есл

и  тако ы  верш и н

, сщ увсет е  н ай енд о .

.

и а  воз вращ ат

и  л д я  ии н ем з

ь  рлзеаьту

т  з а  п оняст о

я о ф а р г

е  врем я

.

в

т  BGL- и н рейфт с  лд я  м оид ф кац и и  гарф , т о  ест ь  добавле н  и  рреб , и з мне и я  з н ачне и й  з акрпе лн ы х  з а  вреш и н ам и к  и  кон ц пе ц и и  дл я  оод хб а  гарф , кон ц пе ц и и  м оид ф кац и и а  мн вожсте о  пы ротсх , дл я  тог о  чоб т ы  павиострде ь  раз рбот й  вы об р  кон ц пе ц и й  лд я  оп и сан и я  требован и й  аолгри т ы  диопстмуы е  вы ражне и я  и  асоц и рован ы е  тип ы  дл я  н а  ри с . 12.3 п окзан ы  он т ош не и я  уочнт е и я  мжде у  кон ц пе  горвфа . Н оркыет е  и з  кон ц пе и й , и з жорбнае ы х  н а  ри с . 12.1, а  ри с . 12.3, н о  вс е  и х  он т ош не и я  уочтн е и я  п ропщ у не ы .

1 5 8 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 12  •   о нКцеп и и   BGL VertexMutableGraph 

•   VertexMutablePropertyGraph

EdgeMutablePropertyGraph

Graph

MutablelncidenceGraph

MutableBidirectionalGraph

EdgeMutableGraph

BidirectionalGraph

- >•   MutableEdgeListGraph

EdgeListGraph

си Р Та б л и ц

а

. 12.3.  Ки цп е но

и  дл я  ии н е м з

1 2 . 2 .  аркКт

я   с в о кд

а   ок н ц е п и

и  до спут

В ы р а же н и

я о  гф а р й  дл

а   к  с войса т

м   ф ар г

е

я   и з м ен и

я  уи н е чо т

я  д жм е

я   ф ар г

у  нм и

и

а

а

Во з в р а щ е м ы

й ти

п

ил

и о п и с а ни

е

т   GraphzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJI

VertexMutableGraph  онтчуяе

vertex_descriptor void

a d d ve r t e x( g) remove_vertex(v,  g) EdgeMutableGraph  онтчуяе

т   Graph void std::pair< edge_descriptor,  bool> void void

clear_vertex(v,  g) add_edge(u, v,  g) remove_edge(u,  v,  g) remove_edge(e,  g) MutablelncidenceGraph  онеячту

т   IncidenceGraph  и   EdgeMutableGraph

void void

remove_edge(eiter,  g)  remove_out_edge_if(u,  p, g)  MutableBidirectionalGraph  онеячту

т   MutablelncidenceGraph  и   BidirectionalGraph

remove_edge(eiter,  g)  remove_out_edge_if(u,  p, g)  MutableEdgeListGraph  онтчуяе

void void т   EdgeMutabLeGraph  и   EdgeListGraph

remove_edge_if(p, g)  PropertyGraph  оунтчяе

в  и  оиш он е т

void т   Graph

property_map::type  property_map::const_type 

Т и п   л д я   и з м не я о г в р ше и н ы Т и п   л д я   н ие з м не я о г св о й т а  врше и н

о  ообртаж ен и

я  свой ст о  ообртаж ен и

ы

я

а

12.2.и ц п е ц но К В еы н р и а ж

е

В о з в р ща еа м ы

get(ptag, g) 

й

я и н е н м ез и ти

я о ф ар г

п ил

в

и о п и с ан и

159

е zyxwvutsrqponmlk

Ф н у кц и я  дл я  нче ипуло я  о-а ткеъб нжеарбои т св о й т а  врше и н ы П ч ио лу т ь  з н ачен и е  свой ст а  дл я  вреш и н и л и  ррбе а  х П ол ж и т ь  з н ачне и е  свой ст а  дл я  вреш и н и л и  ррбе а  х  рван ы м  v т  VertexMutableGraph и  PropertyGraph vertex_descriptor т  EdgeMutableGraph и  PropertyGraph std::pair

get(ptag, g, x)  put(ptag, g, x, v)  VertexMutablePropertyGraph уенчяо т add_vertex(vp, g)  EdgeMutablePropertyGraph уенчяо т add_edge(u, v, ep, g) 

12.2.1.

и лд

я ы ы

Ve r t e x M u t a b l e Gr a p h

К о н ц еп ц и я   VertexMutableGraph  — граф , м иод ф ц и емрыу й  п о  мн овжсет у   в ре ш и н (vertex  mutable), може т   бы т ь  и з мне н  добавлне и е м  и л и  унела ди е м   в ер ш и н . Уп р а в л ен и е  п ьамтя ю  вы п олн сяет я  п р и  реали з ац и и  граф . П оль з овелат ь  граф а  толь к о  вы з ы вае т  add_vertex()  и  remove_vertex(), а  реали з ац и я  длае т  вс е  оальстн ое .

о нт ч е и У

е дл я Graph, DefaultConstructible

о п с у и Д мт ы

е е ни в ы рж а

я

Ниж е   п ри в ед н ы  до п ус ти м ы е   в ы раж ен и я  д л я  к о н ц е п ц и и  VertexMutableGraph. •   add  vertex(g) Т и п   р е з ул ь т а :  vertex_descri ptor. С е м а н ти к а : до б а в л я е т   н ову ю   в ерш и н у   к  г р а ф у .  В о з в р а щ а е т   де с к р и п то р  в е р ш ин ы  д л я  н о в о й  в е р ш и н ы . •   remove_vertex(u.  g) Т и п   р е з ул ь т а : void. . Сем а н ти к а : уда л я е т   в ерш и н у zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGF  и  и з  м н о ж е с тв а   в ерш и н  г р а ф . П р е д ус л о в и я ц и де н тн ы уд а л е н и

: и  — до п ус ти м ы х   в ерш и н е  и.  Ф у н к ц и я   в с е х   и н ц и де н тн ы

П о с т ус л о в и я н а хо д и т с и сп оль з ован

и р на т Г

:  num_vertices(g)  ум е н ь ш а е тс я  в о  м н о ж е с тв е  в е р ш и н  г р а ф .

и  сно с лтж К о н ц еп ц и •   в ас тк ян н о •   ан л е д у и

й   де с к р и п то р   в ерш и н я  clear_vertex()  м о ж е х  р е б р .

ы   гр а ф т   бы т

а  g и  н е ь   и сп оль з ован

т  р е б р

я   н а  е ди н и ц у , а  е е  де с к р и п то

;  в е р ш и н р  б о л ь ш

а  и  б о л ь ш е  н е  м о ж е

е  гарн ит

и  слож н оист

:

, и н а  д л

я

е  н е т   бы т

ь

и я  VertexMutableGraph деа а  верш и н

е  врме я

ы  п рои дсх

т  сю ущдел и т  гарн ит рован

о  з а  ам оирт з и рован о

е  по ст

; е   в р еш и н

ы  должн

о  п рои дсхт

ь  н е  доль ш

е  че м  з а   (О \ Е

 | +  \ V |).

-

160

в а Гл

а 12  •  Концеп и

и  BGL

1 2 . 2 . 2 .  E d g e M u t a b l e G r a p hzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLK

К о н ц еп ц и я   EdgeMutableGraph  — г р а ф , м о д и ф и ц и р уе м ы m utable),  м о ж е т   бы т ь   и з м ен е н   до б а в л е н и е п а м я ть ю   в ы п о л н я е тс я   п р и  р е а л и з а ц и и   гр а ф в а е т   add_edge()  и  remove_edge(),  а  р е а л и з а ц и

о н ечт и У

е  дл

й  п о  м н о ж е с тв м   и л и   ду а л е н и е м   р еб р .  П о л ь з о в а те л ь   гр а ф я  де л а е т   в с е   о с та л ь н о е

у   р еб .  Уп р а в л е н и а   то л ь к .

р  (edge е о   вы з ы -

я

Graph о п с иу м т Д ы

е  вени ыржа

я

Ниж е   п ри в ед н ы  до п ус ти м ы •   add_edge(u.  v.  g) Ти

п  р е з ул ь та

е   в ы раж ен и

я  д л

я   к о н ц еп ц и

и  EdgeMutableGraph.

:  std:  :pair< edge_descriptor.  bool>.

С е м а н ти к а : п ы та е тс я  в с та в и т ь  р е б р о zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONM  (и,  v)  в  г р а ф , в о з в р а щ а я  в с та в л е н н о е  р е б р о  и л и  п а р а л е л ь н о е   р ебр о   и  ф л а г , к о т р ы й  п о к а з ы в а е т , б ы л о  л и  р е б р о   в с та в лен о . Э т а  о п е р а ц и я  н е  до л ж н а   «п о р ти ть » де с к р и п то р ы   в ерш и н  и л и   и те р а то р ы п о  в е р ш и н а м   гр а ф ,  н о   о н а   м о ж е т   с де л а т ь   н е д й с тв и те л ь н ы м и   де с к р и п то р ы р еб р  и л и  и те р а то р ы   п о  р е б р а м . П о р я до к , в  к о т р о м  н о в о е  р е б р о  п о я в и тс я  п р и о бхд е  и те р а то р а м и   р еб р   гр а ф , н е  о п р е д л е н . П р е д ус л о в и е :  (и , о ) я в л я ю т с я   в ерш и н ам и  г р а ф . П о с ту л о в и е : (и,  v)  н а ох ди тс я  в  н а б о р е  р е б р  гр а ф . В о з в р а щ е н н ы й  де с к р и п то р р ебр а   и ме т   в ерш и н у   и   в  к а ч е с тв е   н ач аль н о й  и  v  — в  к а ч е с тв е   к о н еч н о й . Е с л и т  и с т и г р а ф  п о з в о л я е т  и м е т ь  п а р а л е л ь н ы е  р е б р а , т о  в о з в р а щ а е м ы й  ф л а г  беду н ой . Е с л и   п арал ель н ы е   р ебр а   в  г р а ф е   н е  р а з р е ш а ю тс я   и  р е б р о   {и,   v)  жу е   е с т ь в  г р а ф е , ф л а г  бдеу т  и м е т ь  з н а ч е н и е  «л о ж ь » . Е с л и  р е б р а  {и,  v)  е щ е  н е  б ы л о  в  гра ф е , ф л а г  бдеу т  и м е т ь   з н ач ен и е   «и с ти н а » . •   remove_edge(u,  v.  g) Т и п  р е з ул ь та :  void. С е м а н ти к а : уда л и т ь   р ебр лель н ы е   р ебр а , ф ун к ц и П р е д ус л о в и е :  {и,   v)  я в л я е т с П о с ту л о в и е :  {и,   v)  б о л ь ш

о   (и , v)  и з   г р а ф .  Е с л и   гр а ф   п о з в о л яе я  уда л я е т   в с е  в хо ж де н и я   (и,  v)  в  г р а ф я   р ебр о м   и з  г р а ф а  д . е  н е  я в л я е т с я   р ебр о м   гр а ф а  д .

•   remove_edge(e,  g) Т и п   р е з ул ь т а :  void. С е м а н ти к а : уда л и т ь   р ебр о   е  и з  г р а ф . П р е д ус л о в и е :  е  я в л я е т с я   р ебр о м   гр а ф а  д . П о с ту л о в и е : е  б о л ь ш е  н е  я в л я е т с я   р ебр о м   гр а ф

т   и м ет

ь   п арал

.

-

а  д .

•   clear_vertex(u,  g) Т и п   р е з ул ь т а С е м а н ти к а П р е д ус л о в и е П о с ту л о в и е и л и   к о н еч н о

: уда л и т

:  void. ь   в с е  р е б р а , и н ц и де н тн ы е  в е р ш и н :  и  я в л я е т с я  до п ус ти м ы м   де с к р и п то р о :  и   н е  уч а с тв еу т   н и  в  о дн о м   и з  р е б й  в е р ш и н ы .

е  и  г р а ф м   в ерш и н р   гр а ф а   в   к а ч е с тв

. ы  д л

я  д . е   н ач аль н о й

12.2.и ц п е ц но К

и р на т Г

и н о с лт ж

я   EdgeMutableGraph  да е

•   в с та в к а   р ебр и л и  з а  в р е м я до тв р а щ е н и •   уд а л е н и

а  до л ж н , р а в н о я   до б а в л е н и

е   р ебр

•   о ч и с тк а  в е р ш и н +   \ V\ ).

К он ц еп ц и сп и ск

я и н е н м ез и

я о ф ар г

в

161

и zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

К он ц еп ц и

12.2.3.

и лд

т  с л е дую щ и

е   г а р а н ти

и   с л о ж н о с ти

а   п р о и с ох д и т ь   з а  а м о р ти з и р о в а н н о е   O(log(|Ј |/| V|)),  е с л и   в ы п о л н я ю тс я   п арал ель н ы х   р еб р

а   в ы п о л н я е тс

е  п о с то я н н о я   п ро в ерк

е  в р е м я   п ре

я -

я zyxwvutsrqponmlkjihgfedcbaZYXWV   (О \ Е  |);

о   з а  в р е м х  р еб

и  д л

;

я  г а р а н ти р о в а н н

ы  о т  и н ц и де н тн ы

:

р  в ы п о л н я е тс

я  н е  б о л е

е  ч е м  з а  О( \ Е

 | +

M u t ab ie ln c id e n c e Gr ap h

я   MutabielncidenceG raph  о б е с п е ч и в а е х   р еб р   в ерш и н ы .

а  и с хо дя щ и

о н тч е и У

е дл

ь   уд а л е н и

я   р еб

р  и з

я

IncidenceGraph и

о п с у и мД т ы

т   воз м ож н ост

EdgeMutableGraph

е е ни в ы рж а

я

Ниж е  п р и в е д н ы  до п ус ти м ы •   remove_edge(eiter,  g) Т и п   р е з ул ь т а :  void. С е м а н ти к а :  уда л я е т   р ебр о и те р а то р   и с хо д я щ и х   в ерш и П р е д ус л о в и е :  *eit er  я в л я е т с П о с т ус л о в и е : *eit er  б о л ь ш j 

е   в ы раж ен и

я  д л

,  н а   к о т р о н   гр а ф я   р ебр о е   н е  я в л я е т с

я  к о н ц е п ц и

и  MutabielncidenceG raph.

е   ук а з ы в а е

т   enter,  и з   г р а ф

,  дг е   e it e r  —

. м   гр а ф

. я   у р ебр о   У

 

м   г р а ф i 

ч *а

 д .

•   remove_out_edge_if(u.  p.  д ) 1и п   р е з ул ь та :  void. С е м а н ти к а : уда л я е т   в с е   и с хо д я щ и е   р ебр а   в ерш и н ы   и , д л я   к о т р ы х   п р е ди к а т  р воз вращ ае т   и с ти н н о е   з н ач ен и е .  Э т о   в ы р а ж е н и е   тр е б у тс я ,  то л ь к о   есл и   гр а ф та к ж е   м о д е л и р уе т   IncidenceG raph. П р е д ус л о в и е :  и  я в л я е т с я  до п ус ти м ы м   де с к р и п то р о м   в ерш и н ы   гр а ф а  д . П о с т ус л о в и е :  р  в о з в р а щ а е т   лож ь   д л я   в с е х   и с хо д я щ и х   р еб р   в ерш и н ы   и   и   вс е и с хо д я щ и е   р ебр а ,  дл я   к о т р ы х   р  да в а л   лож ь ,  д о   с и х   п о р   н а хо дя тс я   в   гр а фе .

и р на т Г

и но с т л ж К он ц еп ц и

и я   MutabielncidenceG raph  да е

•   ф ун к ц и

я   remove_edge()  до л ж н

•   ф ун к ц и и с хо д я щ и

я   remove_out_edge_if()  д о л ж н х   ребе р   в рем я .

12.2.4.

К он ц еп ц и и з  с п и с к

е   г а р а н ти

а   в ы п о л н я ть с

и   с л о ж н о с ти

я   з а   п о с то я н н о а   в ы п о л н я ть с

: е  в р е м я

я   з а   ли н ей н о

; е   п о   чи сл

у

M u t ab le B id ir e c t io n alGr ap h

я   MutableBidirectionalG raph  о п р е д л я е а  в хо дя щ и х   р еб р   в ер ш и н ы .

6  З а к   375

т  с л е дую щ и

т   и н те р ф е й

с   дл

я   уд а л е н и

я   р еб

р

1 6 2 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 12 • и Кц п е ц но и  BGL

о н еч т и У

е  дл

я

BidirectionalGraph  и  MutablelncidenceGraph

о п с у и мД т ы

е  вени ыржа

Ниж

е  п р и в е д н

я zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFE

о  до п ус ти м о

е   в ы раж ен и

е  д л

и zyxwvutsrqponmlkjihgfedcb  MutabLeBidirectionaLGraph.

я  к о н ц е п ц и

•   remove_in_edge_if(v,  p, g) Ти

п  ра т ьлузе

С е м а н ти к а и с ти н у П р е д ус л о в и е П о с ту л о в и е в хо д я щ и

: уда л я е

: void. т   в с е  в хо дя щ и

:  v — доп ус ти м ы :  р  в о з в р а щ а е е   р еб р а , д л я  к о т р ы

и рн т а Г

и  сно слтж К он ц еп ц и •   ф ун к ц и в ерш и 12.2.5. К о н ц еп ц и р еб

р   гр а ф

о н тч е и У

е  р е б р

а  в е р ш и н

ы  v, д л

я  к о т р ы

х  р  в о з в р а щ а е

т

. й   де с к р и п то т   лож ь   д л я  в с е х  р  да в а л   лож ь

р  в е р ш и н х   в хо д я щ и , д о  с и

ы  г р а ф а  д . х   р еб р   в ерш и н ы zyxwvutsrqpo   и  и  в с е х  п о р  н а хо дя тс я   в  г р а ф е .

и я   MutabLeEdgeListGraph да е т  с л е дюу щ у я  remove_i n_edge_i f ()  в ы п о л н я е тс н  в р е м я .

ю  г а р а н ти я  з а  л и н е й н о

ю   с л о ж н о с ти е  п о  ч и с л

: у   в хо д я щ и

х

M u t a b le Ed g e Lis t G r a p h я  MutableEdgeListGraph п р едо с ат в л яе .

т  в о з м о ж н о с т

ь  уда л я т

ь   р еб

а  и з  с п и с к

а

е  дл я EdgeMutabLeGraph о п си у м т Д ы

е  вени ыржа

Ниж е   п р и в е де н Graph.

я о   д о п ус т и м о

е   вы раж ен и

е   дл

я   кон ц еп ц и

и   MutableEdgeList-

•   remove_edge_if(p.  g) Ти

п  ра т ьлузе

С е м а н ти к а П о с ту л о в и е де р ж и

и тн р а Г

т   вс

и  сно с тл ж К он ц еп ц и •   ф ун к ц и р еб 12.2.6.

: void. т   в с е  р е б р а  и з  г р а ф а  д , дл я  к о т р ы : р  в о з в р а щ а е т   лож ь  дл я  в с е х   р е б р  в  г р а ф е  р е б р а , д л я  к о т р ы х   р  п е р в о н а ч а л ь н о  в о з в р а щ а

: уда л я е

х   р  в о з в р а щ а е т   и с ти н у е  и  г р а ф  д о  с и х  п о л   лож ь .

. р  с о -

и

я   MutableEdgeListGraph да е я  remove_edge_i  f () до л ж н . р  в  г р а ф е

т  с л е дюу щ у а  в ы п о л н я ть с

ю  г а р а н ти я  з а  л и н е й н о

ю   с л о ж н о с ти

: е  в р е м

я  п о  ч и с л

у

Prope rt yGra ph

К он ц еп ц и я   PropertyGraph — г р а ф , к о т р ы с  к а ж до й   и з  в е р ш и н  и л и  реб р  г р а ф . Т а к о  с в о й с тв , с в я з а н н ы х  с  к а ж до й  в е р ш и н о м о гу т  б ы т ь  и с п о л ь з о в а н ы  те ги . В  о п и с а н и

й   и ме т   н ек о т р о е   с в о й с тв о ,  с в я з а н н о к  к а к  да н н ы й  г р а ф  м о ж е т   и м ет ь  н е с к о л ь й  и л и  ребро м , д л я  о б о з н а ч е н и я  с в о й с тв и  тр е б о в а н и й  PropertyTag  — эт о  ти п  та ге

е а ,

12.2. и цеп н Ко

a tag  — объке е т  о— б ъ к е т о б р аж т н е и

о н тч е и У

т  ти п

е лд

и лд

я им з е н

я о фа р г

1 6 3 zyxwvutsrq в

а  PropertyTag. Г ра ф  п оарвседлтя т  фн у кц и ю , котра я  воз вращ а е   св о й а т .zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGF

я

Graph

с А о ц и р н в ыа

е ит п Н иж е  п ри невд ы  асоц и рован ы •   property_map::const_type я  свой ст а  дл я  свой аст , зан д ог о   PropertyTag. ь  н ие з мне яы м  LvaluePropertyMap с  таки м  ж е  тип о м  клю а  вреш и н ы  и л и  рбре а  граф .

е  вени ыржа

я

Н иж е  п ри невд ы  диопстмуы •   getCptag.  g) Ти мы

е   в ы р а ж не и

п  р е з у л таь

С ем а н и т к а з ан о г р ад

я  кон ц еп ц и

и  PropertyGraph.

п   р е з у л т аь :  property_map: :type, е с л и  g я в л я е тс м  — и  property_map :: const_type — в  п р о т и в н о

С ем а н и т к а : воз вращ ае т  оображтне и PropertyTag. Объке т  ptag и сп ольсзет у •   getCptag.  g.  x) Ти

я  дл

т  з н ачен и м   х  (верш и н . Э т а  фн у к ц и

о  с  ообъкет и  своге

о  тип а

и  снос тлж Ф ну к ц и

а  дл я  свой аст о  рда и  сгвое

, зан д ог о  тип а

-

.

о  тип о

м

.

: property_traits< PMap> : :value_type.

: воз вращ ае

и рн т а Г

е  свой ст я  толь к

я  и з м е н я е м с ал ч е у

е  свой ст а  и л и  ребро) я  экви ален т

а  (з анд ог о  ти п о м  PropertyTag), свя . Обкъе т   ptag и сп ольсзет у я   о тл ь к а  get (get (ptag.  g).  x).

о

и

я  get О  долж н

а  вы п олн ьятс

я  з а  п оняст о

е  врем я

.

1 2 . 2 . 7 . Ve r t e xM ut a b le P r o p e r t yGr a p h К о н ц еп ц и п о л н и ел ьт н ы м ш и н  к  грауф

о н еч т и У

я  VertexMutablePropertyGraph  — эт о  VertexMutableGraph  и  PropertyGraph с  до и  фн у к ц и ям и  дл я  указ н и я  з н ачне и й  свой ст в  п р и  добавлен и и  вре .

е  дл

я

VertexMutableGraph и

с А о ц и р н в ыа Н иж

е  тип

PropertyGraph

ы

е  п ри евд н  асоц и рован ы •   vertex_property::type Ти п  оа-бъкет свой ат , з акреп лн ог

й  ти п  дл

я  кон ц пе ц и о  з а  вреш и н ой

и  VertexMutablePropertyGraph. .

1 6 4zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA ва Гл а 12 • и цеп н Ко и BGL

о п су и Д мт ы

е е ни в ы р жа

Ниж

я zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGF

е  п р и в е д н о  до п су ти м о •   add_vertex(vp,  g) Ти

п р е лз у т ь а : до б а в л я е й  в е р ш и н ы

я   н ово

и тн р а Г

е  дл

т   н ову . В о з в р а щ а е тс

и  сно с лтж

ю  в е р ш и н

и  VertexMutaЫ Реroperty

у  к  г р а ф

в рем я

у  и  к о п и р уе р   в ерш и н

я   де с к р и п то

G  гh ра

.

т   vp в   о б ъ е к т- с в о й с тв ы  д л я   н о в о

о й  в е р ш и н ы

.

и

К он ц еп ц и я   VertexMutabLePropertyGraph  да е •   add_vertex()  г а р а н ти р о в а н н о  в ы п о л н я е тс

т  с л е дюу щ у

ю  г а р а н ти я  з а  а м о р ти з и р о в а н н о

ю   с л о ж н о с ти е  п о с то я н н о

: е

.

12.2.8. К о н ц еп ц и п о л н и те л ь н ы м к   гр а фу

я  к о н ц е п ц и

: vertex_descriptor.

С е м а н ти к а дл

е  в ы р а ж е н и

Edge M ut a ble Prope rt yGra ph я   EdgeMutablePropertyGraph  — э т о   EdgeMutableGraph  и   PropertyGraph  с  до и  ф у н к ц и я м и  д л я  з а д н и я  з н а ч е н и й  с в о й с т в  п р и  до б а в л е н и и   р еб р

.

о н еч т и У

е  дл

я

EdgeMutableGraph и PropertyGraph

с А о ц и р вн а ы

е  тип

ы

Ниж е  п р и в е д н  а с о ц и и р о в а н н ы •   edge_property::type Ти

п   о б ъ е к та - с в о й с тв а

,  з а к р е п л е н н о г

о п с иу м т Д ы

е  вени ыржа

Ниж

и тн р а Г

: в с та в л я е я   э то г

и  сно с лтж К он ц еп ц и •   в с та в к в р ем я до б а в л е н и

12.3. Кицпе но

п  д л

я  к о н ц е п ц и

о  з а  р е б р о м

и  EdgeMutablePropertyGraph. .

я

е  п р и в е д н о  до п ус ти м о е  в ы р а ж е н и •   add_edge(u.  v,  ep.  g) Т и п р е лз у т ь а С е м а н ти к а с тв о  д л П р е д ус л о в и е

й  ти

е  д л

я  к о н ц е п ц и

и  EdgeMutablePropertyGraph.

:  st d : : pair< edge_descriptor,  bool>. т   р ебр о zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHG   (и,  v)  в  г р а ф   и  к о п и р уе т   о бъ ек т   е р  в   о б ъ е к т- с в о й о   р ебр а . :  u, v я в л я ю т с я   д о п ус т и м ы м и   де с к р и п то р а м и   в ерш и н  г р а ф а  д .

и

я   EdgeMutablePropertyGraph да е т  с л е дюу щ у ю  г а р а н ти а   р ебр а   до л ж н а   п р о и с хо д и т ь   ли б о  з а   а м о р ти з и р о в а н н о , л и б о  з а  O(log(|Ј |/| V |)), е с л и  п р и  в с та в к е  п р о в е р я е тс я   п арал ель н ы х   р еб р .

и е л  пти т есо

К о н ц еп ц и и  п о с е ти те л й  (visitor concepts) и гр а ю то р ы   (functors)  в  STL. Ф ун к т о р ы  п р е до с та в л я ю р и тм о в .  П о с е ти те л и   п о з в о ляю т   п о л ь з о в а те л я

ю   с л о ж н о с ти

: е  п о с то я н н о

я   н е д о п су т и м о с т

е ь

й т  та к у т   м е ха н и з м   в с та в л я т

ю  ж е  р о л ь  в  BG L, к а м  д л я  р а с ш и р е н и ь   с в о и   с о б с тв е н н ы

к  и  ф ун к я  а л го е  one-

12.3.и ц п е ц но К

х   то ч к а х   гр а фо в о г рац и и   в   раз ли чн ы а л г о р и тм ы   н а   гр афа х   обы чн о   и м ею п о л ь з о в а те л ь   може т   в с та в и т ь   о б р а тн ы образ ом ,  п о с е ти те л и   и м ею т   н е   е ди н с тв е н н ы а  н е с к о л ь к о  м е то д в ,  с о тв е тс в ую щ и р а з де л е   м ы  о п р е д л и м   к о н ц еп ц и и К а к   ф ун к ц и о н а л ь н ы е  о б ъ е к т ы в  а л г о р и тм ы   BG L. Э т о  о з н а ч а е т , ч т н и и   с о с то я н и я  в   о б ъ е к та -х п о с е ти те л я х О боз н ач ен и я , и с п о л ь з о в а н н ы е •   V — ти п

, м о де л и р ую щ и т  ти п

165 zyxwvutsrqp

.  В   о тл и ч и е   о т   а л г о р и тм о в   STL о   с о б ы ти й н ы х   то ч е к ,  в   к о то р ы е в   (callback)  ч е р з   ф ун к т о р .  Т а к и м й   м е то д   operator^), к а к   у   ф ун к то р а , х   раз ли чн ы м   с о б ы ти й н ы м  то ч к а м .  В   э то м  п о с е ти те л е й  д л я   о с н о в н ы х   а л г о р и тм о в   BG L.   в   STL,  п о с е ти те л и   п е р е да ю тс я   п о   з н ач ен и ю о  н жу н о  б ы т ь  о ч е н ь  о с то р о ж н ы м  п р и  с о рх а н е .  в  э от м  р а з де л , п р и в е д н ы  н и ж е : ю  п о с е ти те л я

;

а  V;

•   G   — ти п

, я в л я ю щ и й с

я  м о де л ь

•   g — о б ъ е к

т   ти п

а  G;

•   е  — о б ъ е к

т  т и п

а  graph_traits:  :edge_descriptor;

•   s, u — о б ъ е к т

й

о   а л г о р и тм а т   н еск оль к й   вы з о

й   к о н ц еп ц и

•   vis  — о б ъ е к

и е л е т и т ес о п

ю  Graph;

а  graph_traits:  :vertex_descriptor.zyxwvutsrqponmlkjihgfedcbaZY

ы   ти п

1 2 . 3 . 1 .  B F S Vi s i t o r

К он ц еп ц и я   BFSVisitor  о п р е д л я е breadth_fi  rst_search(). П о л ь з о в а те л и  п е р е да в а т ь  о б ъ е к т  э то г о  к л а с с тв и я , п р о и з в о д и м ы е  в о  в р е м

о н еч т и У о п су и Д мт ы

е лд я CopyConstructible е е ни в ы рж а Ниж

е   п ри в ед н

т   и н те р ф е й с   п о с е ти те л я   дл я   п о и с к а   в   ш и ри н у и  м о гу т  о п р ед л и т ь  к лас с  с  и н те р фе й с о м  BFSVisitor а  а л г о р и тм у   breadth_f i rst_sea rch (), доп о л н я я  де й я   п ои ск а  п о   г р а ф у .

я

ы  до п ус ти м ы

е   в ы раж ен и

я  д л

я   к о н ц еп ц и

и  BFSVisitor.

•   vis. in it ia lize_ ver t ex( u .  g) Ти

п   р е з ул ь т а

С е м а н ти к а

:  void. : в ы з ы в а е тс

я  дл

я  к аж од

й  в ер ш и н

ы  гр а ф

а  п ер

д  н ач ло

м  п о и с к

а  в  гр а фе

.

•   vis.discover_vertex(u.  g) Т и п  р е з ул ь та :  void. С е м а н ти к а : в ы з ы в а е тс я , к о гд а  а л г о р и т вы е . В с е  др уг и е  в е р ш и н ы , б о л е е   бли з ки с м о тр е н ы , а  в е р ш и н ы , р а с п о л о ж е н н ы

м   в с тр е ч а е т   н ек о т ру е  к  и с хо дн о й   в ерш и н е е  да л ь ш е   о т   и с ох д н о й

ю  в е р ш и н у zyxwvutsrqponmlkjih  и  в п е р , б ы л и   жу е   п р о , — е щ е  н е т .

•   vis.examine_edge(e.  g) Т и п   р е з ул ь т а С е м а н ти к а сещ ен н о

:  void. : в ы з ы в а е тс й  в е р ш и н ы

я  д л .

•   vis.tree_ edge(e.  g) Ти

п   р е з ул ь т а

:  void.

я  к а ж до г

о  и с хо дя щ е г

о  р е б р

а  к а ж до й

, то л ь к

о  ч т о  п о

-

166

вал Г

и  BGLzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGF

а 12  •  Концеп и

: ес л

С е м а н ти к а ф ун к ц и я

. В ы з о

и  р а с м а рт и в а ем о в  ф ун к ц и

о  еzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONM  вохид т  в  дер в о  п о и ск а , в ы з ы в а е тс я  эт а я  в ы з о в м  ф ун к ц и и  exami ne_edge(),

е  р ебр а  п р е дв а р я е тс

и  в сегд

•   vis.non_tree_edge(e.  g) Т и п   р е з у л т аь :  void. С е м а н ти к а : е с л и  р а с м а тр и в а е м о е тс я   э т а   ф у н к ц и я .  В ы з о examine_edge().  Д л я   о р и е н ти р о в а н н ы о б р а тн ы м , л и б о   п о п ер ч н ы м

в   ф ун к ц и , д л

е   р еб р о   е  н е  в ох ди и   в с е гд а   п р е дв а р я е тс х   гр а фо в   та к о я   н е о р и е н ти р о в а н н ы

т   в  де р е в

о   п ои ска я   вы з ово е   р ебр о   до л ж н х  — п о п е р е ч н ы м

, в ы з ы в а м   ф ун к ц и и о   бы т ь  zyxwvutsrq ил б о .

•   vis.gray_target(e.  g) Т и п   р е з у л т аь :  void. С е м а н ти к а :  э т а   ф у н к ц и я   в ы з ы в а е тс я ,  е с л и   р а с м а тр и в а е м о ц и кл а   и  е с л и   е г о   к о н е ч н а я  в е р ш и н а  о к р а ш е н а   в  с е р ы й   ц ве тр е н и я .  В ы з о в   ф ун к ц и и   в с е гд а   п р е дв а р я е тс я   вы з ово м   ф ун к ц и С еры й   ц в е т  о з н а ч а е т , ч т о  р е б р о  н а хо ди тс я   в  да н н ы й  м о м е н

е   ребр о   —  р е б р о т   в о   в рем я   рас м о и   cycle_edge(). т   в  о ч е р ди .

•   vis.black  target(e.  g) Т и п   р е з у л т аь С е м а н ти к а :  э т а р ебр о м   ц и кл а  и п р о с м о тр а . В ы з о Чер н ы й  ц в е т   о з н а ч а е т

:  void.   ф ун к ц и я   в ы з ы в а е тс я  е с л и  ег о   к о н е ч н а в  ф ун к ц и и  в с егд , ч т о  в е р ш и н

,  е с л я  в е р ш и н а  п р е дв а р я е тс а  уж

и   р а с м а тр и в а е м о а  о к р а ш е н я  в ы з о в е   бы л а  уда л е н

а  в  ч е р н ы м  ф ун к ц и а   и з   о ч е р ди

е   р ебр о   я в л я е тс я й  ц в е т   в о  в р е м я и  cycl e_edge(). .

•   vis.finish_vertex(u.  g) Т и п   р е з у л т аь :  void. С е м а н ти к а : э т а  ф ун к ц и дя щ и е   р ебр а   бы л и   до б а в л е н с м о тр е н ы   (н о  п е р д  тем

я  в ы з ы в а е тс

я  дл я   в е р ш и н ы   к  де р в у   п ои ск , к а к  б ы л и  р а с м о тр е н

ы  п о с л е  то г а  и   в с е   с м е ж н ы ы   и х   и с хо д я щ и

, к а к  в с е  е е  и сох е   в ерш и н ы   п ро е  р е б р а ) .zyxwvutsrqpo

1 2 . 3 . 2 . D FS Vi s i t o r К он ц еп ц и я   DFSVisitor  о п р е д л я е depth_first_search().  П о л ь з о в а те л и   п е р е да в а т ь   о бъ ек т   э то г о   к лас с тв и я , п р о и з в о д и м ы е  в о  в р е м

о н ечт и У

т   и н те р ф е й и  м о гу а   а л г о р и тм я  п о и с к

с   п о с е ти те л

я   дл я   п о и с к а   в   г л уб и н у ь  к л а с с  с  и н те р ф е й с о м  DFSVisitor у   depth_first_search(),  д о п о л н я я  де й а  п о   г р а ф у . т  о п р е д л и т

е  дл я CopyConstructible

о п су и Д мт ы

е  вени ыржа

я

Ниж е   п ри в ед н ы  до п ус ти м ы е   в ы раж ен и •   vis.init ialize_ver t ex(u.  g) Т и п   р е з у л т аь С е м а н ти к а в   гр а фе п   р е з у л ть а

я   к о н ц еп ц и

и  DFSVisitor.

:  void.

:  в ы з ы в а е т с

я   дл

.

•   vis.start_vertex(s,  g) Ти

я  д л

:  void.

я   к а ж до

й   в ерш и н

ы   гр а ф

а   п ер е

д   н ачало

м   п ои ск

а

12.3.и ц п е ц но К

С е м а н ти к а

: в ы з ы в а е тс

я  д л

я   и с ох д н о

й  в е р ш и н

ы  п е р

й zyxwvutsrqponm 1 6 7 zyxwvutsrqp

и е л е т и т ес о п

д  н а ч а л о

м   п ои ск

а  в  г р а ф е

.

•   vis.discover_vertex(u.  g) Т и п   р е з ул ь т а С е м а н ти к а вп ервы е

:  void. :  в ы з ы в а е т с я

,  к о г д

а   алго р и т

м   в с тр е ч а е

т   н е к о то р у

у zyxwvutsrqponm  и

ю   верш и н

.

•   vis.examine_edge(e.  g) п  а т ьлузре

Ти

С е м а н ти к а ния

: void.

:  в ы з ы в а е тс

я   дл

я   к а ж до

й   и с хо д я щ е

й   в ерш и н

ы   п осл

е   е е   п о сещ е

-

.

•   vis.tree_edge(e.  g) Ти

п  а т ьлрузе : void. С е м а н ти к а : в ы з ы в а е тс я   дл в а  п о и с к а . •   vis.back_edge(e.  g) Ти

п  а т ьлузре

я   к а ж до г

о   р еб р а

, к о гд

а   он

о  с та н о в и тс

я  ч а с ть

ю   де р

-

: void.

С е м а н ти к а :  в ы з ы в а е тс я   д л я   о б р а тн ы х   р еб р   гр а ф гр аф а   и м е тс я   н ек о т ра я  н е о п р е д л е н н о с т ь   м еж д р а тн ы м и   ребрам и ,  п о с к о л ь к у   (и,  v)  и  (v, и)   я в л я ю т с н о  о б е  ф у н к ц и и  tree_edge()  и  back_edge()  в ы з ы в а ю тс я реш ен и я  э то й  н е о п р е д л е н н о с т и  я в л я е т с я  з а п и с брасы ван и е   о б р а тн ы х   р еб р ,  к о т р ы е   жу е   о т м е ч е н сп особо м   з ап и сы ват ь   др е в е с н ы е   ребр а   я в л я е тс в   ф ун к ц и и   tree_edge().

.  Д л я   н е о р и е н ти р о в а н н о г о у   др е в е с н ы м и   ребрам и   и  о б я   о дн и м   и  те м   ж е   р е б р о м , .  О дн и м  и з  с п о с о б о в  р а з ь  др е в с н ы х   р еб р , а  з а те м   от ы   к а к  др е в е с н ы е .  П р о с ты м я   з ап и с ь   п р е дш е с тв е н н и к о в

•   vis.forward_or_cross_edge(e.  g) п  ра т ьлзеу

Ти

С е м а н ти к а то д   н и к о г д

: void. : в ы з ы в а е тс я   дл я   п р я м о г а   н е  в ы з ы в а е тс я   п р и  п о и с к

о  и л

и  п о п е р ч н о г е  в  н е о р и е н ти р о в а н н о

о  р е б р

а   в  г р а ф е м   гр а фе

. Э то

т   ме

-

.

•   vis. f inish  vertexCu.  g) Ти

п  а т ьлрузе

С е м а н ти к а вы з ван я в л я е тс ш ин

: void.

:  в ы з ы в а е тс а  д л я   в с е х  в е р ш и я  л и с то м   де р е в ы   и  п о с л е   п р о с м о тр

12.3.3.

я   дл я   в ер ш и н н  де р в а   п ои ск а   п ои ска , ф ун к ц и а   в с е х   и с хо д я щ и

ы   и   п осл е   то г ,  к а к   fin ish ve r t e xO  б ы л а а  с  к о р н е м  в  в е р ш и н е  и.  Е с л и  в е р ш и н а  и я   дл я   в ер я  fin ish_vertex()  в ы з ы в а е тс х   и з  и   р е б р .

D i j k s t r a Vi s i t o r

К о н ц еп ц и я  DijkstraVisitor о п р е д л я е т   и н те р ф е й с  п о с е ти те л paths () и  п о д б н ы х  а л г о р и тм о в . П о л ь з о в а те л ь  м о ж е с  э ти м  и н те р ф е й с о м , и  з а те м   п е р да т ь   о бъ ек т ы   клас дл я   р а с ш и р е н и я  де й с тв и й ,  п р о и з в о ди м ы х   в о  в р е м

ине чо Ут

е  дл я CopyConstructible

я  д л я  di  jkstra_shortest_ь  к л а с , с о г л а с о в а н н ы й а  в  di  jkstra_ sh ortest_ path s() я   п ои ск а  п о   г р а ф у . т  с о з да т

168

ва Гл

и BGLzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHG

а 12 • и цеп н Ко

о п с у и мД т ы

е е ни в ы р жа

я zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFE

Ниж е   п ри в ед н ы  до п ус ти м ы е   в ы раж ен и •   vis.discover_vertex(u.  g) Ти

п   р е з у л ть а

С е м а н ти к а

я  д л

я   к о н ц еп ц и

и   DijkstraVisitor.

:  void.

: в ы з ы в а е тс я

, к о гд

а  а л го р и т

м  в сртеч а

т  н ек о т р у

у zyxwvutsrqponml  и  в п ер в ы е .

ю  в е р ш и н

•   vis.examine_edge(e.  g)

Т и п   р е з у л т аь С е м а н ти к а л е  е е  п о с е щ е н и я

:  void.

: в ы з ы в а е тс

я   дл

я   к а ж до г

о   и с ох д я щ е г

о   р ебр

а   к а ж до

й   в ерш и н

ы  п о с

:  void. ь   (и,  v)  — э т о  р е б р о  е,  d — о то б р а ж е н и е  р а с то я н и й е   в есо в .  Е с л и   в о   в р ем я   о бхд а   d[u]  + w(u,  v)  ф ' .

е  дл я CopyConstructible

о п с у и мД т ы

е  вени ыржа

я

Ниж е   п ри в ед н ы  до п ус ти м ы е   вы раж ен и •   vis. init ialize_ver t ex( s,  g) Т и п   р е з ул ь т а С е м а н ти к а в   гр а фе .

я  д л

я   к о н ц еп ц и

и  Bellman  FordVisitor.

:  void. :  в ы з ы в а е т с

я   дл

я   к а ж до

й   верш и н

ы   гр а ф

а   п ер е

д   н ачало

м   п ои ск

•   vis.examine_edge(e.  g)

Т и п   р е з у л ть а С е м а н ти к а

:  void.

: в ы з ы в а е тс

я  д л

я   к а ж до г

о   р ебр

а   гр а ф

а   num_vertices(g)  р а з

.

а

12.3.  Кно цпе и

и  п оисетл

й   169

•   vis.edge_relaxed(e.  g) Т и п   р е з ул ь т а :  void. С е м а н ти к а :  п су т ь zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   (и,  v)  — р е б р о   ,е  d  — о то б р а ж е н и е   р а с то я н и й , w  — о то б р а ж ен и е   в есо в . Е с л и  d[u]  + w(u,  v)    d[v].

я   о дн

а -

о  (и,  v)  м и

-

•   vis.edge_notjninimized(e.  g) Т и п   р е з ул ь т а С е м а н ти к а Э т о  с л уч а е тс я

:  е с л

:  void. и   ребр о   н е   ми н и ми з и рован о ,  к о гд а   в  г р а ф е  е с т ь  о тр и ц а те л ь н ы

, т о   в ы з ы в а е т с й  ц и к л

я   э т а   ф ун к ц и я .

.

м т и р о г Ал

ы BGL

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQ

13.1. Озбо В  эо т мо

р

й  глав е   п а в с р тл е д н а  дальетн а в  в  Boost  G raph Library. О б о щ не ы

е  аолргим т

ы   BGL разленд

1.  О сн овн ы

е  аолгрим т

ы  п ои ска

2.  К чратй ш и

е  пит у

3.  М и н и м аль н о

Вс

аф ре ж д и к л ас с ы лк а р и м та н а п р и м ер п о л ь з о е лв а т м ы ат д со бы и т й н ы

е  древо

а  яв ляест м  тип о

я м  гар а  со о м и  аолг -

е   к о е г ра т и

:

.

.

ы   р еа л и з о в а н

ы   ка к  ш онлба т  и сп оль з оват , корыт е  кон ц еп ц и х   к о н ц еп ц и й т   сп и со к  тмеырбу а  вклю чае т  сп и со , орыкт м  ч ер з  кон ц еп ц и о  оп леирьд т и  муог т  бы т ь  и сп оль з ован ы . К мо р е  тог , аолргим т ы  и н дго а  п армите юз ус т , ообртажен и е  раосянт и й  дл я  аолгрим т ю   к о н р тл ь  н а д  тме , ка к  свой ст  такж е  п арм иет з ован ы  п о  ти п у  п иосетля ь   о б нр а т ы е   вы з ов ы   (call- backs),  окрыт х  точка х   а ло г р и м т а . м  ш аблон а й  мелоид ру

-

.

е  вреш и н

е   а ол г р и м т

х  аорлги т

. й  покт

6.  п Уорчяден и

ы  н а  сю ущдел и

ю  вес

.

ы  связ н оист

5.  М акси м аль н ы

я  п о  п ри мне и

. е  оовнст

4.  К омп н е т

п ар о м т е

я   и н оф р м а ц и

. Э т

о  п оз в ляе т   м е ы бр у т х   р о а фг в ы к  кон ц пе ц и й и  можн

ы  фн у кц и й ь  фн у кц и . Описан и , а  оп и сан и е  гра ф  млеиодт ру , каки е  ти п

, гд е   ит п ю  с  лю ыб е  когжад е  когжад .  П ы  граоф

я  ообтраж ен и ям в   кч р а й т ш и а  хран сят , чт о  п оз в ляе е  бу д у т   в ы п о лн е

 граф о  аолгрим т

о   р ог а ф в о  пнркест ы в  с  каки м и  свой ст х  пейт у

я  и  и з влекаю сят т  п оль з оелват ы  в   оп ленрд ы

. Э т . Аиротгл

, ка к о  дае т ю  за х

р   171zyxwvutsrqp

13.1. Ооз б

13.1.1.и цм ра о ф н И И н фо р м а ц и «П иортп ы » р а м ы те »

я о б м ти ро г л а

я   о б  алогри мт ,  «Оп и сан и » е ,  «П слоурведи я»

ир о П п т

е

е  е д у б т   п а в л с не т р д ,  «Гд е  опнлерд » ,  «С ложн ьо» ст

а   в  ви д ,  «П рыамте » ,  «П ри м ре»

е  ю ущделс и

х   п р о а з д ел в

:

,  «И м ен ован ы

е  п а -

.

ы

Р аз ед П о  и мне а а  и н дог лд я  когжад П н д е л ои с рж е к д з ес ь д р мо те

л   сп р ав о ч н и к

а   п о  комжад в   ш аб л о н

я   с  п риот п а  фну к ц и ь   о  н аз н ачне и и  п арм те а  такж е   о  тмеорбу й   п р о ма т е . Он д ка о  точн ы е  требован и о  п арм те а  дна ы  в  разелд я  п армовте . й  птмаре р  дл я  мни го х  фн укц и й  — bgl _named_pa rams. О н  сжи ул т  дл я  пдо и  и мне ова н ы х  пвор тмеа , чт о  опниас о  в  рлезад е  2.7 и  ткжа е  ррисматве х  п ра . Е сл и  п осл е  params н ап и сан о  =  al I  defaul ts, т о  дл я  вес х  и м не ован ы в  и мюе с т я  з н ач ен и я  п о  умолчан и ю , и  э т и  п рамте ы  муго т  бы т ь  опщ у не ы м  п армоте

п и сО н а

у   а ло г р и м т а  оыб чн

у   н а ч и н с а ет

о  можн м   к о н ц еп ц и е  оп и сан и

. ,

о  си дт у

я я .

е

В  оп и сан и и  фну к ц и н ея м  терми н олиг н и я  з ачди . З еат в с ит я  н а  п арм ыет

Гд

и  м ы  оп елряд ю  тоери и  гораф м  м ы  оп и сы вае .

е о п р е лд В  эо т

, корут

ю  рше ае е  ни одм хбе й  с  точк

, корыт у   н фу к ц и

т  эт а  фну к ц и я

, объся ы   лд

и  з рен и

-

я  п он и ма я  е е  возйе д

-

н м  раз елд у   (с  п омщ ь

м ра г

м  зчауд в  и л и  иие д м  смеан и тк

м ар П т е

е  указ

н  з оаглв чн ы ю  #i ncl ude) дл

й  фай л

, корыт

я  п оль з ован и

й  долже

н  бы т

я  фн у кц и ей

ь  вкюл че

н  в  п ро

-

.

ы

З ес д с м р не о т з н а ч ен и

ь  п ри водст

я  сп и со

ы  в  сю ущдел й  п о  умолч ан и ю ) К ы аж д й  п арм те •   IN п а р м те Ф ну к ц и

ы   ч и аю т с я  н и ка

к  вес м   р а з е дл ) . р  п оепа д

х  оыб чн ы

х  п армоте

в  фн у кц и

. Обы чн ы т  в  он д

я   н фу к ц и е к  н е  и з м ен я

е  п армте

и  (и м ен ован ы ы  обязельатн

у  и з  сю у щдел и

ы  (дл

х   о ег к р а и т й

й  и  и сп ольюз ус т т  эт и  п армыте

я   лд

я  н и

е  рас х  н е т

: я   п ч н ео л у и

я  и н форм ац и

.

;

•   OUT

п а р м те ы   з ап и с ы в аю с т в   OUT- п армхет

я   н фу к ц и е й

. Р езльаут

ы   об р ат

ы   н фу к ц и

и  хран сят

я

;

•   UTIL

п а р м ет и с п о л ь з ем ы у Э т и  п армте

ы   юр ебт у с

м И ы н о е ав Ка о в б дс т у

я   л д я   р аб о т х   ка к  UTIL- п армыте ы  оыб чн о  ка к  чиаю тся

е  пмра ет к  сказ н

о  в  разелд а   р аб о т

ы   о а л гр и м т

,  нод ак , обы чн о  н е  и н рес т , та к  и  з ап и сы ваю сят

о   р е с жо д и м о

е   о б ъ ке в т о  дл .

, .

я   п о л ь з о в еа л т я

ы

е  2.7, BGL и сп ольез у ы   с  фну к ц и ям и  с  боль ш и

т  сп це и альн у м   н аб о р

ю  тн хе и к м   п а р м ео т в

у  дл

я  п овы ш не и ,  кодг

я а   м н о иг

е

172

в а Гл

п а р м е тр н ован н ы ч т о  и  д л п р и в ед н

ы  BGLzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIH

а 13  •  Аоглрмит

ы   и м ею е   п а р а м е тр я   обы чн ы о   з н ач ен и

с о и ву л д р е П

т  з н а ч е н и

я  п о  ум о л ч а н и ю ы   д л я   ф ун к ц и и х   п а р а м е тр о в . К р о м е   п о   ум о л ч а н и ю

. В  э то , с   и с п о л ь з о в а н и е е  то г .

, д л

м  р а з де л я  к а ж до г

е  п е р е ч и с л я ю тс м   та к о й   ж е   к лас и фи к ац и и о   и м ен о в ан н о г

я   в с е  и м е

,

о   п а р а м е тр

а

я

В  э от м  р а з де л ч а е т  тр е б о в а н и

е  м ы  о п и с ы в а е я   к  с о с то я н и

он с т о л ж С

м  л ю б ы ю   п а р а м е тр о

е  п р е дсу л о в и

я   дл в   о т браж ен и

я  ф ун к ц и и й   с в о й с тв

. О б ы ч н .

о  э т о  в к л ю

-

ь В рем ен н а п о  п а м я т

я   слож н ост и   в с е гд

ми р П е Дл

ь   дл а   н е  б о л ь ш

я  к а ж до г о   а л г о р и тм е   O ( |F |) ,  е с л

а   да н и   н е  ук а з а н

а  в  0- о б о з н а ч е н и я х о   о б р а тн о е

.  С л о ж н о с т

ь

.

р я   де м о н с тр а ц и

13.2. Бы в о з а

и   и сп оль з ован и

е м т аиро г л

я   а л г о р и тм

а   п р и в о ди тс

я   п р о с то

й   п ри м ер

.

ы

13.2.1. breadth_first_search template  void  breadth_frist_search(Graph& g, ytpename graph_tratis::vertex_descriptor s. const bg_lnamed_params& params)

Ф ун к ц и я   breadth_first_search()  в ы п о л н я е т   п ои с к   в   ш и ри н у   [31]  о р и е н ти р о ван н ог о   и л и   н е о р и е н ти р о в а н н о г о   гр а ф .  П р и   п о и с к е   в   ш и ри н у   сн ач ал а   п о с ещ а ю ст я   в ерш и н ы , к о т р ы е   расп о ло ж ен ы   бли ж е   к  и с ох дн о й   в ерш и н е , а  п о т м   боле е да л ь н и е   в ерш и н ы .  В   э то м   к о н те к с т е   р а с то я н и е   о п р е д л я е тс я   ка к   чи сл о   р еб р в  к р а тч а й ш е м   п ту и   о т  и с хо дн о й   в ерш и н ы . Ф у н к ц и я  breadth_fi  rst_search ()  м о ж е т и с п о л ь з о в а ть с я   дл я   в ы ч и с л е н и я   к р а тч а й ш и х   п т еу й   и з   о дн о й   в ерш и н ы   к о   все м х   к р а тч а й ш и х   п ут е й .  О п р е д л е до с ти ж и м ы м   в ерш и н а м   и  д л и н   с о т в е т с в юу щ и н и я , с в я з а н н ы е   с   а л г о р и тм о м   п ои ск а   в   ш и ри н у ,  и  де та л ь н ы й   п ри ме р   п р и в ед н ы в  р а з де л е   4.1. П ои с к   в   ш и ри н у   и с п о л ь з уе т   д в е   с т р ук т р ы   да н н ы х   дл я   р е а л и з а ц и и   о б х да : ц в е тн у ю   м е тк у   д л я   к а ж до й   в ерш и н ы  и  о ч е р дь .  Е щ е  н е  п р о с м о тр е н н ы е   в ер ш и н ы о к раш ен ы   белы м ,  с е р ы м   о бо з н ач ен ы   п р о й де н н ы е   в ер ш и н ы , у   к о т р ы х   ещ е   ест ь см еж н ы е  б е л ы е . Ч е р н ы е  в е р ш и н ы  — уж е   п о с е щ е н н ы е  в е р ш и н ы , п р и ч е м  в е р ш и н ы , м   п род лж ае т см еж н ы е   с  да н н ы м и , о к р а ш е н ы   в  с е р ы й   и л и  ч е р н ы й   ц в ет .  лАг о р и т р а б о ту , уд а л я я   в ерш и н у zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   и  и з  о ч е р д и   и  и с л е ду я   к а ж до е   и с хо д я щ е е   р ебр о   {и,   v). Е сл и   см еж н а я   верш и н а   v  р а н е е   н е  п о с е щ а л с ь ,  о н а   о к р а ш и в а е тс я   в   сер ы й   ц ве т и   п о м е щ а е тс я   в  о ч е р дь .  П о с л е   р а с м о тр е н и я   в с е х   и с хо д я щ и х   р еб р   в ерш и н а  и о к р а ш и в а е тс я   в  ч е р н ы й  ц в е т  и  п р о ц е с с  п о в то р я е тс я . П с е в до к о д  д л я  а л г о р и тм а   по и ск а  в  ш и р и н у  п р и в е д н   н и же . В  п с е в до к о д е   п оказ ан ы  в ы ч и с л е н и я   п р е д ш е с тв е н н и ко в  р,   о тм е тк и   п осещ ен и я   d  и  о т м е т к и   окон чан и я   о б р а б о тк и   t.  П о   ум о л ч а н и ю   ф ун к ц и я   breadth_fi  rst_search()  н е  в ы ч и с л я е т   э т и  с в о й с тв а ,  о дн а к о   и м е ю тс я п р е до п р е д л е н н ы е   п о с е ти те л и , к о т р ы е   м о гу т   бы т ь   и сп оль з ован ы   д л я   э то г .

13.2. ывоз а Б

П О И С К _ В _ Ш И Р И Н У( С д л я   к а ж до й   в ерш и н color[u]   п о с е ти т

ь   в ерш и н

у  s

оп к а   ( Q *  0 ) а < -   И З _ ОЧЕ Р Е ДИ (Й

) >  р а с м о тр е т ь   в ер ш и н у  и д л я   к а ж до й   в ерш и н ы   v  e Adj[u] >  р а с м о тр е т ь   р ебр о  (и,   v) есл и  (со/ ог[о ] =   )ЙЫЕБЛ >  (и,  v)  — др е в е с н о е   р ебр о color[v]   (и,  v)  и м е >  з а в е р ш е н и

т  ч е р н ы е  о б р а б о тк

й  к о н е

ц

й  к о н е

ц и   в ерш и н

ы  и

Ф ун к ц и я   breadth_first_search()  м о ж е т   бы т ь   расш и рен а   де й с тв и я м и   о п р ед лен н ы м и  п о л ь з о в а те л е м , к о т р ы е  в ы з ы в а ю т с я   в  н е к о т р ы х  с о б ы ти й н ы х   то ч к а х . Д е й с тв и я  д о л ж н ы   бы т ь  п р е д с т а в л е н ы   в  ф о р м е  о б ъ е к т а - п о с е т и т е л я , т о  е с т ь   о б ъ м   вы ш е   п с е в до к о д е   собы е к та , о тв е ч а ю щ е г о   тр е б о в а н и я м   BFSVisitor. В  ук а з а н н о ти й н ы е   то ч к и   о бо з н ач ен ы   в   к о м е н та р и я х .  П о   ум о л ч а н и ю   ф ун к ц и я   breadth_fi  rst_search ()  н е  п р о и з в о д и т   н и каки х  д е й с тв и й , да ж е   н е  з а п и с ы в а е т  р а с т о я н и я и л и   п р е дш е с тв е н н и к о в . О д н а к о  э т о  м о ж е т   бы т ь   л егк о   до б а в л е н о   оп ред лен и е м п о с е ти те л я .

дГ

е о п р е лд

лА г о р и т

н м   п ои ск

П а р м е рт

а  в  ш и р и н

у  н а хо ди тс

я   в   boost/ graph/ breadth_first_search.hpp.

ы Ниж е   п ри в ед н ы   п а р а м е тр •   IN:  Graph& g

ы   ф ун к ц и

и  breadth_fi  rst_ search ().

О р и е н ти р о в а н н ы й  и л и  н е о р и е н ти р о в а н н ы л ь ю  Vertex Li stG  ra ph и  IncidenceG raph.

й  г р а ф

, к о т р ы

•   IN:  vertex_descriptor  s

И с хо д н а

я   в ерш и н а

, с  к о т р о

й  н а ч и н а е тс

я  п о и с к

.

й  до л ж е

н  б ы т

ь  м о де

-

174 в а Гл

а 13  • м т и Алро г

м И ы н о е ва

ы   BGL

е  пмра те е   п ри в ед н

Ниж

ы zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFE

ы   и м ен о в ан н ы

е  п а р а м е тр

ы  ф ун к ц и

и  breadth_fi  rst_ search ().

•   IN:  visitor(BFSVisitor  vis)

О б ъ е к т- п о с е ти те л ь то ч к а х

, к о т р ы х   в  к о н ц е п ц и

, ук а з а н н ы

П о  ум о л ч а н и ю

й  а к ти в и з и р уе тс и  BFSVisitor.

я  в н утр

и  а л г о р и тм

а  в  с о б ы ти й н ы

х

: def aul t_bf s_vi  si tor.

•   UTIL/OUT:  color_map(ColorMap  color)

И с п о л ь з уе т с аМ

я  а л го р и тм о н   бы т ь   м о де л ь , ти п  з н а ч е н и

р  до л ж е ш ин

ы   гр а ф

П о  ум о л ч а н и ю м е н та м и  ти п дл я   о т б р а ж е н и

м  д л я  о тс л е ж и в а н и я  п р о дв и ж е н и ю   ReadWritePropertyMap,  ти п   к л ю ч я  col orjnap  д о л ж е н   бы т ь  м о де л ь

я  п о  г р а ф у . Т и п  Col ог а   — де с к р и п то р   в ер ю   ColorValue.

:  iterator_property_map, с о з да н н ы й  и з  в е к то р а   st d :: vector  с  э л е а  default_color_type  р а з м е р о м  num_vertices(). О н  и с п о л ь з уе т   ijnap я  и н де к с о в .

•   IN:  vertex_index_map(VertexIndexMap  ijnap)

О то б р а ж а е м ет ум о л ч а н и ю з н ач ен и клю ч

т   к а ж ду р   н е о б хо д и . Т и я   о т браж ен и а   о т браж ен и

П о  ум о л ч а н и ю

ю   в ер ш и н у   в   ц ело м   то л ь к о   п р и   и сп оль з ован и п  VertexIndexMap  до л ж е я   до л ж е н   бы т я  до л ж е н   з а д в а ть с

е   чи сл

о   и з  ди а п а з о н и   о т браж ен и

н   м о де л и р о в а т ь   ц ело ч и слен н ы я   де с к р и п то

а   [О , zyxwvutsrqponmlkjihgfed  \ V\ ), Э то т   п ар я   с в о й с тв а   ц в ет а  п о ь   ReadablePropertyMap. Т и п м   ти п о м .  В   к а ч е с тв е   ти п а р  в е р ш и н ы  г р а ф .

: get(vertex_index,  g).

•   UTIL:  buffer(Buffer&  Q)

О ч ер ед в а ть с п ерв ы ри н а л го р и т р и те у

ь   и с п о л ь з уе т с я   дл я   о п р е д л е н и я   верш и н ы .  Е с л и   и с п о л ь з уе т с д  г р а ф а  беду м  в ы ш е л ») , о бох у   п о р я дк е . М о г у т   бы т ь   и сп оль з ован м  Д е й к с тр ы  м о ж е т  б ы т ь  р е а л и з о в а .  Т и п  Buffer  до л ж е н   м о де л и р о в а т

П о  ум о л ч а н и ю

ь   ви д

:  boost::queue.

с о у и в л др е П О ч ер ед

т   р а с м а тр и , в  к о т р о м  буд м   вош е л  — а   F I F O  («п е р в ы ь   в  о б ы ч н о м  д л я   п о и с к а  в  ш и ы  и  др уг и е  ти п ы   о ч е р де й . Н а п р и м е р , н  с  и с п о л ь з о в а н и е м  о ч е р д и  п о  п р и о ь   к о н ц еп ц и ю   Buffer.

я   п о р я дк а я   о ч ер д т  п р о и с ох ди т

я ь   до л ж н

но с т о л ж С

а   бы т

ь   п с у та

.

ь

В рем ен н а дшу х е

м   с л чу а

я   слож н ост

им р П е

р

е  р а в н

ь   п о р я дк а   (О \ Е \ а   0(1 Й ) .

 +  \ V\ ). П р о с тр а н с тв е н н а

В   п ри м ер е   (л и с т и н г   13.1)  п о к а з а н о  п р и м е н е н и гр а ф , и з о б р а ж е н н о г о  н а  р и с . 13.1. Д р е в е с н ы ч ерн ы м и   ли н и ям и . П р о г р а м а   з ап и сы вае п о сещ ае т   в ерш и н ы   гр а ф .  И с хо дн ы й   ко example/ bfs- exampLe.cpp.

я  с л о ж н о с т

е  а л г о р и тм е  р е б р т   п о р я до к д   д л я   э то г

ь   в  н а и

а   п ои ск а  в  ш и р и н у   дл я а  п о и с к а  в  ш и р и н у  о б о з н а ч е н ы ,  в  к о т р о м   п ои с к   в  ш и р и н у о   п ри м ер а   н а хо д и т с я   в  ф а й л е

-

13.2. ы в о з а Б

Ри с

Л ис т н

г 13.1. и н е нм ие р П

. 1 3 . 1 . сио П

е м ти ро г л а

к в нир ш

а кс и о п

у н а аф р г

а в н ши р

е м ти ро г л а

ы zyxwvutsrqpon 175

е

у

< л е т и с ео П ь си п а з и нм е р в и л д я с и ок п а в н и рш и у >э template < typename TimeMap > class b f s_t im e_visit o r : p ub lic d e f au l t _b f s _vis it o r { typedef typename p r o p e r t y_t r ait s < TimeMap > ::value_type T: p u b lic : bfs_time_visitor(TimeM ap tmap. T & t):m_timemap(tmap). m_time(t) template < typename Vertex, typename Graph > void discover_vertex(Vertex u. const Graph & g) const { put(m_timemap. u, m_time++): } zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

TimeMap m_timemap; T & m time: ( bfs- example.cpp ) ќ #include  #i nclude  #i nclude  #include  #indude  using namespace boost: ( Плетисо

ь  зсипа

и  н е м р в

и  дл я  пксио

а  в  нир ш

у  )

int mainO { using namespace boost: //  тарбыВ ь  ывофарг й  тпи , кырот й  м ы  едуб м  итавозьлпс ь typedef adjacencyjist  graph_t; //  тивогдП ь  иротакифнед ы   ишрев н  и  инем а enum { г , s, t. u. v. w, x,  y . N }: const char *name = "rstuvwxy"; //  Указт ь  ррбе а  ф а р г а typedef std::pair E: E edge_array[] -  { E(r. s), E(r, v), E(s. w). E(w, r), E(w, t). E(w. x), E(x, t), E(t. u). E(x. y ) , E(u, y) } //  тадзоС ь  ывофарг й  океъб т const int n_edges ќ sizeof(edge_array) / sizeofCE):zyxwvutsrqponmlkjihgfedcbaZYXWVUTSR п е р н и о дл ж  Ј

1 7 6 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 13  • м т и Алр о г ы   BGL г 13.1 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA  { пернио дл)ж

Л ис т ин

typedef  graph_traits::vertices_size_type  v_size_t; graph_t  g(edge_array.  edge_array  + n_edges.  v_si,:e_t(N)); я   о пи т в / /   ине ле дерп О typedef  g r ap h _t r ait s  : : ve r t e xj j e s c r ip t o r  Vertex; typedef  g r ap h _t r ait s  ::ver t ic es_size_t yp e  Size; typedef  Size*  l i t e r ; / /   о т к еВ р   л д я   и н е ар х я   св о й т а   "вм е р я   я ищ не с о п st d : : vec t o r    d t im e( num j/ er t ic es( g ) ) ;

"  л д я  о д ж а к

й  н ш и р е в

ы

Size  time  =  0; zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

bfs_time_visitor vis(&dtime[0]. time); breadth  first search(g, vertexts. g). visitor(vis)); //  тавозьлпсИ ь   std::sort дл я  скворит и   ишрев н  п о  нем рв и   инещ соп я std: :vector discover_order(N): integer_range range(0. N); std::copy(range.beginO.  range.end(). discover_order.begin()): std::sort(discover_order.begin(). discover_order.end(), indirect_cmp (&dtime[0])):

st d : : c o ut  «  "подяр к   щ я и ес о н п :  " ; for  ( i n t  i  =  0:  i  ::vertex_desc riptor  s. const  bgl_named_params&  params):

Э т а  ф у н к ц и я  а н а л о г и ч н а  breadth_fi  rst_search()  з а  и с к л ю ч е н и е то в ы е  м а р к е р ы  н е  и н и ц и а л и з и р ую тс я  в  а л г о р и тм е . П о л ь з о в а те л раси т ь  в е р ш и н ы  в  б е л ы й  ц в е т  п е р д  в ы з о в о м  а л г о р и тм а .  П о э то м гр а ф а   — IncidenceG raph в м е с т о  VertexListGraph.  Т а к ж е  э т а  р а з н и ц боль ш у ю   ги б к о с т ь  в  о то б р а ж е н и и  ц в е то в ы х  с в о й с тв . Н а п р и м е р в а т ь  о то б р а ж е н и е , к о т р о е  р е а л и з уе т   ф ун к ц и ю  и с к л ю ч и те л ь н в ерш и н , ч т о   м о ж е т  б ы т ь  б о л е е  э ф е к т и в н о  дл я  п а м я ти , п о с к о л ь к е т  то л ь к о  н е б о л ь ш о й  ч а с т и   гр а ф .

м ра П т е Ниж

м  то г , ч т о  ц в е ь  до л ж е н   са м  о к у  тр е б уе м ы й   ти п а  п о з в о л я е т   и м ет ь , мож н о  и с п о л ь з о о  д л я   п о дм н о ж е с тв а у  п о и с к  до с ти га -

ы е   п ри в ед н ы   п а р а м е тр ы   ф ун к ц и •   IN:  IncidenceGraph&  g О р и е н ти р о в а н н ы й  и л л ь ю  IncidenceG raph.

и  н е о р и е н ти р о в а н н ы

и  breadth_f~> rst_vi sit  О . й  г р а ф

, к о т р ы

й  д о л ж е

н  б ы т

ь  м о де

-

13.2.ы в о з а Б

е м ти ро г л а

ы zyxwvutsrqpon 177

•   IN:  vertex_descriptor  szyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCB

И с хо д н а

я   в ер ш и н а

м И оен ы в а

, с  к о т р о

е  пмра те

й  н а ч и н а е тс

.

ы

Ниж е   п ри в ед н ы  и м е н о в а н н ы е  п а р а м е тр •   IN:  vi sitor(BFSVi si tor  vis) О б ъ е к т- п о с е ти те л ь то ч к а х , ук а з а н н ы П о  ум о л ч а н и ю

я  п о и с к ы   ф ун к ц и

, к о т р ы й  а к ти в и з и р уе тс х   в  к о н ц е п ц и и  BFSVisitor. :  bfs  visitor< n ull  visitor> .

я  в н утр

и   breadt h _ first _ visit ( ) . и  а л г о р и тм

а  в  с о б ы ти й н ы

х

•   IN/UTIL/OUT:  color_map(ColorMap  color)

И с п о л ь з уе т с до й  в е р ш и н Т и п  Col оаМ г то р   в е р ш и н П о  ум о л ч а н и ю

я  а л г о р и тм о м  д л я  о тс л е ж и в а н и я  п р о дв и ж е н и я  п о  гр а фу . Ц в е т  к а ж ы  до л ж е н  б ы т ь  и н и ц и а л и з и р о в а н  д о  в ы з о в а  breadth_f i rst_sea rch (). р  долж е н  б ы т ь  м о де л ь ю   ReadWritePropertyMap, ти п  к л ю ч а   — де с к р и п ы  г р а ф ,  ти п   з н а ч е н и я   colorjnap  до л ж е н   бы т ь   м о де л ь ю   CoLorValue. : get(vertex_color.  g).

•   UTIL:  buffer(Buffer&  Q)

т О ч еред ь   и с п о л ь з уе т с я   дл я   о п р е д л е н и я   п о р я дк а ,  в   к о т р о м   верш и н ы   б ду п о сещ ен ы .  Е с л и   и с п о л ь з уе т с я   о ч ер д ь   в и д а   F I F O  («п е р в ы м   вош е л   — п е р в ы м д  г р а ф а  бдеу т  п р о и с хо ди т ь   в  о б ы ч н о м  д л я   п о и с к а  в  ш и р и н у  п о в ы ш е л ») , о бох р я дк е . М о гу т   бы т ь  и с п о л ь з о в а н ы  и  др уг и е  ти п ы  о ч е р де й . Н а п р и м е р , а л г о р и т м Д е й к с тр ы   може т   бы т ь   реали з о в а н   с  и с п о л ь з о в а н и е м   о ч ер д и   п о   п р и о р и те у . Т и п   Buffer  до л ж е н   м о де л и р о в а т ь   к о н ц еп ц и ю  Buffer. П о  ум о л ч а н и ю :  boost:  : queue. 1 3 . 2 . 3 d e p t h _f i r s t _s e a r c h template  void  depth_first_search(Graph&  g.  const  bgl_named_params& params) Ф ун к ц и я  depth_f i rst_sea rch () в ы п о л н яе т  п о и с к  в  глбуи н у  в  о р и е н ти р о в а н н о м  и л и н е о р и е н ти р о в а н н о м   гр а фе .  К огд а   воз м ожн о , п о и с к  в   глбуи н у   вы би рае т   в ер ш и н у , см еж н у ю  с  текщу ей , д л я  слюеуд щ ег о   п о сещ ен и я . Есл и  вс е  с м е ж н ы е  в е р ш и н ы  уж е  п о с ещ ен ы  и л и  у  в е р ш и н ы  н е т  с м еж н ы х  в ер ш и н , а л го р и т м  в о з в р а щ а ест я  н а  п о с л едн ю ю в ер ш и н у , у  к о т р о й  ест ь  н е  п о с ещ ен н ы е  со сеид . К о гд а  вс е  до с ти ж и м ы е  в е р ш и н ы  п р о с м о рт е н ы , а л го р и т м   в ы би рае т  в е р ш и н у  и з  о с ат в ш и сх я   н е  п о с ещ ен н ы х  и  п р о д л ж а е т к  в   глбу и н у о б дх . Алго р и т м   з а в е р ш а е ст я , когд а  п р о й едн ы  вс е  в ер ш и н ы  гр аф . П о и с п о лез е н   дл я   к л а с и фи к а ц и и  р еб р   гр а ф а   и  д л я   н а в е д н и я   пу о р я д о ч е н и я   в ер ш и н . В  р а з де л е   4.2  о п и с а н ы  р а з л и ч н ы е  с в о й с вт а   п ои ск а  в  глбуи н у   и  р а с м о рт е н  п р и м е р . П од бн о  п о и с к у  в  ш и р и н у , ц в е тн ы е  п о м е тк и  и с п о л ь з ую тс я  д л я  о тс л е ж и в а н и я п о сещ ен н ы х   в ерш и н . Б е л ы й   ц ве т   обоз н ач ае т   н е   п о сещ ен н ы е  в е р ш и н ы , с е р ы й  — п о сещ ен н ы е , н о  и м е ю щ и е  с м е ж н ы е  н е  п о с е щ е н н ы е  в е р ш и н ы . Ч е р н ы м  о б о з н а ч а е тс я   п о с е щ е н н а я  в е р ш и н а , у   к о т р о й  н е т   б е л ы х   со едй . Ф ун к ц и я  depth_f i rst_search()  а к ти в и з и р еу т   з адн н ы е  п о л ь з о в а те л м  де й с тв и я  в о п р едл н н ы х  с о б ы ти й н ы х  точ к ах . Э т о  дае т  м аехн и з м  дл я  п р и с п о с б л е н и я  общ ен н о г о  а л го р и тм а   п ои ск а  в   глбуи н у   к о  м н о ги м   с и а ту ц и я м , в  к о т р ы х   о н  м о ж е т   бы т ь и сп оль з ован .  В   с л еюуд щ е м   ниж е   п с е в од к д е   с о б ы ти й н ы е  то ч к и   п ои ск а  в   глбу и н у

178 в а Гл

ы  BGLzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGF

а 13  • м т Али ро г

х   сп рава .  Д е й с тв и я ,  о п р е д л я е м ы е   п о л ь з о в а те л е м ,  до л ж н ы о бо з н ач ен ы   в   м е тк а бы т ь   з ад н ы   в  ф о р м е  о б ъ е к та - п о с е ти те л я   — о б ъ е к та , ч е й  ти п  удо в л е тв о р я е т   рт е бован и я м  д л я zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   DFSVisitor. В  п с е в до к о д е  п о к а з а н ы  в ы ч и с л е н и я  п р е дш е с тв е н н и к о в zyxwvutsr  к , о тм е то к  п о с е дн и я  d и  о тм е то к  о к о н ч а н и я  о б р а б о тк и  / .  П о  ум о л ч а н и ю  ф ун к ц и я depth_first_search()  н е   в ы ч и с л я е т   э ти х   с в о й с тв , о дн а к о  п о л ь з о в а те л ь   м оже т   оп р ед ли т ь   о б ъ е к ты - п о с е ти те л и   д л я   э то г . П О И С К _ В _ Г ЛУБ И Н У( С я   к а ж до й   в ерш и н color [и]    и с ох дн а

я   в ерш и н

а  и zyxwvutsrqponmlkjihgfe

ь zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA  (р,  d, f)

П О И С К_ В _ Г ЛУ Б И Н У _ П О С Е Щ Е Н И Е ( color [v]    р а с м о тр е т

,

у  и

ь   р ебр

о   (и,   v)

>  (и,  v)  — др е в е с н о

е   р ебр

>  (и,  v)  — о б р а тн о и н ач

е  е с л

е  оперлд лА г о р и т

м р а т еП

е   р ебр

о о

и   (color[v]  =  Е РН)ЙЫЧ Е > (и,  v)  — п р ям о > з а в е р ш е н и

color [и]    0 и  с(,р   и)   = 0 д л я   к а ж до г о   (м , v)  e  E.

сиР

Гд

. 13.7. а в По ко то

е  опредл лА г о р и т

, в о кр то

й  рр б е

а  пн е чм ое

ы м я зи н е ч а н

и  пко т

н м   н а хо д и т с

м ар П т е Ниж

я  сь т е

я   в   boost/ graph/ push_relabeU Tiax_flow.hpp.

ы е   п ри в ед н

ы   п а р а м е тр

ы   ф ун к ц и

и   push_relabel_max_flow().

а  и  мтс що н

и

13.7. м т и р о г Ал

ы г о н ь л м и са к м а

о ко то п

а zyxwvutsrqpon 213

•   IN:  Graph&  g zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

О р и е н ти р о в а н н ы й   гр а ф и   IncidenceG raph. Д л я   к а ж до г бы т ь   в  г р а ф е .

.  Г р а ф о в ы

й   ти п   до л ж е н   бы т ь   м о де л ь ю   VertexListGraph а zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGF   (и,  v)  о б р а тн о е  р е б р о   (v,  и)   та к ж е   до л ж н о

о   р ебр

•   IN:  vertex_descriptor  src

И с хо д н а

я   в ерш и н

а  д л

я   гр а ф

а   п отково

й  с е ти

.

•   IN:  vertex_descriptor  sink С то

к  д л

я   гр а ф

м И е но ы в а

а  п о т к о в о

е  пмра ет

й  с е ти

.

ы

Ниж е   п ри в ед н ы  и м е н о в а н н ы е  п а р а м е тр ы   ф ун к ц и •   IN:  capacity_map(CapacityEdgeMap  cap) О то б р а ж е н и с та н тн о р о м  р е б р П о   ум о л ч а н и ю

е   с в о й с тв а   реберн о й   м о щ н о с ти й   LvaluePropertyMap.  Т и п   к л ю ч а   о т браж ен и а   гр а ф . : get(edge_capacity,  g).

. Т и

и   push_relabel_max_flow(). п   до л ж е

н   бы т я   до л ж е

ь   м о де л ь н   бы т

ю   кон

-

ь   де с к р и п то

-

•   OUT:  res1dual_capacity_map(ResidualCapacityEdgeMap  res)

О то б р а ж е н и де л ь ю   н е к о н с та н тн о де с к р и п то р о П о   ум о л ч а н и ю

е   с в о й с тв

а   о с та о ч н о й  р е б р н о й  м о щ н о с ти . Т и п  до л ж е н   бы т ь  м о й  LvaluePropertyMap. Т и п  к л ю ч а   о т браж ен и я  д о л ж е н   бы т ь м  р е б р а   гр а ф . : get(edge_residual_capacity,  g).zyxwvutsrqponmlkjihgfedcbaZYXWVU

ќ  IN: reverse_edge_map(ReverseEdgeMap  rev) О то б р а ж е н и е  с в о й с вт а  р ебр а , к о т р о е  о от б р а ж е о б р а тн о е  р е б р о  (и,  и) .  О то б р а ж е н и е  до л ж н PropertyMap. Т и п  к л ю ч а   о т браж ен и я  до л ж е П о   ум о л ч а н и ю : get(edge_reverse.  g).

т   к а ж до о  б ы т ь  м о де л ь н   бы т ь  де с к р и п то р о

е  р еб р о  (и,  v)  в  г р а ф е  н а ю  к о н с та н тн о й  Lvalueм   р ебр а   гр а ф .

•   IN:  vertex_index_map(VertexIndexMap  indexjiap)

Э т о  о то б р а ж а е с тв о  в е р ш и н  в PropertyMap. Т и П о   ум о л ч а н и ю

и рм П е П ри ме с   м о щ н о с тя м Л ис т н

т   к а ж ду ю   в ерш и н у  н а  ц е л о  г р а ф е . О то б р а ж е н и е  до л ж н п  к л ю ч а   о т браж ен и я  д о л ж е : get(vertex_index.  g).

е  в  ди а п а з о н е  [О , N ), гд е  N — к о л и ч е о   бы т ь   м о де л ь ю   к о н с та н тн о й  Lvalueн   бы т ь  де с к р и п то р о м   ребр а   гр а ф .

р р   в   л и с ти н г и  р е б е р

е   13.12  ч и та е ) и з  ф а й л

т   п ри ме а  в  ф о р м а т

р   з ад ч и   м акси м аль н ог е  D I M AC S [1].

г 13.12.  Реи н ш е е ч  за д а и г о н ь лм иас км а о  пко то и н а ви к л а то р п я  к о т о п д е р п а (  push- relabel- eg.cpp  ) = iinclude  #1nclude  #include  #include  #i ncl ude  #include 

а  мо д о т е

м

о   п о то к

а   (г р а

ф

2 1 4 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 13  • м т и Аро г л ы   BGL Л ис т н

г 13.12 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   (пернио дл)ж zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA using namespace boost: typedef adjacency_list_traits  Traits: typedef adjacencyjist  Graph; Graph g; property_map ::type capacity = get(edge_capacity, g ) ; property_map ::type residual_capacity = get(edge_residual_capacity. g ) : property_map ::type rev = get(edge_reverse. g ) : Traits::vertex_descriptor s. t: read_dimacs_max_flow(g, capacity, rev, s, t ) : long flow = push_relabel_max_flow(g, s. t ) ; std::cout  «  "c  The  total  flow:"  «  std::endl; Std::cout  «  "s  " «  flow  «  std::endl  «  std::endl; std::cout  «  "c  flow  values:"  «  std::endl; graph_traits  ::vertex_iterator  u_iter,  u_end: graph_traits  ::out_edge_iterator  ei,  e_end; for  (tie(u_iter,  u_end)  •  vertices(g):  u_iter  !=  u_end;  ++u_iter) for  ( t ie( ei.  e_end)  = out_edges(*u_iter,  g); ei  Г -   e__end:  ++ei) i f  (capacity[ *ei]  > 0) std::cout  «  "f  " «  *u_iter  «  "  " «  target(* ei,  g)  «  " " «  (capacity[ *ei]  -   residual_capacity[*ei])  «  std::endl: return EXIT_SUCCESS: } zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA П р о а мг а  вы виод т  сю у щдел :

с   ынлоП s 13

й  пк о т о

с  зи н е ч а н я  па к о т f 0 6 3 f 0 1 0 f 0 2 10 f 1 5 1 f 1 0 0 f 1 3 0 f 2 4 4 f 2 3 6 f 2 0 0 f 3 7 5 f 3 2 0 f 3 1  1 f 4 5 4 f 4 6 0 f 5 4 0 f 5 7 5 f 6 7 3 f 6 4 0 f 7 6 0 f 7 5 0

: :

с ал К

ы BGL

14.1. с а Кл

ы о ф ар г

Bill l1i1 lS11

в

14.1.1. adjacencyjist adjacency_list zyxwvutsrqponmlkjihgfedcbaZYXWVUTS т  и нйерф т с  BGL- афр г , и пс оьлз у я  н скеоль о  рза с  ad jacencyj i st рилае з у х  вари ан от в  тирадц и он ог о  павслртенд и я  грфа а  в  ви д е  сп и ск а  см ежн иост . П а в ср т л е д н и е  граф а  в  ви д е  сп и ск а  смжен ост и  сржеиод т   п о с ел в ь д а т н о с т ь и щя о д с х и х   р бе р  дл я   окжад й   в ре ш и н ы . Дл я   раз жен ы х   р гоа ф в  эт о  экон ом и т м тс е о  п о  сравн е и ю  с  мриат ц е й  смжен иост , п оск ль у  п ам ят и  тсетрбу я   о тл ь к о п ок р д я а  О ( | V j + zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA  \ Е \ ),  а  н е  0(|У| 2 ). К мор е  тог , ду отс п  к  ищяод схи м  ррабе м  дл я  кжа о д й  вреш и н ы  може т  бы т ь  сале д н  э фекит вн ы м . Павслтренд и е  ори ен ит рован о г о  граф а  в  ви д е  сп и ск а  смжен ост и  п оказ н о  н а  ри с . 14.1. К сал

ли ч н ы

ис Р

йе т

П а р м те , эт о  п оз в ляе

. 14.1.и н е л в а тс д е р П

ы   ш аб л о н

а   к л ас т  ва м  вы брат

е го н а во ри т н еи ро

о ф ар г

а   adjacency_1ist  паволсрюятде ь  н аи боле е  пщяод х и

а в див

й  вари н

е кс и п

а т с о н м сж е

т   м н ог т  клса

и

о  воз м жн ос

. П армте

р

2 1 6 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 14  •  Клс а ы   BGLzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFED

ш аблон а   VertexLi st  к л а с а   adjacency_l  i st  з а д е т   в и д   к о н те й н е р а  д л я   п р е дс та в л е н и я   п о с л е до в а те л ь н о с т и   в ер ш и н   (п р я м о уг о л ь н и к   н а  р и с .  14.1).  П а р а м е т р   ш абло н а   EdgeLi st  з а д е т   в и д   к о н те й н е р а   дл я   п р е дс та в л е н и я   п о с л е до в а те л ь н о с т и   и сох дя щ и х  р е б р  дл я   к а ж до й   в ер ш и н ы  (о в а л ы  н а  р и с . 14.1). В ы б о р  EdgeLi st  и  VertexLi st о п р ед ляе т   з а тр а т ы   п ам ят и   и  э ф е к ти в н о с т ь  р а з л и ч н ы х   о п ерац и й  н а  г р а ф е . В о з можн ы е  в а р и а н т ы   и  к о м п р о м и с ы  р а с м о тр е н ы   да л е е   в  э то м   р а з де л е . П ар ам ет р  ш а б л о н а   Di r ected  ку а з ы в а е т ,  я в л я е тс я  л и  г р а ф  о р и е н ти р о в а н н ы м , н е о р и е н ти р о в а н н ы м  и л и  о р и е н ти р о в а н н ы м  с  до с пту о м   к  в ох дя щ и м   и  и с ох дя щ и м   ре бра м   (к о т о р ы й  м ы  н а з ы в а е м zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFE  д). м ын е в у а п р л   Д в ун а п р а в л е н н ы й   г р а ф  тр е б у т в   2 р а з а   б о л ь ш е   м ест а   (н а   к а ж до е   ребро ) , ч е м   о р и е н ти р о в а н н ы й , та к   к а к   к а ж до е р еб о  п о я в л я е тс я  к а к  в  с п и с к е  и сох дящ и х , та к  и  в  с п и с к е  в ох дя щ и х   р еб р . П р есд атв лен и е  в  в и д е   сп и ск а  с м е ж н о с т и   н е о р и е н ти р о в а н н о г о   гр а ф а   п оказ ан о  н а  р и с .  14.2. Д в ун а п р а в л е н н о е   п р е дс та в л е н и е   о р и е н ти р о в а н н о г о   гр а ф а   п оказ ан о   н а  р и с .  14.3.

ис Р

. 14.2.  и н е л в а тс д е р П

е го н а во нри т н еи ро е

о  гф а р

а  в  вд и

е  скси п

а тсо н  мжс е

и

D В

ис Р

им р П е В  с л е юду щ е л о ги ч ес к о г Л ис т н

он е лв арп ан ув Д . 14.3. 

е и н е л в па тс д е р

е  скси п

а тсо  сн мж е

и го н а вори  от н еир

о ф  га р

а

р м   п ри м ер о   де р в а г 1 4 . 1 .т о б а  Р

е  (л и с ти н

г   14.1)  г р а

ф  и с п о л ь з уе тс

. а  с ы н ь лм и фа

{  family- tree- eg.cpp  )  • iinclude  finclude 

м о  дв е р е

м

я   дл

я  п р е дс та в л е н и

я   ге н е а

-

14.1. с а Кл

ы о ф а гр

в 2 1 7 zyxwvutsr

linclude #i nclude #include enum family { Jeanie. Debbie, Rick, John, Amanda, Margaret. Benjamin. N };

int mainO { using namespace boost; const char *name[] - { "Jeanie". "Debbie". "Rick", "John", "Amanda". "Margaret". "Benjamin" zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCB

adjacencyjist  g(N): add_edge(Jeanie. Debbie, g); add_edge(Jeanie. Rick, g); add_edge(Jeanie. John, g); add_edge(Debbie, Amanda, g); add_edge(Rick. Margaret, g); add_edge(John. Benjamin, g): graph_traits : :vertex_iterator i. end: graph_traits : :adjacencyjterator  ai. a_end; property_map ::type indexjnap = get(vertexJndex, g); for (tied , end) = vertices(g): i != end; ++i std::cout « name[get(index_map. * i ) ] ; t ie(ai. a_end) = adjacent_vertices(*i . g); i f (ai == a_end) st d : : c o ut « else

" н е ем и

т

де тй "

;

std::cout « " стеялв я  ел тидор м   л д я  ": for (;  ai != a_end; ++ai) { std::cout «  name[get(index_map,  *ai)]; if (boost:rnext(ai) != a_end) std: : cout « ", ": std::cout «  std: :endl; return EXIT SUCCESS;zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA Эт

а  п рогам

Jeanie ястеялв Debbie ястеялв Rick стеялв John ястеялв Amanda н е е ми Margaret н е Benjamin н е

а  вы ивод я  рел тидо я  релтидо я  ел тидор м я  рел тидо м т  дет й е  ми т  де т й е  ми т  де т й

т  ю ущделс м   лд м   лд   лд я   лд я

:

я  Debbie, Rick. John я  Amanda  Margaret  Benjamin

218 в а Гл

а 14 • с Кла

м р а т еП

ы  BGL

ы  ш обнла

Ниж

е  п р и в е д н

а zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA ы   п а р а м е тр

ы   ш аблон

а  к л а с

EdgeLi st 

К о н те й н е р  д л к а ж до й  в е р ш и н ы П о  ум о л ч а н и ю

я  п р е дс та в л е н и

я  с п и с к

а  р е б

р

. :  vecS.

VertexLi st 

К о н ет й н е ш и н   гр а ф П о  ум о л ч а н и ю

Di rected 

О п р едл яет , я в л я е тс я  л и  г р а ф  о р и е н ти р о в а н ным , н е о р и е н ти р о в а н н ы м  и л и  о р и ен ит р о в а н н ы м   с  дв ун а п р а в л е н н ы м  до с туп о м   к  р е б р а м (до с ту п   к  и с хо дя щ и м   и  в хо дя щ и м   ребрам ) . С о т в е т с в ую щ и е   з н ач ен и я : di rectedS, undi rectedS и  bidirection alS. П о  ум о л ч а н и ю : di rectedS.

VertexProperti  es 

З ад е т   в н ут р е н н е в ер ш и н . П о  ум о л ч а н и ю

EdgeProperti es 

З ад е т   в н ут р е н н е р еб р . П о  ум о л ч а н и ю З ад е т   хр а н и л и щ П о  ум о л ч а н и ю

G raphProperti es 

л е д оМ

а   adjacencyJ1 St.

р  дл я  предс ат в л ен и . :  vecS.

я  м н о ж есвт

е  хр а н и л и щ

а  в ер

е  д л

я  с в о й с т

е  д л

я  с в о й с т

-

в

:  no_property. е  хр а н и л и щ :  no_property. е  д л я  с в о й с т :  no_property.

в   гр а ф

в

.

ь  дл я DefaultConstructible, CopyConstructible, Assignable, VertexListGraph, EdgeListGraph, Incidence-

Graph, AdjacencyGraph,  VertexMutableGraph  и  EdgeMutableGraph. Т акж е  ad jacen cyj i st м о дел и реу т   к о н ц еп ц и ю  BidirectionalGraph, к о гд а  Di rected= bi di recti onal S и л и  Di rected= undi rectedS, и  м о де л и р еу т zyxwvutsrqponmlkjihgfedcbaZYXW   VertexMutablePropertyGraph  и  EdgeMutablePropertyGraph,  к о гд а  до б а в л я ю тс я   с о тв е с тв юу щ и е   в н ут р е н н и е  с в о й с вт а .

д Г е  опрелд К лас

с А о ц и р н вы а Ниж

н с   ad jacen cyjist  н а хо ди тс

е  тип

я   в  ф а й л

е   boost/ graph/ adjacency_List.hpp.

ы

е   п ри в ед н ы  а с о ц и и р о в а н н ы е  ти п ы  к л а с а   ad jacen cyj i st . •   graph_traits< adjacency_list> ::vertex_descriptor Т и п   де с к р и п то р о в   в ер ш и н , а с о ц и и р о в а н н ы й  с  adjacency_11  st . (Т р е б уе тс я   д л я  Graph.) •   graph_traits< adjacencyjist> ::edge_descriptor Т и п   де с к р и п то р о в   р еб р , а с о ц и и р о в а н н ы й  с  ad jacen cyj  i st . (Т р е б уе тс я   д л я  Graph.) •   graph_traits< adjacencyjist> :  :ver t exjt er at or Т и п   и те р а то р о в , в о з в р а щ а е м ы й   vert ices( ) . (Т р е б уе тс я   д л я   VertexListGraph.)

14.1. с а Кл

ы о фа р г

в 2 1 9 zyxwvutsr

•  Ти (Тр е б уе т с •  Ти (Тр е б уе т с • Э то с м е ж н о с ти р а то р а (Т р е б уе т с • 

g rap h_t rait s< ad jac enc y_list > ::ed g e_it erat or п ит е ра т о в , а р зо в е щ м ы й   edges О . я лд я EdgeListGraph.) g rap h_t rait s< ad jac enc y_list > ::out _ed g e_it erat or п ит е ра т о в , а р зо в е щ м ы й   out_edges(). я л д я IncidenceGraph.) graph_traits:: i n_edge_i te rator zyxwvutsrqponmlkjihgfedcbaZYXWVUTS т   т и п   д о с т уп е н   д л я   н е о р и е н ти р о в а н н ы х   и л и   д в ун а п р а в л е н н ы х   сп и ско в , н о  н е  д л я   о р и е н ти р о в а н н ы х . И те р а то р   in_edge_i t erat o r  — ти п  и те , в о з в р а щ а е м ы й  ф ун к ц и е й   in_edges(). я   д л я   BidirectionalG raph.) graph  traits ::adjacency  it erat or -   -   Т и п   и те р а то р о в , в о з в р а щ а е м ы й   adjacen t_vertices(). (Т р е б уе т с я   д л я   AdjacencyGraph.) •   graph_traits< adjacency_list> ::directed_category П р е до с та в л я е т  и н ф о р м а ц и ю  о  то м , я в л я е т с я  л и  г р а ф  о р и е н ти р о в а н н ы м  (di гес ted_tag)  и л и  н е о р и е н ти р о в а н н ы м  (undi rected_tag). (Т р е б уе тс я   дл я  Graph.) •   graph_traits< adjacency_list> :  :edge_parallel_category Дае т  и н ф о р м а ц и ю  о  то м , п о з в о л я е т  л и  г р а ф  в с та в к у  п а р а л е л ь н ы х  р е б р  (р е б р , у   кот ры х  о дн а  и  т а  ж е  н а ч а л ь н а я  и  к о н е ч н а я  в е р ш и н ы ) . Д в а   в о з м о ж н ы х   те г а : ы  с  sets  и  hash_setS н е al I ow_paral  I el_edge и  di sal  1 ow_para!  1 el_edge_tag. В а р и а н т е  в а р и а н т ы  п о з в о л я ю т . п о з в о ляю т  з а д в а т ь  п а р а л е л ь н ы е  р еб р а , то гд а  к а к  др гуи (Т р е б уе тс я   д л я  Graph.) •   graph_traits< adjacency_list> ::traversal_category К а те г о р и я   обхд а   (traversal  category)  о тр а ж а е т   п о держ и в аем ы е   гр афо в ы м клас о м  в и д ы  и те р а то р о в . Д л я  с п и с к а  с м е ж н о с т и  э т о  в к л ю ч а е т   и те р а то р ы  в е р ш ин ,  р е б р , и с хо дя щ и х   р еб р  и  и те р а то р ы  с м е ж н о с ти . И те р а то р  в хо дя щ и х   ре б е р  до с туп е н  д л я   н е о р и е н ти р о в а н н ы х  и  дв ун а п р а в л е н н ы х ,  н о  н е  дл я  о р и е н ти рован н ы х  с п и с к о в  с м е ж н о с ти .

•   graph_traits< adjacency_list> ::vertices_size_type Т и п   и с п о л ь з уе т с я  д л я   п р е дс та в л е н и я  ч и с л а   в ер ш и н  в  г р а ф е . (Т р е б уе т с я   д л я   VertexListGraph.) zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJ

ќ  graph_traits::edges_size_type Ти п (Т р е б уе тс •  Ти п (Т р е б уе тс • 

  и с п о л ь з уе т с

я   д л я   п р е дс та в л е н и я   чи сл а  р е б р   в  г р а ф е . я   дл я   EdgeListGraph.) graph_traits::degree_size_type   и с п о л ь з уе т с я   д л я   п р е дс та в л е н и я  ч и с л а   и с хо д я щ и х   р еб р   в  г р а ф е . я   дл я  IncidenceG raph.) property_map::type property_map::const_type Т и п   о т браж ен и я  д л я  с в о й с т в  в е р ш и н ы  и л и  р е б р а  гр а ф . С в о й с тв о  з а д е тс я  а р а  и  до л ж н о  с о в п а д т ь  с  о дн и м  и з  с в о й с т в  и з  Vertexг м у е н то м   Property Tag  ш а б л о н P roperties  и л и   EdgeProperties  д л я   г р а ф . (Т р е б уе тс я   дл я   PropertyG raph.)

2 2 0zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA ва Гл а 14 • с а Кл ы BGL

иц кн у Ф

и — д о мт е Ниж

ы

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

е  п р и в е д н ы  ф ун к ц и и  — метод ы   клас а   adjccency_l  i st . •   adjacency_list(const  GraphPropertiesS  p = GraphPropertiesO) К о н с т р ук т о верш и (Т р е б уе тс

н  и  р е б е р я   дл

р   п о  ум о л ч а н и ю .  С о з да е т   п ус т о . я   DefaultConstructible.)

й   о б ъ е к т- г р а

ф   с  н ул е в ы

м   ч и сло

м

•   adjacency_list(vertices_size_type  n.  const  GraphProperties&  p = GraphPropertiesO)

С о з да е

ф  с zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFE  п  в е р ш и н а м и  и  б е з  р е б р .

т   о б ъ е к т- г р а

•   template  adjacency_list(EdgeIterator  f i r s t ,  Edgelte~ator  last , vertices_size_type  n,  edges_size_type  m = 0, const  GraphProperties&  p = GraphPropertiesO)

С о з да е т   г р а ф  с  п  в е р ш и н  и  т  р е б р . Р е б р а  з а д н ы  в  с п и с к е  р е б р  и з  ди а п а з о н а [first, last).  Е с л и   п  и л и  т  р а в н о   н лу ю ,  ч и с л о   в ерш и н   и л и  р е б р   в ы ч и с л я е тс я п о  с п и с к у  р е б р . Т и п  з н а ч е н и я  д л я  Edgelterator до л ж е н  б ы т ь  st d :: pal г , дг е  в  п а р е и с п о л ь з уе т с я   ц елы й   ти п . Ц е л ы е   чи сл а   с о т в е т с в ую т   в ерш и н ам , и  в с е   о н и до л ж н ы   о тн о с и ть с я  к  д и а п а з о н у   [0, п) . zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPO •   template  vertices(const  adjacency_list&  g) В оз вращ ае гр а ф (Тр е б у е тс

т   п ар

у   и те р а то р о в

,  о б е с п е ч и в а ю щ у

ю   д о с ту

п   к  м н о ж е с тв

у   в ер ш и

н

р  г р а ф

а  g.

а  g. я   дл

я VertexListGraph.)

•   st d : : p ai r< edge_iterator.  edge_iterator> edges(const  adjacency_list&  g)

В оз вращ ае (Т р е б уе тс

т   п ар у  и те р а то р о в , о б е с п е ч и в а ю щ у я   д л я  EdgeListGraph.)

ю   до с ту

п  к  н а б о р

у  р е б

14.1. с а Кл

ы о ф ар г

в

221

•   std::pair< adjacency_iterator,  adjacency_iterator> adjacent_verti ces(vertex_descri ptor  v, zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFED

const adjacency_list& g)zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQ В оз вращ ае с   в ерш и н о (Т р е б уе тс

т   п ар у   и те р а то р о в , о б е с п е ч и в а ю щ у ю   д о с ту п   к  в е р ш и н а м , с м е ж н ы й zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA  v г р а ф а   g. я   д л я   AdjacencyGraph.)

м

•   std::pa i r out_edges(vertex_descriptor  v.  const  adjacency_list&  g)

В оз вращ ае в ерш и н о бесп еч и в ае (Т р е б уе тс

т   п ар у   и те р а то р о в ,  о б е с п е ч и в а ю щ у ы   v  г р а ф а   g.  Е с л и   гр а ф   я в л я е тс т   д о с ту п   к о  в с е м   р е б р а м я   д л я  IncidenceG raph.)

ю   д о с ту

п   к   и с хо д я щ и

я   н е о р и е н ти р о в а н н ы м ,  и н ц и де н тн ы

, э то м  в е р ш и н

м   р ебр а т   и те р а то

м р

е  v.

•   std::pair< in_edge_iterator.  in_edge_iterator> in_edges(vertex_descriptor  v,  const  adjacency_list&  g)

В оз вращ ае т  п а р у  и те р а то р о в , о б е с п е ч и в а ю щ у ю  до с ту п   к  в хо дя щ и м  р е б р а м  в е р ш ин ы  v г р а ф а g. Э т а  о п е р а ц и я  н е до с пту н а , е с л и  д л я  п а р м е тр а  ш а б л о н а  Di rected ук а з а н о  di rectedS, и  до с туп н а , е с л и  и с п о л ь з ую тс я   undirectedS  и   bidirection alS. (Т р е б уе тс я   дл я   BidirectionalG raph.) •   vertex_descriptor  source(edge_descriptor  e.

const adjacency_list& g) В оз вращ ае (Т р е б уе тс

т   н ач аль н у ю   в ерш и н у  р е б р я   д л я   IncidenceG raph.)

а   .е

•   vertex_descriptor  target(edge_descriptor  e.

const adjacency_list& g) В оз вращ ае (Т р е б уе тс

т   к о н еч н у ю  в е р ш и н у  р е б р я   д л я  IncidenceG raph.)

а   .е

•   degree_size_type  out_degree(vertex_descriptor  u. const  adjacency_1ist&  g) В оз вращ ае т   чи сл о  р е б р , и с хо дя щ и х   и з  в е р ш и н ы  и. (Т р е б уе тс я   д л я  IncidenceG raph.) •   degree_size_type  in_degree(vertex_descriptor  u,

const adjacency_list& g) В оз вращ ае есл и   п арам ет (Т р е б уе тс

т   чи сл о   р еб р ,  в хо дя щ и х   в   в ерш и н у   и.   О п е р а ц и я  до с тпу н а р   ш аблон а  D irected б ы л  з а д н   к а к   bidirection alS. я   д л я   BidirectionalG raph.)

•   vertices_size_type  num_vertices(const  adjacency_!ist&  g) В оз вращ ае т   чи сл о  в е р ш и н  в  г р а ф е   g. (Т р е б уе тс

я   дл

я   VertexListGraph.)

•   edges_size_type  num_edges(const  adjacency_list&  g) В оз вращ ае (Т р е б уе тс

т   чи сл о  р е б р   в  г р а ф е   g. я   д л я   EdgeListGraph.) •

,  то л ь к

о

2 2 2 в а Гл

а 14  •  Клс а

ы  BGL

•   vertex_descriptor  vertex(vertices_size_type  n, const  adjacency_list&  g) zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLK В о з в р ащ ае т  я- ю   вреш и н у  в  сп и ск е  врше и н  граф .

•   std::pair edge(vertex_descriptor  u,  vertex_descriptor  v, const  adjacencyjists  g) В оз вращ ае т   р ебр о , с о е ди н я ю щ е е  в е р ш и н у zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPON  и  с  в е р ш и н о й  v в  г р а ф е   g. (Т р е б уе тс я   д л я   AdjacencyMatrix.) •   std::pair< out_edge_iterator.  out_edge_iterator> edge_range(vertex_descriptor  u,  vertex_descriptor  v, const  adjacency_list&  g) В оз вращ ае т   п ар у  и те р а то р о в  и с хо дя щ и х   р еб р , да ю щ и х   до с ту п   к о  в с е м  п а р а л лель н ы м   р ебр а м   и з   и  в   v.  Э т а   ф ун к ц и я   р а б о та е ,  то л ь к о   к о гд а   EdgeList  д л я ad jacen cyjist  я в л я е т с я   к о н те й н е р о м , с о р ти р ую щ и м   и с хо д я щ и е   р ебр а   п о  к о н еч н ы м  в е р ш и н а м , а  та к ж е  к о гд а  п а р а л е л ь н ы е  р еб р а  р а з р е ш е н ы , multisets  в  к а ч е с тв е   EdgeLi st  я в л я е т с я  та к и м  к о н те й н е р о м . •   std::pair add_edge(vertex_descriptor  u.  vertex_descriptor  v. adjacency_list&  g)

До бав ляе т  р е б р о  (м , v) к  г р а ф у  и  в о з в р а щ а е т  де с к р и п то р  р е б р а  д л я  н о в г о  р еб р а . е Д л я   те х   г р а ф о в ,  к о т р ы е   н е   р аз р еш аю т   и м ет ь   п арал ель н ы е   р ебр а ,  в   с л чу а е с л и  р е б р о  уж е   п р и с ут в уе т   в  г р а ф е , дуб л и к а т   до б а в л е н   н е  бедут , а  ф л а г  bool б ед у т   и м ет ь   з н ач ен и е  «л о ж ь » . Т а к ж е , е с л и   и  и  V я в л я ю т с я  де с к р и п то р а м и   од н о й  и  то й  ж е   в е р ш и н ы , а  г р а ф  я в л я е т с я   н е о р и е н ти р о в а н н ы м , с о з да ю щ е е   п ет л ю   р ебр о  до б а в л е н о   н е  бдеу т   и  ф л а г   bool  беду т   и м ет ь  з н а ч е н и е  «л о ж ь » . К о гд а фла г   ло ж ен , де с к р и п то р   р ебр а   н е  я в л я е тс я  п р а в и л ь н ы м  и  ег о  н е л ь з я  и с п о л ь з о е   н е  о п р е д в а ьт . М ес т о  н о в г о  р еб р а  в  с п и с к е  и с хо дя щ и х   р еб р   в  о б щ е м  с л уч а лен о , хо т я  з а д т ь  п о р я до к  в  с п и с к е  и с ох дя щ и х  р еб р  м о ж н о  п р и  в ы б о р е  EdgeLi s;. Е сл и  VertexLi st= vecS и  е с л и  о ди н  и з  де с к р и п то р о в  в е р ш и н  и  ИЛ И  V (ц е л ы е  ч и с л а ) и ме т  з н а ч е н и е , б о ль ш е , ч е м  те к щу е е  ч и с л о  в е р ш и н  г р а ф , г р а ф   ув е л и ч и в а е тс я та к и м   образ ом , ч т о  ч и с л о  в е р ш и н  с та н о в и тс я   равн ы м   std:  :max(u.v)  +  1. Е с л и EdgeLi st= vecS, до б а в л е н и е  р е б р а  де л а е т   н е д й с тв и те л ь н ы м  л ю б о й  и те р а то р  и с хо д я щ и х   р еб р   (out_edge_iterator)  д л я   в е р ш и н ы   и.   Т о   ж е   с а м о е   п р о и с ох д и т , е с л и   EdgeList  — о п р е д л е н н ы й  п о л ь з о в а те л е м   к о н те й н е р , и те р а то р ы   котрог о «п о р тя с я »  п р и  в ы з о в е   push(container,  x). Е с л и  г р а ф  я в л я е т с я   д в ун а п р а в л е н ным , т о   и те р а то р ы   в хо д я щ и х   р еб р  д л я   v  (in _edge_iterator)  то ж е   «п о р тя с я » . Е сл и  г р а ф  я в л я е т с я  н е о р и е н ти р о в а н н ы м , т о  л ю б о й  и те р а то р   out_edge_iterator д л я  v та к ж е  «п о р ти тс я » .  Е с л и  г р а ф  я в л я е тс я  о р и е н ти р о в а н н ы м , add_edge()  «п о р ти т » л ю б о й  и те р а то р  р е б р  (out_edge). (Т р е б уе тс я   д л я   EdgeMutableGraph.) •   std::pair add_edge(vertex_descriptor  u.  vertex_descriptor  v. const  EdgeProperties&  p.  adjacency_list&  g)

Добавляе с в о й с тв (Т р е б уе тс

т   ребр а  р е б р а я   дл

о   (и,   v)  к   г р а ф у   и   п р и с о е ди н я е . С м . та к ж е  о п и с а н и е  п р е ды дущ е я   EdgeMutablePropertyGraph.)

т   р  к а к   з н а ч е н и е   в н ут р е н н е г й   ф ун к ц и и  — н е  м е то д

о а   к лас а

.

14.1. с а Кл

ы о ф ар г

в

223

•   void  remove_edge(vertex_descriptor  u.  vertexjdeschptor  v. adjacency_list&  g) zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA Уд а л я е т   р ебр о zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   {и,  v)  и з  гр а ф .  Э т а  о п е р а ц и я  в ы з ы в а е т   с б о й  в о  в с е х   е щ е  н е  о б р а б о та н н ы х   де с к р и п то р а х   р еб р   и   и те р а то р а х ,  к о т р ы е   ук а з ы в а ю т   н а   р ебр о (м , »)•  Кро м е  то г , е с л и  в  к а ч е с тв е   EdgeLi st  в ы б р а н  vecS, то гд а   э т а  о п е р а ц и я  в ы з ы вае т  с б о й  в о  в с е х  и те р а то р а х , ук а з ы в а ю щ и х   н а  э л е м е н т  с п и с к а  р е б р  в е р ш и н ы   и.   Т о   ж е   с а м о е   п р о и с хо д и т   дл я   в е р ш и н ы   v  в   с л чу а е   н е о р и е н ти р о в а н н о г о и л и   д в ун а п р а в л е н н о г о   гр а ф .  нА а л о г и ч н о ,  д л я   о р и е н ти р о в а н н ы х   гр а фо в   эт а о п ерац и я   вы з ы вае т   с б о й  л ю б о г о   и те р а то р а   р еб р   (edge_iterator). (Т р е б уе тс я   д л я   EdgeMutableGraph.) •   void  remove_edge(edge_descriptor  e.  adjacencyJistS  g)

Уд а л я е т   р ебр о   е  и з   г р а ф . О тл и ч а е тс я   о т  ф ун к ц и и  remove_edge(u.  v.  g)  в   с л у ч а е   м ул ь т и г р а ф а .  Э т а   ф ун к ц и я  уда л я е т   е ди н с тв е н н о е  р е б р о   гр а ф , то г д а   ка ф ун к ц и я   edge(u.  v.  g)  уда л я е т   вс е   р ебр а   (и,  v).  Д а н н а я   о п ерац и я   де л а е т   не де й с тв и те л ь н ы м и   лю бы е   ещ е  н е  о б р а б о та н н ы е  де с к р и п то р ы   р еб р   и  и те р а то р ы  д л я  р е б р а  е.  К р о м е  то г , э т а  о п е р а ц и я  «п о р ти т » в с е  и те р а то р ы , к о т р ы е  ук а з ы ваю т   н а  с п и с о к  р е б е р  д л я   t arget ( e,  g). Ан а л о г и ч н о , д л я   о р и е н ти р о в а н н ы гр афо в  э т а  о п е р а ц и я  в ы з ы в а е т   с б о й  л ю б о г о   и те р а то р а   р еб р . (Т р е б уе тс я   дл я   EdgeMutableGraph.)

к х

•   void  remove_edge(out_edge_iterator  it e r . adjacency_list&  g)

И ме ф ун к ц и то г д (Т р е б уе тс

т  то т  ж е  э ф е к т , ч т о  и  remove_edge (*i t e r ,  g). Р а з н и ц а  с о с т и я   в ы п о л н я е тс я  з а  п о с то я н н о е  в р е м я  в  с лчу а е  о р и е н ти р о в а н н ы а   к а к   remove_edge(e,  g)  и м е т   в р ем ен н у ю   слож н ост ь   п о р я дк я   дл я   MutablelncidenceG raph.)

т  в  то м

, ч т о  э т а х  г р а ф о в , а   O(|Ј|/|V|).

•   template  void  remove_out_edge_if  (vertex_descriptor  u. Predicate  predicate.  adjacency_list&  g)

дУ а л я е т   вс ди к а ту ,  т о то р у   р ебр а чт о   и   п р и (Т р е б уе тс

е  и с ох дя щ и е  р е б р а  в е р ш и н ы  и  и з  гр а ф , к о т р ы  е с т ь   е с л и  п р е ди к а т   воз вращ ае т   и с ти н у  п р ,  р е б р о   уд а л я е т с я .  Э ф е к т  д л я   де с к р и п то р   вы з ов е   remove_edge()  д л я   к а ж до г о   и з   п о дл е ж а щ и я   дл я   MutablelncidenceG raph.)

е  удо в л е тв о р я ю и  п р и м е н е н и а   и  и те р а то р х   уд а л е н и

т   п ре и  к  де с к р и п а   та к о й  ж е ю   р ебер

, .

•   template  void  remove_in_edge_if  (vertex_descriptor  v. Predicate  predicate,  adjacency_list&  g)

Уд а л я е т   в с е  в хо дя щ и е  р е б р а  в е р ш и н ы  v и з  г р а ф , к о т р ы ди к а ту , т о  е с ть , е с л и  п р е ди к а т  в о з в р а щ а е т   и с ти н у  п р то р у   р е б р а ,  р е б р о   уд а л я е т с я .  Э ф е к т  дл я   де с к р и п то р ч т о   и  п р и  в ы з о в е   remove_edge()  д л я   к а ж до г о   и з  п о дл е ж а щ и (Т р е б уе тс я   д л я   MutableBidirectionalG raph.) •   template  void  remove_edge_if  (Predicate  predicate. adjacency_list&  g)

е  удо в л е тв о р я ю и  п р и м е н е н и а   и   и те р а то р х   уд а л е н и

т   п ре и  к  де с к р и п а   та к о й  ж е , ю   р еб р .

2 2 4 в а Гл

а 14  •  Клс а

ы  BGLzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFED

Уд а л я е т   вс е   р ебр а   и з   гр а ф ,  к о т р ы е   уд о в л е т в о р я ю п р е ди к а т   воз вращ ае т   и с ти н у   п р и   п ри м ен ен и уд а л я е т с я .  Э ф е к т  д л я   де с к р и п то р а   и   и те р а то р remove_edge()  д л я   к а ж до г о   и з  п о дл е ж а щ и х   ду а л е н и (Т р е б уе тс я   д л я   MutableEdgeListGraph.)

т   п р е ди к а ту ,  т о   ес т ь   е с л и   к   де с к р и п то р у   р ебр а ,  р е б р а   та к о й   ж е ,  ч т о   и   п р и   в ы з о в ю   р еб р .

и о е

•   vertex_descriptor  add_vertex(adjacency_lis.t&  g)

До бав ляе з да н н о (Т р е б уе тс

т   в ерш и н у   к  г р а ф у   и  в о з в р а щ а е й  в е р ш и н ы . я   д л я   VertexMutableGraph.)

т   де с к р и п то

р  в е р ш и н

•   vertex_discriptor  add_vertex(const  VertexProperties&  p. adjacency_list&  g) До бав ляе т   в ерш и н у   к  г р а ф у   и  в о з в р а щ а е т   де с к р и п то р  в е р ш и н з да н н о й  в е р ш и н ы . (Т р е б уе тс я   д л я   VertexMutabLePropertyGraph.)

ы  д л

я   вн ов

ь  с о -

ы  д л

я   вн ов

ь  с о -

•   void  clear_vertex(vertex_descriptor  u.  adjacency_list&  g)

ы zyxwvutsrqponmlkjihgfedcbaZ   и.   В е р ш и н а   о с та е с я а   и   и те р а то р а   та к о й   же , х   и  — н а ч а л ь н а я   ил и

дУ а л я е т   в с е   р еб р а ,  в хо дя щ и е   и   и с хо д я щ и е   и з   в ерш и н в о  м н о ж е с тв е   верш и н   гр а ф .  Э ф е к т  д л я   де с к р и п то р ч т о   и  п р и   в ы з о в е   remove_edge()  д л я   в с е х   р е б р ,  у   к о т р ы к о н еч н а я   в ерш и н а . (Т р е б уе тс я   д л я   EdgeMutableGraph.) •   void  clear_out_edges(vertex_descriptor  u. adjacency_list&  g)

ад лУ я е т   в с е  ребра , и сохдящ и е  и з  в ер ш и н ы  и.  В ер ш и н ш и н  гр аф . Э ф е к т  дл я  дес к р и п от р а  и  и етр ао р move_edge()  дл я   все х   р еб р , у   к о т р ы х   и  — н а ч л ь н а п р и м е н я е ст я  к  н ео р и ен ит р о в ан н ы м  граф м  (в м ест

а  о сате а   ат к о

й  ж е я   в ер ш и н а о  н е е  и с п о ль з йу т

я  в о  м н о ж есвт е  в ер , ч т о  и  п р и  в ы з о в е   ег . Э т а   о п е р а ц и я  н е е  el ear_vertex()).

•   void  clear_in_edges(vertex_descriptor  u. adjacency_list&  g)

дУ а л я е в ер ш и

т   в с е   р ебр а ,  в хо дя щ и е   в   в ер ш и н н   гр а ф . Э ф е к т  д л я  де с к р и п то р в е   remove_edge()  д л я   в с е х   р е б р , у   к о т р ы ц и я   п ри м ен и м а  то л ь к о  к  дв ун а п р а в л е н н ы

у   и.   В е р ш и н а  и  и те р а то р х   и  — к о н е ч н а м   гр а фа м

а   о с та е тс а  та к о й  ж е я  в е р ш и н а .

я   в о   м н о ж е с тв , ч т о  и  п р и  в ы з о . Э т а   о п е р а

е -

•   void  remove_vertex(vertex_descriptor  u.  adjacency_list&  g)

дУ а л я е м ен г а р а н ти р о в а т п арам ет в ерш и н н ы ми о п ерац и н ем хр а н и л и щ хр а н и л и щ

т   в ерш и н

у   и   и з   м н о ж е с тв а   в ерш и н   гр а ф .  П р е дп о л а г е тс я ,  ч т о   н а  м о я   у   э то й   в е р ш и н ы   н е т   в хо д я щ и х   и л и   и с хо д я щ и х   р еб р .  Ч то б ы ь  та к о е  с о с то я н и е , м о ж н о  з а р а н е е  п р и м е н и т ь  cl ear_vertex().  Е с л и р  ш а б л о н а  VertexLi st  с п и с к а  ad jacency_l  i st  — vecS, т о   в с е  де с к р и п то р ы , де с к р и п то р ы  р е б р  и  и те р а то р ы  дл я   г р а ф а  с та н о в я тс я  н е д й с тв и те л ь .  В с тр о е н н ы е   с в о й с тв а   vertex_i ndex_t  д л я   к а ж до й   верш и н ы   п осл е   э то й и  буд т  п е р е н ум е р о в а н ы  та к и м  о б р а з о м , ч т о   и н де к с ы  в е р ш и н  п о - п р еж у   о б р а з юу т   н еп реры в н ы й  ди а п а з о н   [0, | V |). Е с л и  в ы   и с п о л ь з уе т е   в н еш н е е е   с в о й с тв , о с н о в а н н о е  н а  в с тр о е н н ы х   и н де к с а х   в ерш и н , т о   в н е ш н е е е  д о л ж н о   бы т ь   с о т в е т с в ую щ и м   образ о м  п е р е с тр о е н о . Д р уг о й   воз -

т   уд а л е н и

14.1. с а Кл

ы о ф ар г

в

225 zyxwvutsrq

м о ж н оь с т ю   я в л е ст я   ок т а з   о т   и сп о ль з о в ан и я  врсотен ог о  и н екдс а  верш и н в  п оль з у   и сп о ль з о в ан и я  свой ст а  дл я  добавлен и я  свнеобст ог о  и н кесд а  вре ш ин . Е сл и  ва м  ниодмбех о  чсат о  и сп оль з ват ь  фн у кц и ю  remove_vertex(), I i stS я в л е ст я  гораз д о  лчш у и м  вы обр м  дл я  ш балон ог о  п армте а  VertexLi st. (Т рсебту я  дл я  VertexMutableGraph.) •   template  property_map::type get(PropertyTag,  adjacency_list&  g) В о з в р ащ ае т  и з м ен ям ы й  о-бъкет ображтне и е  свой ст в  дл я  свой ст а  верш и н ы , з а нд о й  PropertyTag. Property Tag долже н  совпатд ь  с  он ди м  и з  свой ст , занд н ы х  в  ш аблон о м  п армте е  VertexProperties  ргаф . (Т рсетбу я  дл я  PropertyGraph.) •   template  propertyjnap: :const_type get(PropertyTag,  const  adjacency_list&  g) В о з в р ащ ае т  кон астн ы й  о-бъкет ображтне и е  свой ст в  дл я  свой ст а  верши н ы , з а нд о й  PropertyTag. PropertyTag долже н  совпатд ь  с  он д и м  и з  свой ст , занд н ы х  в  ш аблон о м  п армте е  VertexProperties  ргаф . (Т рсебту я  дл я  PropertyGraph.) •   template  typename property_traits< typename  property_map::const_type>::value_type get(PropertyTag.  const  adjacency_list&  g.  X x) В о з в р ащ ае т  з н ачен и е  свой ст а  дл я  х , гд е  х  — ескдри пот р  вреш и н ы  и л и  рбера . (Т рсебту я  дл я  PropertyGraph.) •   template  void  put(PropertyTag.  const  adjacency_list&  g,  X x. const  Value& value) П р и св аи в ае т  з н ачен и е  value свой ст у   х , гд е   х  — дескри п от р  вреш и н ы  и л и  ре бра . З н ач ен и е  должн о  бы т ь  п роебмазыу м  к  typename  property_traits: :value_type. (Т ресбту я  дл я  PropertyGraph.) zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJI ќ  template  typename  property_value::type& get_property(adjacency_list&  g.  GraphProperties); е  к  говмфар у В зо щ а рв е т  совй тс , назд о е  п о  G raphProperti es  и  пи рндеос н о к т еъ бо у   д . Ксал с  свой ст в  property_value  ел опдр н  в  boost/ pending/ property.hpp. ќ  template  const  typename  property_value::type& get_property(const  adjacency_list&  g.  GraphProperties); 8  З ак

. 375

226 в а Гл

ы  BGLzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFED

а 14  •  Клс а

В оз вращ ае о бъ ек т

т  с в о й с тв о у   д . К л а с

е а рибы В

, з а д н н о

е  п о  G raphProperties, при с о е ди н е н н о е  к  гр а ф о в о м у в  property_val  ue о п р е д л е н  в   boost/ pending/ property.hpp.

с  с в о й с т

м  EdgeList и  VertexList

В   э то м   р а з д е л е   уд е л е н о   вн и м ан и е  то м у ,  к а к у ю   в ер си ю   клас а   ad jacen cyjist  и с п о ль з о в ат ь  в  то й  и л и  и н о й  с и аутц и . С п и с о к  с м еж н о с т и  и м е т  о ч ен ь  м н о г о  в о з м о ж н о с ет й   д л я   к о н ф и г у р и р о в а н и я . И н те р с юу щ и е   н а с   п а р м е тр ы   EdgeList  и  VertexList з адю т  с тр ук тр ы   да н н ы х , и с п о л ь з уе м ы е  д л я  п р е дс та в л е н и я  г р а ф . В ы б о р  EdgeL'i st и   VertexList  в л и я е т   н а   в р ем ен н у ю   слож н ост ь   м н о ги х   гр а фо в ы х   о п ерац и й  и  п р о с тр а н с тв е н н у ю   слож н ост ь   гр а фо в о г о   о б ъ е к та . BG L  и с п о л ь з уе т   к о н те й н е р ы   и з   STL,  та к и е   к а к   в е к то р   st d : :  vector,  с п и с о к st d :: 1 i st  и  м н о ж е с тв о   st d :: set  д л я   п р е дс та в л е н и я   м н о ж е с тв а   в ерш и н  и  с тр ку т р ы   см еж н о ст и   (в хо д я щ и е   и  и с хо дя щ и е   ребра )  г р а ф .  В  к а ч е с тв е   к о н те й н е р а  д л я EdgeLi st  и  VertexLi st  м о гу т   бы т ь   вы бран ы  р а з н ы е  ти п ы : •   vecS з а д е

т   st d ::  vector.

•   l i st s  з а д е

т   st d : : l i st . т   st d : : si i st 1 .

•   siist S  з а д е •   setS з а д е

т   st d ::se t .

•   hash_setS  з а д е

е а рибы В

м  ти

т   st d ::  hash_set 2.

п  VertexList

П арам ет р  VertexLi st  о п р е д л я е п р е дс та в л е н и я   м н о ж е с тв н е р  д о л ж е н   бы т ь   м о де л ь l i s t s  я в л я е т с я   хо р о ш и м верш и н ы . Н о  то г д а   п о я в л я ю тс н и ю  с   vecS. П р о с тр а н с тв е н н а я   с л о ж н о с ть д л я  к а ж до й  в е р ш и н ы , ч е м В рем ен н а я   с л о ж н о с ть д ую щ и х   оп ерац и й .

т  в и д  к о н те й н е р а , к о т р ы й  б деу т  и с п о л ь з о в а н  д л а   верш и н   и л и   д в ум е р н о й   с т р ук т ур ы   гр афа .  К о н т е й ю   Sequence  и л и   RandomAccessContainer.  В  о б щ е м   с л уч а   вы бором ,  е с л и   в а м   н уж н о   б ы с тр о   до б а в и т ь   и   уд а л и т я  д о п о л н и т е л ь н ы е  н а к л а д н ы е  р а с хо д ы   п о  с р а в н е :  st d :: 1 i st  тр е б у  st d :: vector, та к  к а к  до п о л н и те л ь н : в ы б о р   VertexList  в л и я е

т  хр а н и т

ь   боль ш о  хр а н и

т   н а  в р е м е н н у

е  и н ф о р м а ц и т  дв а  ук а з а те л я ю   слож н ост

я е ь и .

ь   сле

-

•   add_vertex() Э т а  о п е р а ц и я  в ы п о л н я е тс та к   и  д л я   l i s t s  (р е а л и з о в а н я в л я е тс я   ти п о м   vecS,  в р е м от г , ч т о  в е к то р  п р и ох ди тс • 

я  з а  а м о р ти з и р о в а н н о е  п о с то я н н о а  с  push_back()). О дн а к о я   вы п олн ен и я  э то й   о п е р а ц и я  р а з м е щ а т ь  в  п а м я т и  з а н о в о

1

  л Ес   Ел с к оа т

е  в р е м я  к а к  д л я  vecS, а   ти п   VertexList= vecS и   и н о гд а   боль ш е   из- з а , а  в ес ь  г р а ф  к о п и р о в а т ь

remove_vertex()

Э т а  о п е р а ц и я  в ы п о л н я е тс я  з а  п о с то я н н о д л я   vecS. Б о л ь ш а я  в р е м е н н а я  с л о ж н о с т р ы   верш и н   (к о т о р ы е   в  э то м  с л уч а

2

, к о гд

и  рлаие з ц и и  рлаие з ц и й  рилае з ц и йе

я  STL, куро т я  STL, куро т .

ю  в ы  п ир емн т я ю  в ы  п иренм т я

е  в р е м я  д л я   1 i stS и  з а  в р е м я zyxwvutsrqponmlkj  О( \  V\  + \ E\ ) ь   vecS о б ъ я с н я е тс я  те м , ч т о  де с к р и п то е   я в л я ю тс я   и н де к с а м и ,  с о тв е тс в ую щ и м и , и псеьолзу , ием

т  std::slist. т  std::hash_set.  Н па ри ме

, SGI STL яс тевял

я

14.1. с а Кл

м ест у   в   сп и ск в сег о   гр а ф . •   vertexO Эт

е а рибы В

а  о п е р а ц и

е  в е р ш и н

) до л ж н

я  в ы п о л н я е тс

м ит

ы   бы т

я  з а  п о с то я н н о

ь   с к о р е к ти р о в а н

е  в р е м

ы о ф ар г

ы   в  и с хо дя щ и

я  д л

в

2 2 7 zyxwvutsrqp

х   р ебр а

я   vecS и  O (|V|) дл

х

я   l i st s.

п EdgeList

П арам ет и с хо д я щ и К о н те й н е р ы ния

р   EdgeList  о п р е д л я е т ,  к а к о й  в и д  к о н те й н е р а  и с п о л ь з уе тс я   д л я   хр а н е н и я х   ребе р   (и , в о з м о ж н о ,  в хо дя щ и х   то ж е )  д л я   к а ж до й   в ерш и н ы   в   гр а фе . ,  и с п о л ь з уе м ы е   дл я   с п и с к о в  р е б р ,  до л ж н ы   уд о в л е т в о р я т ь   тр е б о в а м  л и б о  Sequence, л и б о   AssociativeContainer. О дн и м   и з   п ерв ы х   воп росов ,  к о т р ы е   н е о б хо д и м о   р а с м о тр е т ь   п р и   вы бор е EdgeLi st, я в л я е т с я  то , хо ти т е  л и  в ы  г а р а н ти р о в а т ь  о тс у тв и е   п арал ель н ы х   р еб р в  г р а ф е . Е с л и  н уж н а   г а р а н ти я  то г , ч т о   г р а ф  н е  с та н е т   м ул ь т и г р а ф о м ,  м о ж н о  и с п оль з оват ь   set s  и л и   hash_setS.  Е с л и  в ы   ох ти т е   и м ет ь   м ул ь т и г р а ф   и л и  з н а е т , ч т о , то г д а   можн о   вы брат ь   о ди н   и з   ти п о в п арал ель н ы е   р ебр а   в с та в л я ть с я   н е  бтуд п о с л е до в а те л ь н о с те й :  vecS,  l i st s  и л и   slist S.  П о м и м о  э то г , н е о б ох ди м о   п ри н ят ь в о   вн и м ан и е  р а з н и ц у   в о   в рем ен н о й   и   п р о с тр а н с тв е н н о й   слож н ост и   дл я   р а з л и ч н ы х   гр афо в ы х   о п ерац и й . М ы  и с п о л ь з уе м   | V|  д л я   о б о з н а ч е н и я  о б щ е г о   чи сл а   в ер ш и н   гр аф а   и zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   \ Е  | д л я   ч и с л а   р еб р .  О п е р а ц и и , к о т р ы е   з де с ь   н е  р а с м о тр е н ы , в ы п о л н я ю тс я  з а  п о с то я н н о е  в р е м я . П р о с тр а н с тв е н н а я   с л о ж н о с ть :  в ы б о р   EdgeList  в л и я е т   н а  о б ъ е м   п а м я ти ,  в ы де ляем о й  н а  о дн о  р е б р о  в  г р а ф о в о м  о б ъ е к т . В  п о р я дк е  в о з р а с та н и я  тр е б уе м о г о   ме с т а  с л е дую т : vecS, si i stS, 1 i stS, hash_setS  и   sets. В рем ен н а я   с л о ж н о с ть :  в  с л е дюу щ е м   оп и сан и и  в р е м е н н о й  с л о ж н о с т и   раз ли ч и   о бо з н ач ен и й   с   «б о л ь ш и м   О »  д л я н ы х   о п ерац и й   м ы   и с п о л ь з уе м   | Ј | / | У |  в н утр вы раж ен и я   дл и н ы   сп и ск а  и с хо дя щ и х   р еб р .  С тр о г о   го в о р я , э т о  н е  с о в с е м   то ч н о , та к   к а к   |Ј|/|V|  да е т   т о л ь к о   с р е дн е е   чи сл о   ребе р   н а   в ерш и н у   в   гр а фе .  В   удхш е м с л уч а е   чи сл о   и с хо д я щ и х   р еб р   дл я   в е р ш и н ы   равн о   |У |  (е с л и   г р а ф   — н е   м ул ь ти гр аф) .  В  р а з р е ж е н н ы х   гр а ф х   \ Е \  о б ы ч н о   н ам н ог о   м ен ь ш е , ч е м   \ V\ , и   м о ж е т   рас с м а тр и в а ть с я   к а к  к о н с та н та . •   add_edge() К о гд а   EdgeList  я в л я е т с я   UniqueAssociativeContainer  (а с о ц и а ти в н ы й  к о н те й н е р с  ун и к а л ь н ы м и  э л е м е н та м и ) к а к  st d :: set, о тс у тв и е   п ар ал ель н ы х   р еб р  п о с л е до б а в л е н и я  р е б р а  г а р а н ти р о в а н о . Д о п о л н и те л ь н о е  в р е м я  п о и с к а  и м е т  в р е м е н н у ю  с л о ж н о с т ь   O(log(|Ј|/|V|)).  Т и п ы  EdgeList,  к о т р ы е  м о де л и р ую т   Sequence (п о с л е д о в а те л ь н о с ть ) ,  н е  о с ущ е с тв л я ю т   та к у ю   п ро в ерк у   и  п о э то м у   add_edge() в ы п о л н я е тс я   з а   а м о р ти з и р о в а н н о е  п о с то я н н о е  в р е м я .  Э т о  о з н а ч а е т , ч т о   е с л и в а м  б е з р а з л и ч н о , и м е т  л и  г р а ф  п а р а л е л ь н ы е   р еб р а , и л и   в ы  ув е р е н ы , ч т о   п а рал ель н ы е   р ебр а  н е  буд т  д о б а в л я ть с я   к  г р а ф у , т о  л уч ш е   и сп оль з оват ь  о с н о ван н ы й   н а  п о с л е до в а те л ь н о с тя х   EdgeList.  Ф у н к ц и я  add_edge()  д л я   п о с л е до в а те л ь н о г о   EdgeList  р е а л и з о в а н а   к а к   push_front()  и л и   push_back().  О д н а к о   дл я я   обы чн о   в ы п о л н я е тс я   б ы с тр е ,  ч е м   д л я st d :  : l i s t  и   std:  : sl i st  э т а   о п е р а ц и st d :: vector, к о т р ы й  и н о гд а  п е р е м е щ а е тс я  в  п а м я т и  и  к о п и р уе т  с в о и  э л е м е н ты . •   remove_edge() Д л я   п о с л е до в а те л ь н ы х   ти п о ван и е м   std:  :remove_if().  Э т

в   EdgeLi st  э т а   о п е р а ц и о   о з н ач ает ,  ч т о   с р е дн е

я   р е а л и з уе т с е   в рем

я   равн

я   с  и с п о л ь з о о   |Ј|/|V|.  Д л

я

2 2 8 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 14 • с  Кла ы  BGLzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFED

о сн в а н ы х  н а  мн ваожтсе х  тип о в  EdgeLi st и сп ольтез у я  фн у кц и я  — мо те д  ка л с  с а  erase(), корта я  и ме т  вмрен у ю  сложн ост ь  log(|Ј | /  |V|). • edge О В р ем ен н а я  с л о ж н о с т ь  э то й  о п е р а ц и и  р а в н а zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPON  О( \Е  | / 1V |), к о гд а  ти п  EdgeLi st я в л я етс я  Sequence, и  O(log(|Ј| /1 V |)), к о гд а  ти п  EdgeLi st я в л я е тс я  AssoriativeContainer. •   clear_vertex() Дл я  ори ен ит рован ы х  гроаф в  с  пльеовнсатд ы м   итп о м  EdgeLi st  врмен а я  + \ V\ ), дог т а  ка к  дл я   EdgeLi st  н а  осн ов е  асоц и атв сло ж н о ст ь   п о рк яд а  О( \ Е \ н го о  кон йе т ре а  оп рцае и я  вы п олн с тея я  беыр тс , вгес о  з а  О( \  V |log(|Ј |/| V |)). Д л  я н ео р и ен и т р о в а н ы х  граоф в  дан а я  оп реац и я  и ме т  врмен у ю  сложн ост ь  п о кр я д а   «О \ Е \  /  \\У )У  и  O(|Ј|log(|Ј|/  |V|)  /  \V\). • remove_vertex() В р ме н а я  сложн ост ь  п окряд а  О( \ Е \  + \ V\ ) вн е  з ави с м ост и  о т  ти п а  EdgeLi st •   out_edge_i terator::operator++() в  EdgeLi st.  Од Э т а  оп ерац и я  вы п олн сяет я  з а  п оянст о е  врме я  дл я  вес х  ти п о н ка о  и мсет я  з н ачи ельтн а я  раз н и ц а  (п оняст ы й  множ и ельт ) п о  вмрне и  мже д у   р аз ли ч н ы м и  ти п ам и . И  эт о  вжан о , п оск ль у  оп ерац и я  яв ляест я   «робчае й л о ш к о йад »  мн иог х  аолгрим т в   н а  грахф . С корст ь  эо т й  оп ерац и и  в  п окрдя е е е  умен ь ш ен и я : vecS, si i stS, 1 i stS, sets, hash_setS. •   i n_edge_i terator::operator++() мС . выш е . •   vertex_i terator::operator++() Э т а  оп ерац и я  вы п олн сяет я  з а  п оняст о е  врме я  и  дочатнс о  бы р тс о  (вы п ол н сяет я  с о  скорьст ю  и н крмен т а  указ етля) . Вы об р  OneD н е  вли яе т  н а  скорст ь оэт й  оп ерац и . •   edge_iterator::operator++() Д ан а я  оп ерац и я  вы п олн сяет я  з а  п оняст о е  врме я  и  п оказ ы вае т  поже х е  упо р о я дч е н и е  п о  скорямст , чт о  и  out_edge_i terator в  онт ош не и и  вы бор а  EdgeLi st. о О хб д  вес х  рбе р  и ме т  вмрен у ю  сложн ост ь  п окряд а  О( \ Е  \  + \ V\ ).zyxwvutsrqpo •   adjacency_iterator::operator++() Д ан а я  оп ерац и я  вы п олн сяет я  з а  поняст о е  вмре я  и  п оказ ы вае т  пожех е  упо р о я дч е н и е  п о  скорямст , чт о  и  out_edge_i terator в  он т ош не и и  вы бор а  EdgeLi st.

но с б а и ь т л С

ь  и  с бо

П р и  и з м ен и и  ср укт идм о  дей всто а ь  оорстжн о н е к о рт ы е   о б ъ ы ке т - и о ре а т му о г т  сат ь   н ек о р н т ы м и г е   14.2 н еоп лнрд Л ис т н

и  иорета ы   р га ф

ы  и  муог

в  и  дес ркиопт а  (пет у . В  з ави с м ост ы   и  обыъкет - секрди поыт . Н ап ри м ер т  оказьтс

м  добавлен и и  о т  ти п , рлзаеьт у я  разшру и ельтн ы м и

г 14.2.  м еи р П р  соб я о р  ит а р е т в //   VertexList=vecS typedef  adjacency_list Graph:

в я  и л и  уаленд и я  ребр ) но хбе а  adjacency_l  i st  и  о т  оп реац и ,  казу ы ваю щ и е   н а  граф ы   в ы п о лн е и я  код а  в  ли ст н .

и , -

14.1. с а Кл

ы о ф ар г

в zyxwvutsrqpon 229

Graph G(N); zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

//  тинлопаН

ь   .фарг .

.

//  ктыпоП а   удалит ь   св е  вынишре .  Неврно ! graph_traits::vertex_iterator  vi. vi_end: for  (tie(vi. vi_end) = vertices(G); vi != vi_end;  ++vi) remove_vertex(*vi, G); //  Друга я   ктыпо а  удалит ь   св е  вынишре .  сВ е  рнва о   онрев ! graph_traits::vertex_iterator  vi. vi_end.  next: tie(vi. vi_end) = vertices(G); for  (next = vi; vi != vi_end; vi -  next) { ++next; remove_vertex(*vi, G): } zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA П ри чи н а  э то й  п р о б л е м ы  в  то м , ч т о  м ы  в ы з ы в а е м   remove_vertex(),  к о т р ы и сп оль з ован и и   adjacency_11st  с   Vertexl_ist= vecS  в ы з ы в а е т   с б о й   в с е х   и те р а то р о и   де с к р и п то р о в  г р а ф а  (в  н а ш е м  с л чу а е   — vi  и  vi_end), та к и м  о б р а з о м , о ш и б к я в л я е тс я   в  п о с л е дую щ и х   и те р а ц и я х   ц и кла . П р и   и сп оль з ован и и  др гу о о  в и д а  adjacency_l  i st, гд е  VertexLi st= l i stS, и те р а то р ы   н е   «п о р тя с я »  п р и   уда л е н и и   в ерш и н , е с л и ,  к о н е ч н о ,  и те р а то р   н е   ук а з ы в а н а   уд а л я е м у ю   в ерш и н у . Э т о  де м о н с тр и р уе т   к о д  и з  л и с ти н г а   14.3. Л ис т н

г 14.3. м еи р П

р о бс

я ор т ар е ти

й  п р

и в

а  п о

л

в (2)

// VertexList=1istS typedef adjacency_list Graph: Graph G(N): ь   .фарг . . //  тинлопаН

//  ктыпоП а   удалит ь   св е  вынишре .  онревН ! graph_traits::vertex_iterator  vi, vi_end: for  (tie(vi. vi_end) = vertices(G); vi != vi_end:  ++vi) remove_vertex(*vi, G): //  Удалит ь   св е  вынишре .  оньливарП . graph_traits::vertex_iterator  vi, vi_end.  next; tie(vi,  vi_end) = vertices(G); for  (next -  vi; vi !-  vi_end: vi = next) { ++next: remove_vertex(*vi, G): } Н аи боле е   без о п асн ы м   и   э ф е к ти в н ы м  с п о с о б о м   м ас овог о   уд а л е н и я   ребе и з   adjacency_l  1 st  я в л я е т с я  п р и м е н е н и е  ф ун к ц и и  remove_edge_i  f ( ) . В оп ро с   к о р е к тн о с т и  к а с а е тс я  т а к ж е   де с к р и п то р о в   верш и н  и  р е б е р .  Н а п р и м ер ,  п р е д п о л о ж и м ,  ч т о   в ы   и с п о л ь з уе т е   в е к то р   де с к р и п то р о в   верш и н   дл я   от слеж и ван и я   р о ди те л е й   (и л и   п р е д ш е с т в е н н и к о в )  в е р ш и н   в  де р е в е   к р а тч а й ш и п ут е й   (с м . ф а й л  example/ dijkstra- example.cpp).  В ы  с о з да е т е   в е к то р  р о д и те л е й   вы з ово м  di jkst ra_ sh ort est _ pat h s( ) ,  а  з а те м   уд а л я е т е   и з  г р а ф а   в ерш и н у .  П о с л е  э то г о  в ы   п ы та е т с ь   и сп оль з оват ь   в е к то р  р о ди те л е й , н о  п о с к о л ь к у   в с е  д е с к р и п т о р верш и н   с та л и   н е к о р е к тн ы , р е з ул ь та т   та к ж е   н ев ерен .  Э т о   м о ж н о   п р о с л е ди т в   л и с ти н г е   14.4.

р х ы ь

2 3 0 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 14  •  Клс а ы  BGL Л ис т ин

г 14.4.   м еи р П р  со б я о др тпир ске в  ш р и е в н zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLK std::vector  parent(num_vertices(G)); std::vector  distance(num_vertices(G)); dijkstra_shortest_paths(G. s. distance_map(&distance[O]). predecessor_map(&parent[0])): //  ахолП я   идея ! Дротпиксе //  в  вротке е   ел тидор й remove_vertex(s, G ) :

м ан и е н е п о с р е дс тв е н н о де й с тв и те л ь н ы м н ез ав и си м кот ры ющи би ль н ы м ш аблон н ы важ н е ны

ы   ишрев

н  сстявона

я   мынткер о

и

//  еачулоП м   ынрев е   та ьлузер ы for(tie(vi,  vend) = vertices(G): vi != vend; ++vi! std::cou.t «  p[*vi] «  " стеялв я   ел тидор м   л д я  "zyxwvutsrqponmlkjihgfedcbaZYX  «  *vi «  std::endl:zyxwvutsrqponmlkjihgfedcba е  п р и ч и н ы  с б о е в   и те р а то р о в   и  де с к р и п то р о в   с л е ду т  о б р а ти т ь   вн и П р и   п ои ск , ч т о  з а тр а г и в а ю тс я   де с к р и п то р ы   и  и те р а то р ы , zyxwvutsrqponmlkjihgfedcbaZYXWVUT   ен  утавсчиующе   в  о п е р а ц и и .  Н а п р и м е р , в ы п о л н е н и е   remove_edge(u,  v,  g)  в с е гд а   де л а е т   не и   де с к р и п то р   р ебр а   (и,  v)  и л и   и те р а то р ,  ук а з ы в а ю щ и й   н а   (и,  о ) , о   о т   в и д а   adjacen cyl  ist .  To ес т ь   в  э то м   р а з де л е   н а с  в о л н ую т   э ф е к ты , е   вы з ы вае т   remove_edge(u.  v.  g)  д л я   де с к р и п то р о в   и  и те р а то р о в ,  ук а з ы в а х   н а  о тл и ч н ы е   о т   (и,   v)  р е б р а . В  о б щ е м  с л уч а е , е с л и  в ы  хо ти те , ч то б ы  де с к р и п то р ы  в е р ш и н  и  р е б р  б ы л и  сат т   и сп оль з оват ь   l i s t s  и л и   sets  д л я и   (н и к о г д а   н е   «п о р ти л и с ь ») ,  с л е ду х   п а р а м е тр о в   VertexList  и   EdgeList  к л а с а   ad jacen cyjist .  Е с л и  д л я   в а с е   з а тр а т ы   п ам ят и   и   скорост ь   о бхд а   гр а ф ,  и с п о л ь з уй т е   vecS дл я   ш а б л о ! [х   п а р а м е тр о в   VertexList  и / и л и   EdgeList.

р Ои е н т о в а ы

е  и  неори нтваы

е  с пи с к

и  с нмос теж

и

т  б ы т ь  и с п о л ь з о в а н  дл я  п р е дс та в л е н и я  к а к  о р и е н ти р о в а ! [К лас с  ad jacency_l  i st  м о ж е ных , та к   и  н е о р и е н ти р о в а н н ы х   гр а фо в , в  з а в и с и м о с т и   о т   а р гм у е н а т ,  п р и с в о е н н о г о м  di rectedS и л и  bi di recti onal S в ы б и р а ест я ш абло н н о м у  п а р м е тр у   Di rected. Ук а з а н и е о р и е н ти р о в а н н ы й  гр а ф , тогд а  к а к  undi rectedS в ы б и р ае т  н е о р и е н ти р о в а н н ы й . С м . pa sде л   12.1.1, гд е  да н о  о п и с а н и е  р а з л и ч и й  м еж д у   о р и е н ти р о в а н н ы м  и  н е о р и е н ти р о в а н н ы м   гр а ф м и   в   BG L. В ы б о р   bidi recti onal S ук а з ы в а ет ,  ч т о   г р а ф   п р едо с ат в и т   ф ну к ц и ю  i n_edges ()  в  до п о л н е н и е  к  ф ун к ц и и  out_edges (). Э т о  тр е б у т  дв о й н ы х   р а со х д в п ам ят и  н а  о дн о  р е б р о   (и  с л жу и т   п ри чи н о й  тог , п о ч ем у   in_edges()  н е о б я з а те л ь н а ) .

р е нВ и т у

е  с войс т

а

т  б ы т ь  з а к р е п л е н ы  з а  в е р ш и н а м и  и  р е б р а м и   гр а ф , з а д н н о г С в о й с тв а  м о г у к о м   с м е ж н о с ти ,  ч е р з   й е с ф и тн р е   тйвсо   (property  interface).  Ш а б л о н н ы м е тр ы   VertexProperties  и   EdgeProperties  к л а с а   adjacency_1  ist  п о др а з ум е в а ю п о лн ен и е  к л а с о м   с в о й с тв , к о т р ы й   о п р ед ле н   с л е д юу щ и м   образ ом .

о  с п и с е   п ар т   за -

template  struct  property: PropertyTag  — э т о   ти п , к о т р ы й   п рост о   и д е н т и ф и ц и р уе т   и л и  да е т   ун и к а л ь н о е и м я   с в о й с тв у .  И м е ю тс я   н еск о ль к о   п р е до п р е д л е н н ы х   те г о в   (с м . р а з де л   15.2.3), и   о ч ен ь  л е г к о  до б а в и т ь   н овы е . Д л я   дуо б с тв а   BG L та к ж е   п р е до с та в л я е т   п р е до п р е де л е н н ы е   о бъ ек т ы   те г о в ы х   ти п о в   (в  да н н о м  с л чу а е   з н ач ен и я   п ереч и слен и я  enum) д л я  и с п о л ь з о в а н и я  в  к а ч е с тв е  а р гму е н то в   к  ф ун к ц и я м , к о т р ы е  п р и н и м а ю т  о б ъ ек ты - те г и   свой ст в   ( к   н и м   о тн о с и тс я ,  н а п р и м е р , ф ун к ц и я   get()  и з   ad jacen cyjist ) .

14.1. с а Кл

ы о ф ар г

2 3 1zyxwvutsrq в

а   property  о б о з н а ч а е т  ти п  з н а ч е н и й  с в о й с тв . П а р а м е т р  Next П арам ет р  Т  свой с тв Property  п о з в о л я е т   ук а з а т ь   с л е д ую щ е е   с в о й с тв о ,  та к   ч т о   п р о и з в о л ь н о е   чи сл о свой ст в   може т   бы т ь   св яз ан о  с  о дн и м   и  те м   ж е   г р а ф о м . т  б ы т ь   и сп оль С л е д ую щ и й   к о д  п о к а з ы в а е т , к а к  с в о й с тв а   в ерш и н  и  р е б р  м о гу з ован ы   п р и   с о з да н и и   гр а ф .  М ы   с в я з а л и   с в о й с тв о   «р а с то я н и е »  с о   з н а ч е н и я м и ти п а   float  и  с в о й с тв о   «и м я » с о  з н а ч е н и я м и  ти п а   st d ::st r in g  с  в е р ш и н а м и   гр а фа . С   ребрам и   гр а ф а   св яз ан о  с в о й с тв о   «в ес»  с о  з н а ч е н и я м и  ти п а   float.

ж ен и р а з де л

во й С с т

typedef property VertexProperties; typedef property EdgeProperties: typedef adjacency_list Graph: Graph g(num_vertices): // т и о р т с о п ь овы граф й к е ъбо т З н ач ен и я  с в о й с т в  м о гу т  б ы т ь  п р о ч и та н ы  и  з а п и с а н й   с в о й с тв .  О п и с а н и е  то г ,  к а к  и з в л е ч ь   о т браж ен и е   3.6.  Г л а в а   15  ц е л и к о м   п о св ящ ен а   и сп оль з ован и

о с и е нкд

Е сл то р о ап аз он ю тс Н е о б хо д и м с т пу до л ж е

в о й с тС

а в ер ш и н

ы  с  и с п о л ь з о в а н и е я   свой ст ю   о т браж ен и

м   отбра в   и з   гр а ф

,  с м

. в

й   с в о й с тв

.

ы

и  VertexLi st  г р а ф а  е с т ь   vecS, т о  г р а ф  и м е т   в с тр о е н н о е   с в о й с тв о   «и н де к с » ,  к о ы  н а хо дя тс я  в  ди е  м о ж е т  б ы т ь  п о л чу е н о  ч е р з  с в о й с тв о  vert exj ndex_t. И н де к с е   [О , zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA  \ V |), б е з   п р о п ус к о в .  К о г д а   верш и н а  уда л я е тс я ,  и н де к с ы   п е р е с тр а и в а я   та к ,  ч т о   о п я т ь   н а хо д я т с я   в   с о т в е т с в ую щ е м   ди а п а з о н е   и   б е з   п р о п ус к о в . а   н ек о т ра я  о с то р о ж н о с т ь   п р и  п о л ь з о в а н и и  э ти м и  и н де к с а м и  д л я   до а   к  с в о й с тв а м ,  хр а н я щ и м с я   в н е   гр а фо в о г о   о б ъ е к та ,  п о с к о л ь к у   п о л ь з о в а те л ь н   обн ови т ь   в н еш н е е  хр а н и л и щ е   в  с о тв е тс в и и   с  н о в ы м и  и н де к с а м и .

а р еб

, с ын о а з д

е е л зо т ва п ь

м

С о з да н и е   п о л ь з о в а те л ь с к и х   ти п о в   свой ст в   — до с та о ч н о   п р о с то е   де л о .  Н уж н то л ь к о  о п р е д л и т ь   те г о в ы й   клас с  д л я  н о в о г о  с в о й с тв а .  В  с л е дюу щ е м   к о д е   о п р ед л я ю тс я   те г о в ы й   клас с  д л я   с в о й с т в   «м о щ н о с ть »  и  «п о т к » ,  к о т р ы е  м ы   з а к р е п л я е м  з а  р е б р а м и   гр а ф .zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

о -

enum edge_capacity_t { edgejrapacity }: enum edge_flow_t { edge_flow }: namespace boost { BOOST_INSTALL_PROPERTY(edge.  flow); BOOST_INSTALL_PROPERTY(edge.  capacity): } Т еп ер ь   в ы   м о ж ет е   и сп оль з оват ь   ет г   н о в о г о   с в о й с тв а   в   о п ред лен и и   свой ст в та к  ж е , к а к  и  о ди н  и з  в с тр о е н н ы х   те г о в . typedef property Cap: typedef property EdgeProperties; typedef adjacency_list Graph; К а к   обы чн о , о то б р а ж е н и я   свой ст в   д л я   э ти х   с в о й с т в   м о гу т   бы т ь   п о л уч е н ы  и з гр а ф а  ч е р е з   ф ун к ц и ю   get  О . property_map::type capacity = get(edge_capacity. G); property_map::type flow - get(edge_flow, G);

2 3 2 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 14 •  Ксал ы  BGLzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDC

В  фай л п р и м еа

в о сй т С

е  edge_property.cpp  п риевд

н  п олн ы

й  ко д  дл

й  инод ысх

я  рсарнмеот ог

о

.

а  вер ш и н

, с оныазд

е  пел тозав ьл

м

З а к р еп л ят р б е ам и

ь  з а  вреш и н ам и  н окерыт е  свой ст а  та к  ж е  лкгео , ка к  закреплят ь  и х  з а . З есд ь  м ы  хи от м  з акреп и т ь  з а  вреш и н ам и  граф а  и мне а  лю йе д . enum vertex_first_name_t  { vertex_fi rstjiame  }; namespace  boost { BOOST_INSTALL_PROPERTY(vertex,  firstjiame); } Т пе р ь  м ы  може м  и сп ольз ват ь   н овы й  те г  в  ксла е  свой ст в  property  п р и  собр к е  гроафвг о  ти п а . Сю у щдле и й  ко д  (ли ст н г  14.5) показы вае т  созанд и е  гроафв г о  тип а  и  зеат м  созанд и е  о-абъкет арфг .  М ы  з ап олн яе м  рбер а  и  та к  ж е  н за н чае м и нм е а  верш и н ам . Р ебр а  павлсюятрде т   и н оф р м ац и ю  о  том , «кт о  ком у   о лж дн е » .

Лист ин

г 1 4 . 5 .  Сонзиад

е  го в ргоаф

 тип

а  и  отек б ъ

а

typedef  adjacency_list  MyGraphType: typedef  p air< int ,int > Pair: Pair  edge_array[ ll] = {  Pair(O.l).  Pair(0,2),  Pair(0,3).  Pair(0.4). Pair(2.0).  PairO.O).  Pair(2,4),  Pair O. l) . Pair(3.4).  Pair(4,0).  Pair(4.1)  }; MyGraphType G(5); for  ( int  1- 0;  i < l l ;  ++i) add_edge(edge_array[ i] .first,  edge_array[i].second,  G): property_map::tyoe name = get(vertex_firstjiame. G): boost::put(name,  0, "Jeremy"); boost::put(name.  1.  "Rich"): boost::put(name,  2.  "Andrew"): boost::put(name.  3.  " Jef f " ): name[4] = "Kinis":  / /  н ж о м о  и   та к

whoj)wes_who(edges(G).first.  edges(G).second. G):

Ф ну к ц и я   who_owes_who(),  н ап и сан а я  дл я  эогт о   п р и м ер а ,  бы л а   р еа л и з о в а н а д  за д н  комс-ал ш онлба м , та к  чт о  м ы  н е  з н еа м  рьлнае ог о в  ощбо не о м  сит ле . Вов я   ит п а  ообртажне и я   св о й т а  дл я  свой ст а   f 1 rstjrvame ит п а  граф . Д л я  н онеждах и н а м  ниодембх о   и сп о ль з о в ат ь   к л ас с   св о й ст в   ve"tex_property_map.  Т и п  const_type ф  ткаж е  являсет я  кон астой . К а к  тольк о и сп о ль з в а н  и з - з а  тог , чт о  пр-мате раг м ы  п чоилу и   и т п  ообртажне и я   св о й а т , м ы  може м   л а те с д ь   з а к л ю ч не и е   о  тип е м  п ри ме е  и знвсет о , з н а ч ен и й  свой аст , и сп оль з у я   к л ас с  property_traits.  В  н ша е я  в  као т м  ощоб не о м  сит л е чт о  ти п  з н ач ен и я  свой ст а  — std:: stri ng, н о  н ап и сан а н фу к ц и я  who_owes_who() може т   атр б о ь   и  с  дигрум и   и т п ам и  з н ач ен и й   св о й а т . К о д  фну к ц и и  п ри евд н  в  ли ст н г е  14.6. Лист ин

г 1 4 . 6 .   у н Ф цк и

я  who_owes_who()

template  void  whoj)wes_who(EdgeIter  f i r s t .  Edgelter  last,  const  Graph& G)

14.1. сал К

ы о ф раг

в zyxwvutsrqpo 2 3 3 zyxwvutsrqpon

{ //  утсоД п  к  пит у  свтсдер а  дпутсо а  к  втсйо у   л д я  эгот о  гф а р а typedef typename propertyjnap ::const_type NamePA; NamePA name -  get(vertex first name, G ) ; typedef typename boost::property_traits::value_type  NameType; NameType src_name, targ_name; while  (first !-  last) { src_name = boost::get(name, source(*first.G)): targ_name = boost::get(name. target(*first.G)); н  " cout «  src_name « " ежлод «  targ_name « " игьнед " «  endl: ++first: } }zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA а  вывиод т ю  у щдесл : Э т а   п р о гам Jeremy  ежлод н  Rich дгьне и Jeremy дежло н  Andrew дгьне и Jeremy дежло н  Jeff дгьне и Jeremy  ежлод н  Kinis дгьне и Andrew дежло н  Jeremy дгьне и Andrew дежло н  Kinis дгьне и Jeff дежло н  Jeremy  гьнед и Jeff дежло н  Rich дгьне и Jeff дежло н  Kinis дгьне и Kinis дежло н  Jeremy дгьне и Kinis дежло н  Rich дгьне и П олн ы

й   и с хо д н ы

й   ко

д  э то г

о   п ри м ер

а лд

я с пи к

а   можн

о   н ай т

и   в   фай л

е zyxwvutsrqponmlkjihgfe   interior_proper-

tyjnap.cpp.

р с о а йН т к

а рн и а х л щ

К лас и з   ти п о р еб с е л е к то р н еро к о н те й н е р н о г н е р а то те й н е р м ер о

о т енр а Г

с  ad j acen cyj  i st р е а л и з о в а в  к о н те й н е р о в  с о де р ж и р  (и , в о з м о ж н о , в хо дя щ и х ы   д л я  то г ,  ч то б в   и з  STL. Т а к ж е   ест о   ти п а .  П р р   к о н те й н е р а .  П р а   и  с в о й с тв а   п арал ель н ы м  то г , к а к  и с п о л ь з о в а т

р о е йк н т р

а с но м т еж

и

н  с  и с п о л ь з о в а н и е т   в с е  в е р ш и н )  дл я  каждо ы   п о л ь з о в а те л ь   воз м ож н ост и  н а с тр о й к и  н а с тр о й к ь   н а с тр о й к

м  дв у х  в и до в  к о н те й н е р о в . О ди ы  г р а ф , а  др гуо й   — с п и с о к   и с хо д я щ и й   в ерш и н ы . BG L п р е до с та в л я е т   клас ы ь   м о г  в ы б р а т ь   ср ед и   н еск о ль к и х   к о н те й ь   д л я  и с п о л ь з о в а н и я   с в о ег о   с о б с тв е н н о г е   VertexList  в а м  н е о б ох ди м о   о п ред ли т ь   ге е   EdgeList  н уж н о   о п р ед ли т ь   г е н е р а то р  к о н х   р еб р .  Ф а й л   container_gen.cpp  я в л я е т с я  п р и у   хр а н и л и щ а .

г 1 4 . 7 . с р еи В

х о -

а

К лас с  ad jacen cyj  1 st и с п о л ь з уе т   к лас с  с в о й с тв , н а з ы в а е м ы й  contai ner_gen, д л я  от е   к о н те й н е р н ы е  ти п ы , п р и браж ен и я   с е л е к то р о в   EdgeLi st и  VertexLi st н а  р е а л ь н ы м ен яем ы е  д л я  хр а н е н и я   гр а ф .  В е р с и я   клас а   свой ст в   п о  ум о л ч а н и ю   п ри в ед н в   л и с ти н г е   14.7 вмес т е  с  п р и м е р о м  то г , к а к  к л а с с  с п е ц и а л и з и р уе тс я   д л я  с е л к то р а   li st s. Лист ин

н

я сал к

а с во й т

в п о

у м о ан л ч и

а -

ю

namespace boost { template zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPON п е р н и о дл ж  &

2 3 4 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 14 •  Клс а ы  BGL Л ис т н

г 14.7 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   { пернио дл)ж zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA truct container_gen { }; template  truct container_gen typedef std::list type;zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONML

Дл я  и сп оль з ован и о т р  и  зе ат м  сп ец и али з и йру т Л ис т н г 14.8.   ис р е В

я  дог ру я  кс а л

о  кон йе тн ре а  н а  ва ш  вы об е   container_gen  лд я  вша ге а  стсйо в в  с о еи ц а зи л а си ц е п

р  оп елрид т о  соелкрт й  дл я ро т  ск е л

е  к-сал кел с а   (ли ст н а

г   14.8).

st r u c t  custom_containerS  {  } ;  / /   ва ш  со т кел р namespace  boost  { / /   и ц а з л и ц се п я   л д я   ш г ае в о   о р т к ес л а template  st r u c t  container_gen< custom  c ontainers,  ValueType> { typedef  custom_container  t yp e;

Му г о т  воз н и кн т у ь  сца иу т , кдго а  в ы  хи от е  и сп ольз ват ь  кон йе т ре , орыкт й и ем т  больш е  ш болан ы х  провмате , че м  птсор о  Val ueType. Н ап ри ме , в ы теzyxwvutsrqp  мжо е т е о з ха ь   п ав и с т р де ь   и т п  расплиердт я   п ам т я и  (allocator  type). Ои д н  и з  спос об в  стале д ь  эт о  — кчте о  п роп и тас ь  в  допнл иьент ы х  прамте х  в  сп це и ал з ц и и container_gen. Онд ак о  елс и  в ы  хи от е  бьолш е й  гикботс , т о  можн о  доваби т ь  ш ба ло н ы й  п армте р  к  к- усал оруктелс .  В  сю ущ дел м   д ок е  в  ли ст н г е  14.9 п окзан о , ак к  стаоз д ь  сорклет , корыт й  п оз веля т  зта д ь  рсаплие рдт ь  п амтя и  в  std:: 11 St. Л ис т н г 14.9.   и с р е В я  кс а л а  стсйо в в  с о еи ц а зи л аи сц е п й  дл я ро т  ск е л а и   пи т а  ри щнм ез а я template  > С  F > А   С > Е > D > А

: (В.С ) (B.F) (С,А ) ( С О  (D.E) (E.D) (F.A) :

г 14.12. и н а д з о С е ф ар г а (н а с и р enum { А . В . С , D. Е .  F.  N }; const char* name = "ABCDEF";

. 14.5)

typedef adjacency_matrix  UGraph; UGraph  ugCN): add_edge(B. С  ug); add_edge(B, F,  ug); add_edge(C. A.  ug): add_edge(D. E,  ug); add_edge(F, A.  ug): std::cout «  "ноба р  внишре : "; print_vertices(ug,  name): std::cout «  std::endl: std::cout «  "ноба р  рреб : ": print_edges(ug,  name): std::cout «  std::endl; std::cout «  "иынт едицн е  рарбе print_graphCug.  name); std::cout «  std::endl; Э т а  п рогам а  вы виод т  сю у щдел об а н

р

ш р не и в

об а н

р

рбе

ынт едицн А   ::value_typ e.

Di ffType

Ти

п р аз н о с т

и дл

-

я Edgelterator.

П о ум о л чан и ю : std: :it erat or_t rait s< Ed g eIt er at o r > : :differenc e_type.

л е М до

ь лд

я

К лас

с   e d ge ji st  п о д е р ж и в а е тс

дГ е

о п р е дл

К лас

с   e d ge ji st  н а хо ди тс

я   к о н ц еп ц и е

н я   в  ф а й л

с А о ц и р вн а ы

е итп

Ниж

й  EdgeListGraph.

е   п ри в ед н

е   boost/ graph/ edge_list.hpp.

ы

ы  а с о ц и и р о в а н н ы

е  ти п

а   e d ge j i st.zyxwvutsrqponmlkjihgfedcbaZYXWVUTSR

ы   к лас

ќ  graph_traits::vertex_descriptor Т и п   де с к р и п то р о в   верш и н ти п ,  ч т о   и   fir st _ t yp e  д л д л я   E dgelterator. • 

в   р еб р

я

, а с о ц и и р о в а н н ы

й  с  edge_l i st .

graph_traits< edge_list> ::edge_iterator

Т и п   и те р а то р о в д л я   и те р а то р

иц к н у Ф

, в о з в р а щ а е м ы а   р еб

и  — мд о т е Ниж

й

graph_traits< edge_list> ::edge_descriptor

Т и п   де с к р и п то р о • 

, а с о ц и и р о в а н н ы й  с  e d ge j  i st .  Э т о  то т   ж е   с а м ы я   п ар ы   st d :  :p air,  я в л я ю щ е й с я   ти п о м   з н ачен и

р  т а   ж е

й  ф ун к ц и е й  edges ( ) . К а те г о р и , ч т о  и  у   Edgelterator.

я   iterator_category

ы

е   п ри в ед н а   ф ун к ц и я  — м е то д а   к лас а  ed gej  i st. •   edgeJistCEdgelterator  f i r s t .  Edgelterator  last) С о з да е и з   ди а п а з о н

т   гр а фо в ы

й   о бъ ек т   и з zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFED   п   в ерш и н   с   р ебр ам и ,  з а д н н ы м и   в   сп и ск е   р еб р а  [first,  last).

2 5 2 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 14 •  сал К ы  BGL

иц к н у Ф

и  — н е  мд о т е Ниж

ы

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFE

ы   ф ун к ц и и  — н е  м е то д ы   клас а  edgejl  1 St. е  п р и в е д н •   st d : : pai r< edge_iterator.  edge_Herator> edges(const  edge_list&  g)

В оз вращ ае

т   п ар

у   и те р а то р о в

, о б е с п е ч и в а ю щ и

х   д о с ту

п   к  н а б о р

у  р е б е

р  г р а ф

а  с .

•   vertex_descriptor  source(edge_descriptor  e. const  ed g eJisU  g)

В оз вращ ае

т   н ач аль н у

ю   в ерш и н

а zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPON   .е

у  р е б р

•   vertex_descriptor  target(edge_descriptor  e. const  edge_list&  g) В оз вращ ае т   к о н еч н у ю  в е р ш и н у  р е б р а   .е

14.3.2.

r e v e r s e _g r a p h

reverse_graph

К лас (дв ун а п р а в л е н н о г о н о г о  гр а ф э ф е к ти в н ы

с  reverse_graph м е н я е т  м есатм )  гр а ф , э ф е к ти в н а  в ы п о л н я е тс я  з а  п о с то я н н о й   сп осо б   д л я   п о л уч е н и

им р П е

р

Пр и м е

Лист ин

р  в  л и с т и н г

е   14.16 взя

и  вохдящ и

е  и  и сох дящ и

о  тр а н с п о н и р у е  в р е м я я   тр а н с п о н и р о в а н н о г

т  и з  фай л

, та к и

я  г р а ф м  о б р а з о

е  р еб р . П о с тр о е н и м  о б е с п е ч и в а о   п р е дс та в л е н и

а  BidirectionalGraph е  о б р а щ е н я  в ы с о к о я   гр а ф .

а  exampl.es/ reverse- graph- eg.cpp.

г 1 4 . 1 6 .   б О рщ а е н и е   н па р в ле и й   бр е р  гфар а typedef  adjacencyjist   Graph; zyxwvutsrqponmlkjihgfedcbaZYXW Graph G(5); add_edge(0, 2. add_edge(l. 4, add_edge(2. 4. add  edge(4. 0.

G): G); G); G);

add edged. add""edge(2. add"~edge(3. add" edge(4.

1. G); add  edged. 3. G): 1, G); add_edge(2. 3, G); 1. G): add_edge(3. 4. G); 1. G);

st d ::c out  «  "иы н до хс й   :фраг "  «  st d : : end l; print_graph(G.  get(vertex_index.  G));

st d ::c out  «  std ::end lzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFED   «  ы"он щ еа р б й   :фраг "  «  st d : : en d l: print_graph(make_reverse_graph(G),  get(vertex_index.  G));

Эт

а   п р о гр а м

а   в ы в о ди

т   с л е дюу щ е

:

ндохси

ы 1 гф а р : 0 - - > 2 1 - - : 3 4 2 - - :ќ 13 4 3 - - > 14 4 - - > 01 ќ 

ын ещарбо

j

й  а р г ф  Л 0 -- =>zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA 1 ќ 1 2 3 4 2 - - :ќ 0 ќ 1 2 4  - -  =ќ  1 2 3

14.3.ы в о ф а Гр

м ар П т е Ниж

ы ш о бн л а е  п р и в е д

К лас те л ь н о

Гд

ь лд

р   ш аблон

а  к л а с

Ниж

Ти

п  гр а ф

, д л

я   кот рог

о   с тр о и тс

я   а д п те р

.

я и   BidirectionalGraph  и  (н е о б я з а

-

н

с   reverse_graph  н а хо ди тс

с А о ц и р вн а ы

253

а   reverse_graph.

с   reverse_graph  п о д е р ж и в а е тс я   к о н ц еп ц и ям ) VertexListGraph  и  PropertyGraph.

е о п р е дл К лас

ы

а zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

н  п а р а м е т

Bi di rGraph 

лМ е о д

е ре тп а д а

е ит п

я   в  ф а й л

е   boost/ graph/ reverse_graph.hpp.

ы

е   п ри в ед н ы   ас оц и и рован н ы е  ти п ы  к л а с а   reverse_graph. •   graph_traits::vertex_descriptor Т и п  д е с к р и п то р о в   в ерш и н , а с о ц и и р о в а н н ы х  с  о б р а щ е н н ы (Т р е б уе тс я   дл я  Graph.) •   graph_traits::edge_descriptor Т и п  д е с к р и п то р о в  р е б р , а с о ц и и р о в а н н ы х  с  о б р а щ е н н ы (Т р е б уе т с я   д л я  Graph.) •   graph_traits< reverse_graph> ::vertex_iterator Т и п   и те р а то р о в , в о з в р а щ а е м ы х   ф ун к ц и е й  vertices О . (Т р е б уе т с я   дл я   VertexListGraph.)

м  г р а ф о м

м  г р а ф о м

.

.

•   graph_traits< reverse_graph> ::edge_iterator Т и п   и те р а то р о в , в о з в р а щ а е м ы х   ф ун к ц и е й  edges О . (Т р е б уе тс я   д л я   EdgeListGraph.) •   graph_trai ts::out_edge_i  t e r a t o r Т и п   и те р а то р о в , в о з в р а щ а е м ы х   ф ун к ц и е й   out_edges(). (Т р е б уе тс я   д л я  IncidenceG raph.) • 

graph_traits::adjacency_iterator

Т и п   и те р а то р о в , в о з в р а щ а е м ы х   ф ун к ц и е й   adjacen t_vertices(). (Т р е б уе тс я   д л я   BidirectionalG raph.) •   graph_traits::directed_category П р е до с та в л я е т   и н фо р м ац и ю  о  то м , я в л я е т с я  г р а ф  о р и е н ти р о в а н н ы р и е н ти р о в а н н ы м . (Т р е б уе тс я   д л я  Graph.) •   graph_traits::edge_parallel_category

м  и л

и  н е о

-

С о бщ ает ,  п о з в о л я е т   л и  г р а ф   о с ущ е с тв л я т ь   в с та в к у   п арал ель н ы х   р еб р   (р е б е р  с  о д и н а к о в ы м и  н а ч а л ь н ы м и  и  о ди н а к о в ы м и  к о н е ч н ы м и  в е р ш и н а м и ) . Т е г и : ы   гр афо в  с  п а р anow_parallel_edge_tag  и  disallow_parallel_edge_tag.  В а р и а н т м е тр а м и   set s  и   hash_setS  в с е гд а   и с п о л ь з ую т   di sal  low_paral  1 el_edge_tag,  то г д а к а к  др уг и е  м о гу т   п оз воли т ь  в к л ю ч е н и е   п арал ель н ы х   р еб р . (Т р е б уе тс я   д л я   Graph.)

2 5 4 в а Гл • 

а 14 • с Кла

ы  BGL

graph_traits::traversal_categoryzyxwvutsrqponmlkjihgfedcbaZYXWV

К а те г о р и я   обхд а   о тр а ж а е т ю тс я   гр афо в ы м   клас ом traversal_category  и с ох дн о г (Т р е б уе тс я   д л я  Graph.)

.  Д л

,  к а к и е  в о з м о ж н ы е   в и д ы   и те р а то р о я   reverse_graph  э т о  бдеу т   то о   гр а ф .

в   п о де р ж и в а т  ж е  ти п , ч т

о  и  дл

я

•   graph_traits< reverse_graph> :  :vertices_size__type Т и п   дл

я  р а б о т

(Т р е б уе тс

м   в ер ш и

н  в  г р а ф е

.

я zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFED  VertexListGraph.)

я   дл

• 

graph_traits::edge_size_type

Т и п   дл

я  р а б о т

(Т р е б уе тс • 

ы  с  ч и с л о

ы   с  ч и с л о я   дл

м  р е б

р  в  г р а ф е

.

я  EdgeListGraph.)

graph_traits::degree_size_type

Т и п   дл (Т р е б уе тс

я  р а б о т

ы   с  ч и с л о м  р е б р , и н ц и де н тн ы я  IncidenceG raph.)

я   дл

х  в е р ш и н

е  в  г р а ф е

.

•   property_map::type property_map::const_type

Ти п   о т браж ен и с тв о   у к а з ы в а е т с н и м   и з  с в о й с т (Т р е б уе тс я   дл

иц кн у Ф

я  с в о й с т в  д л я  с в о й с т я   ш аблон н ы м   а р г му е н т о в  в  VertexProperty  и л я  Property Graph.)

и  — мд о т е Ниж

н  и  р е б р  г р а ф м   Property  и  д о л ж н и  EdgeProperty  г р а ф .

. К о н к р е тн о о   совп ад т

е  с в о й ь   с  од -

ы

е  п р и в е д н а  ф ун к ц и я  — мето д   клас а   reverse_graph. •   reverse_graph(BidirectionalGraphs,  g) К о н с т р ку т о р

ицкнуФ

. С о з да е

т  о б р а щ е н н о

и  — н е  мдоте Ниж

в  в е р ш и

е  (тр а н с п о н и р о в а н н о е

ы  кс а л

) предс та в л е н и

е  гр а ф

а  д .zyxwvut

н  гр аф

а  д .

а

е  п р и в е д н ы  ф у н к ц и и  — н е  м е то д ы   клас а   reverse_graph. •   template  reverse_graph make_reverse_graph(BidirectionalGraph&  g) В с п о м о г а те л ь н а

я   ф ун к ц и

я  д л

я  с о з да н и

я  о б р а щ е н н о г

о  г р а ф

.

•   std::pair< vertex_iterator,  vertex_iterator> vertices(const  reverse_graph&  g)

В о з в р ащ ае (Т р е б уе тс

т  п ар я   дл

у  и етр ао в , о бесп еч и в аю щ и я  VertexListGraph.)

х  доуст

п  к  м н о ж есвт

у  в ер ш и

•   std::pair< out_edge_iterator.  out_edge_iteretor> out_edges(vertex_descriptor  v,  const  reverse_graph&  g)

В оз вращ ае р еб р   в ерш и н б р а м   и с ох д н о г (Т р е б уе тс

т   п ар

я   дл

у   и те р а то р о в ,  о б е с п е ч и в а ю щ и ы  v г р а ф а  д . Э т и  и с хо дя щ и о   гр а ф . я  IncidenceGraph.)

е   р ебр

х   до с ту а   с о т в е т с в юу

п   к   н абор

у   и с хо д я щ и т   в хо д я щ и

х м  р е

-

14.3.ы в о ф а Гр •

ы zyxwvutsrqponm 255

е те р п а д

std: :pair< in_e dge _ite rator. in_edge_iterator> in_edges(vertex_descriptor v. const reverse_graph& g) zyxwvutsrqponmlkjihgfedcbaZYXW

В оз вращ ае б е р  в е р ш и н и с хо д н о г (Т р е б уе тс

т   п ар у   и те р а то р о в , о б е с п е ч и в а ю щ и ы  v г р а ф а  д . Э т и  в хо дя щ и о   гр а ф . я   дл я   BidirectionalG raph.)

х   д о с ту е  р е б р

а  с о тв е тс в юу

п   к  н а б о р т  и с хо дя щ и

у   в хо д я щ и м   р ебр а

х   ре м

•   std::pair< adjacency_iterator,  adjacency_iterator> adjacent_vertices(vertex_descnptor  v. const  reverse_graph&  g)

В оз вращ ае верш и н (Тр е б уе т с

т   п ар у   и те р а то р о в ,  о б е с п е ч и в а ю щ и ы   v г р а ф а  д . я лд я AdjacencyGraph.).

х   до с ту

п   к  с м е ж н ы

м   верш и н а

м

•   vertex_d esc riptor  source(edge_descriptor  e, const  reverse_graph&  g)

В оз вращ ае (Т р е б уе тс

т   н ач аль н у ю   в ерш и н у  р е б р я   дл я  IncidenceG raph.)

а  е .

•   vertex_descriptor  target(edge_descriptor  e. const  reverse_graph&  g)

В оз вращ ае (Т р е б уе тс

т   к о н еч н у ю  в е р ш и н у  р е б р я   д л я  IncidenceG raph.)

а  е .

•   degree_size_type  out_degree(vertex_descriptor  u. const  reverse_graph&  g)

В оз вращ ае (Т р е б уе тс

т   чи сл о  р е б р , и с хо дя щ и я   д л я  IncidenceG raph.)

х   и з  в е р ш и н

ы  и .

•   degree_size_type  in_degree(vertex_descriptor  и . const  reverse_graph&  g)

В оз вращ ае е с л и  б ы (Т р е б уе тс

т   чи сл о   р еб р , в хо дя щ и х   в   в ерш и н л  ук а з а н   с е л к то р   bidi rection alS. я   д л я   BidirectionaLGraph).

у   и . О п е р а ц и

я  до с тпу н а

,  то л ь к

•   vertices_size_type  num_vertices(const  reverse_graph&  g)

Во з в р а щ е (Тр е б уе т с

т и чс л о ве р ш и н в ар ф г я лд я VertexListGraph.)

е g.

•   vertex_d esc riptor  vertex(vertic es_size_type  n, const  reverse_graph&  g)

В оз вращ ае

т zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   п- ю   в е р ш и н у   в  с п и с к е  в е р ш и н  г р а ф .

•   std: :pair edge(vertex_descriptor  u.  vertex_descriptor  v, const  reverse_graph&  g)

В оз вращ ае (Т р е б уе тс

т   р ебр о , с о е ди н я ю щ е е  в е р ш и н я   д л я   AdjacencyMatrix.)

у   и   с  в е р ш и н о

•   template  property_map::type

й  v.

о

2 5 6 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 14 • с Кла ы  BGL

get(Property.  reverse_graph&  g) template  property_map::const_type get(Property.  const  reverse_graph&  g) zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPO

В оз вращ ае т  о б ъ е к т- о т б р а ж е н и е  с в о й с тв с тв о  д о л ж н о  с о в п а д т ь   с  о дн и м  и з  с в о й с тв VertexProperty  г р а ф . (Т р е б уе тс я   д л я  PropertyGraph.)

, ук а з а н н ы , ук а з а н н ы

й  с  п о м о щ ь х  в  ш а б л о н н о

ю  Property. С в о м   а мр гу е н т

й е

•   template  typename  property_traits::value_type get(Property,  const  reverse_graph&  g.  X x)

В оз вращ ае т   з н ачен и е  с в о й с т в а  д л я  х , г д е  х  - -  д е с к р и п т о бра . •   template  void  put(Property,  const  reverse_graph&  g.  X x. const  Va1ue& value)

р   верш и н

ы  и л

и  р е

-

Ус т а н а в л и в а е т   з н ач ен и е  с в о й с тв а  дл я  х  в  va 1 ue, гд е  х  — дескр и п то р  в е р ш и н ы  ил и р еб р а .  З н а ч е н и е   value  до л ж н о   бы т ь   п р е о б р а з уе м ы м   к  ти п у   typename  property_traits::value_type •   template  typename  property_value::type& get_property(reverse_graph&  g.  GraphProper~y):

В оз вращ ае т   с в о й с тв о , ук а з а н н о е   G raphProperty, к о т р о е   о тн о с и тс н  в  з а г о л о в о ч н о м у  о б ъ е к ту . К л а с с  с в о й с т в  property_val  ue опре д л е pending/ property.hpp.

я   к  гр а фо в м  ф а й л е  boost/

•   template  const  typename  property_value::type& get_property(const  reverse_graph&  g,  GraphProperty);

В оз вращ ае т   с в о й с тв о , ук а з а н н о е   G raphProperty, к о т р о е   о тн о с и тс н  в  з а го л в о ч н о м у  о б ъ е к ту . К л а с с  с в о й с т в  property_val  ue опре д л е pending/ property.hpp.

я   к  гр а фо в о м  ф а й л е  boost/

1 4 . 3 . 3 . f i l t e r e d _g r a p h filtered_graph

К лас с   filtered_graph  яв л яест п р ес а д т в л н и е   гр а ф .  Ф ну к ц и я- п р еид к ат ки е  верш и н ы  и  ребр а  инодсх г ба я  верш и н а , дл я  котр й  п риед кнат ро ,  лд я   корт г о   п р и е д к на т а а л ден у ы м и   в  резльиутюр щ е с о з ае д т   коп и и   и но д с х г о   рг а ф и но д сх г о   гр а ф а  долж н о   бы т

я   а п д ер о т м  дл о  граф

а  п ок аз ы ват я  фн у к ц и я  воз вращ ае

я   н фу к ц и м   п р а с в е тд л н и ,  н о   и сп оль зе у ь   о лд ь ш е   лю б о г

,  корты я   р еб

й   с о з ае д т   фи л ь р то в а н н о р   и  верш и н   о п р е л яд т ,  ка ь  в  фи льрто в ан н о м  графе . Лю я  воз вращ ае т  ло ж ь , и  лю бо е  рбе т   ло ж ь , у д уб т   п о к а з ы в ьа т с и   рг а ф .  К лас с   filtered_graph  т   с ы лк и   н а   н е ог .  В рме я   жи з н о   и сп о ль з о в ан и я  фи льрто в ан н о г

е я н е и о

14.3.ы в о ф а Гр

т   fi  ltered_graph  н е  и з м е н я е о   гр аф а   можн о   и з м ен и т о   гр а фа .

т  с тр ук тур ь   с   п омощ ь

й   ф ун к ц и о н а л ь н ы м   п р е ди к а т

,  о п р е д е л я е м ы

,  к о то р ы

г 14.17. т а ки д ер П

, щ ю й яи л е д р п о

гр а фа . О б ъ е к с т в а   и с хо д н о г тр о в а н н о г

ри м П е

у   и с хо д н о г ю   о то б р а ж е н и

ы zyxwvutsrqponm 2 5 7 zyxwvutsrqp

е ре тп а д а

о   гр а ф

, хо т я   свой ст

я   свой в   фи ль

-

р

С л е д ую щ и с я   п ри м еро в есо м . Л ис т ин

й   о бъ ек т

й   в   л и с ти н г е   14.17,  я в л я е т т   р ебр а   с   н е п о л о ж и те л ь н ы

й   о тф и л ь тр о в ы в а е , ем и

т л и рб е р

о ы н ь л е ти жо л п

м

й е в с zyxwvutsrqponmlkj

template  й  ве с  арбе ? struct positive_edge_weight {  //  ыньлетижол п positive_edge_weight() { } positive_edge_weight(EdgeWeightMap  weight) : m__weight (weight) { } template  bool  operatorO(const  EdgeS e) const { return 0  В В   - - > Е   - - >

об а н

е щ ия д о х с и

т   с л е дюу щ е р  рреб е  рарбе

р

рбе

е

: ":

реб :а

" «

:

: (А,В )  ( C D )  (D.B) :

st d : : e n d l ;

258

Гд

а zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA 14  • с а Кл ы BGL

ва Гл

е   о п р е лд

н

Кл а с

с   f ilt er ed _g r ap h н а хо д и тс

м р а т еП

ы  ш обнла

Ниж

е   п ри в ед н

е boost/ graph/ filtered_graph.hpp.

я   в  фай л

а zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDC ы   п а р а м е тр

ы   ш аблон

а  к л а с

а   fil  tered_graph.

Graph 

Г р афо в ы

EdgePredi cate 

Ф ун к ц и о н а л ь н ы й  о б ъ е к т , в ы б и р а ю щ и й , ка к и е  р еб р а  и сохнд о г о  г р а ф а  буд т  п ри свтоу в а т ь  в  о тф и л ь тр о в а н н о м  г р а ф е . Д о л ж е н  б ы т м о де л ь ю   Predicate. Т и п  а р г ум е н т а   — ти п  де с к р и п то р а  р е б р а  гр а ф . Т а к ж е  п р е ди к а т  до л ж е н   бы т ь   DefaultConstructible

VertexPredi cate 

й  ти

п  д л

ь  дл

.

Ф ун к ц и о н а л ь н ы й  о б ъ е к т , в ы б и р а ю щ и й , к к и е  в е р ш и н ы  и сохдн о г о  г р а ф а  буд т  п р и тсу с тв о в а т ь   в  о тф и л ь тр о в а н н о м  г р а ф е . Д о л ж е бы т ь  м о де л ь ю   Predicate. Т и п  а р гму е н т а   — ти д е с к р и п от р а  в ер ш и н ы  гр а ф . Т а к ж е  п р еди к а до л ж е н   бы т ь   DefaultConstructible. П о   ум о л ч а н и ю

л е д оМ

я   а д п та ц и и

:  keepal  1 (с о хр а н и т

ь   все

ь -

а н п т

)

я  •

Ко н ц е п ц и и ,  к о т о р ы е   м о де ли р уе т   filtered_graph< Graph.EP.VP> ,  з а в и с я т   о т  т и п а Graph.  сЕ л и   Graph  м о де ли р уе т VertexListGraph,  EdgeListGraph, IncidenceGraph,  BidirectionalGraph, AdjacencyGraph  и л и   PropertyGraph,  т о  ж е   с а м о е   де ла т   и   fi1tered _ graph.

с А о ц и р н в ыа Ниж

е   ит п

ы

е   п ри в ед н ы  а с о ц и и р о в а н н ы е  ти п ы   к лас а   filtered_graph. •   graph_traits< filtered_graph> ::vertex_descriptor Т и п   де с к р и п то р (Т р е б уе тс

я   дл

а   в ерш и н ы я   Graph.)

, а с о ц и и р о в а н н ы

й  с   filtered_graph.

•   graph_traits< filtered_graph> ::edge_descriptor

Т и п   де с к р и п то р (Т р е б уе тс

я   дл

а   р еб р а , а с о ц и и р о в а н н ы я  Graph.)

й  с  fi  ltered_graph.

•   graph_traits< fi1tered_graph> ::vertex_iterctor

Т и п   и те р а то р о в ж е   сам ы й (Т р е б уе тс

, в о з в р а щ а е м ы х  ф ун к ц и е , ч т о   и  д л я   и с ох дн о г о   гр а ф я   д л я   VertexListGraph.)

й  vertices О . Т и

п  vertex_ iterator  — то

т

.

•   graph_trai ts::edge_i terator

Т и п   и те р а то р о в , в о з в р а щ а е м ы х   ф ун к ц и е ц еп ц и ю   MultiPassInputlterator. (Тр е б у е тс я  д л я EdgeListGraph.)

й  edges О .  И т е р а т о

•   g r ap h_t r ait s< f ilt er ed _g r ap h> : : o ut _ed g e_it er at o r

р   м о д е л и р уе

т   кон

-

14.3. ыво ф ар Г

Т и п   и те р а то р о в к о н ц еп ц и (Т р е б уе тс

,  в о з в р а щ а е м ы х   ф ун к ц и е ю   М uItiPassl n putlterator. я   д л я  IncidenceG raph.)

е е р п ад т

й   out_edges ( ) .  И те р а то

ы

р   м о д е л и р уе

2 5 9 zyxwvutsrqpo

т

•   graph_traits< filtered_graph> ::i n_edge_i terator

Т И П   и те р а то р о в ,  в о з в р а щ а е м ы х   ф ун к ц и е й   in_edges().  И те р а то р   м о д е л и р уе к он ц еп ц и ю   MultiPassInputlterator. (Т р е б уе тс я   д л я   BidirectionalG raph.) •   graph_traits out_edges(vertex_descriptor  v.  const  filt3red_graph&  g)

В оз вращ ае в ерш и н та в л я ю (Т р е б уе тс

т   п ар у   и те р а то р о в ,  о б е с п е ч и в а ю щ и ы   v  в   г р а ф е   д . Е с л и   г р а ф   н е о р и е н ти р о в а н н ы й п   к о  в с е м   р е б р а м , и н ц и де н тн ы т   д о с ту я   д л я  IncidenceG raph.)

х   д о с ту м  в е р ш и н

•   vertex_descriptor  source(edge_descriptor  e. const  filtered_graph&  g)

В оз вращ ае (Т р е б уе тс

т   н ач аль н у ю   в ер ш и н у  д л я   д л я  I ncidenceG raph.)

я   р ебр

а  е .

•   vertex_descriptor  target(edge_descriptor  e, const  filtered_graph&  g)

В оз вращ ае (Т р е б уе тс

т   к о н еч н у ю  в е р ш и н у  д л я   д л я  IncidenceG raph.)

я   р ебр

а  е .

•   degree_size_type  out_degree(vertex_descriptor  u, const  filtered_graph&  g)

В оз вращ ае (Т р е б уе тс

т   чи сл о  р е б р , и с хо дя щ и я   д л я  IncidenceG raph.)

х   и з  в е р ш и н

ы  и .

п   к   и с хо д я щ и , э т и   и те р а то р е  v.

м   р ебр а ы   п р е до с

м -

14.3. ыво ф ар Г

е е р п ат д

ы

2 6 1 zyxwvutsrq

•   ve r t ic e s_ siz e _ t yp e  n u m _ vert ices( con st  filt ered _ grap h &  g)

В оз вращ ае

т   чи сл

(Т р е б уе тс

я   дл

о  в е р ш и

н  в  н и ж е л е ж а щ е

м   гр а ф

е  д .

я   VertexListGraph.)

•   edges_size_type  num_edges(const  filtered_graph&  g) В оз вращ ае (Т р е б уе тс

т   чи сл о  р е б р  в  г р а ф е  g. я   д л я   EdgeListGraph.)

•   template  property_map::type get(Property.  filtered_graph&  g) template  property_map::const_type get(Property.  const  filtered_graph&  g)

В оз вращ ае до л ж н гр а фа (Т р е б уе тс

т  о б ъ е к т- о т б р а ж е н и о   совп ад т

ь   с  о дн и

е   с в о й с тв м   и з   свой ст

, з а д н н ы в   в   ш аблон н о

й  Property. С в о й с тв о  Property м  а р г ум е н т е   VertexProperty

. я   дл

я   PropertyG raph.)

•   template  typename  property_traits< typename  property_map::const_type >::value_type get(Property,  const  filtered_graph&  g.  X  x)

В оз вращ ае (Т р е б уе т с

т   з н ач ен и е  с в о й с тв а   дл я   д л я   PropertyG raph.)

я   х , гд е   х  — де с к р и п то

р   в ерш и н

ы  и л

и   р ебр а

.

•   template  void  put(Property,  const  filtered_graph&  g.  X  x. const  Value&  value)

Ус т а н а в л и в а е н ы  и л с в о й с тв а (Т р е б уе тс

т   з н ач ен и . З н а ч е н и

и  р е б р а

14.3.4. Укл е т а з Graph*

е  с в о й с тв е  до л ж н

а   дл о  б ы т

я   х  в  value.  З де с ь   х  — де с к р и п то ь  п р е о б р а з уе м о  в  ти п  з н а ч е н и

р   в ер ш и я  ук а з а н н о г

о

. я   дл

я   PropertyG raph.)

ь  н а  SGB Graph

З аго л о в о ч н ы й  ф а й л  boost/ graph/ stanford_graph.hpp  и з  BG L а да п ти р еу т   Stanford G raphBase- ук а з а те л ь   (SG B)  [22]  н а   Graph в  г р а ф , с о в м е с ти м ы й   с   BG L. З а м е ти м , чт о   клас с   гр а фо в о г о   а д п те р а   н е   и с п о л ь з уе т с я ,  a  Graph* и з   SG B  с а м   с та н о в и тс я »  н и ж е ) с  п о м о де л ь ю   н еск оль к и х  г р а ф о в ы х   к о н ц еп ц и й  (с м . р а з де л   «М о де л ь   дл я мощ ь ю  о п р е д л е н и я   н еск о ль к и х  п е р е г р уж е н н ы х   ф ун к ц и й . О б я з а те л ь н о  п р и м е н я й т е  ф а й л  и з м е н е н и й  PROTOTYPES к  в а ш е й  ус та н о в к е  SG B, с  те м   ч то б ы   з а го л о в о ч н ы е  ф а й л ы  SG B с о тв е тс в о в а л и   AN SI  С  (и , з н а ч и т , м о г л и к о м п и л и р о в а ть с я   к о м п и л я то р о м  C+ + ). М ы  б л а г о да р н ы   н А др е а с у   Ш ерер у  з а  п о м о щ ь  в  р е а л и з а ц и и  и  до к ум е н ти р о в а н и и   а д п те р а   Graph* и з  б и б л и о те к и  SG B.

2 6 2 в а Гл

им р П е

а 14  •  Клс а

ы  BGL

р zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

П ри м ер ы   с м .  в   ф а й л а х   example/ miles_span.cpp,  example/ roget_components.cpp и   example/ girth.cpp.zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

ртема П

ы  шнолба

теН

а

.

Модел

ь  дл я

VertexListGraph,  IncidenceG raph, AdjacencyGraph  и  PropertyGraph. Н а б о кот ры й  м о ж н о  и с п о л ь з о в а т ь  д л я   SG B- г р а ф , да н  н и ж е  в  р а з де л ш и н   и   р еб р » .

д Г е   о п р е дл Ук а з а т е л

в  с в о й с тв

, а   в ер

-

н ь   н а  SG B Graph н а ох ди тс

с А о ц и р н вы а Ниж

р  те г о е   «С в о й с тв

е  тип

я   в  ф а й л

е   boost/ graph/ stanford_graph.hpp.

ы

е  п р и в е д н ы   ас оц и и рован н ы е  ти п ы  ук а з а те л •   graph_traits::vertex_descriptor Т и п   де с к р и п то р а  в е р ш и н Vertex* в  к а ч е с тв е   де с к р и п то р фай л е   gb_graph.h.) (Т р е б уе тс я   д л я  Graph.)

, а с о ц и и р о в а н н ы а   в ерш и н

я   н а  SG B Graph.

й  с  SG B Graph*. М ы  и с п о л ь з уе ы  (гд е   Vertex  — typedef  в  з а г о л о в о ч н о

м  ти

п м

•   graph_traits::edge_descriptor

Т и п   де с к р и п то р а   р еб р ,  а с о ц и и р о в а н н ы й   с   SG B  Graph*. И с п о л ь з уе т с я   ти boost:: sgb_edge_type. В  до п о л н е н и е  к  п о д е р ж к е   в с е х   т р е б уе м ы х   в  BG L о п е р а ц и й   де с к р и п то р а   в ерш и н ы  к л а с с   boost:  :sgb_edge и м е т   с л е д ую щ и й   к о н с т р ук то р :  sgb_edge::sgb_edge(Arc*  arc,  Vertex*  source). (Т р е б уе тс я   д л я  IncidenceG raph.) • 

п -

graph_traits< Graph*> ::vertex_iterator

Т и п   и те р а то р о в м о де л и р о в а т (Т р е б уе тс

,  в о з в р а щ а е м ы х   ф ун к ц и е ь   RandomAccessIterator. я   д л я   VertexListGraph.)

й   vert icesO .  Э то

т   и те р а то

р   до л ж е

н

ќ  graph_traits::out_edge_iterator Т и п   и те р а то р о в , в о з в р а щ а е м ы х  ф ун к ц и е й  out_edges ( ) . Е с л и те р а то р  м о де л и р уе т   MultiPassInputlterator. (Т р е б уе тс я   д л я  IncidenceG raph.) •   graph_traits::adjacency_iterator Т и п   и те р а то р о в м о д е л и р уе (Т р е б уе тс

и  EdgeLi st= vecS, э то

,  в о з в р а щ а е м ы х   ф ун к ц и е й  adjacen t_vertices().  Э то т   т у   ж е  к о н ц е п ц и ю , ч т о  и   out_edge_iterator. я   д л я   AdjacencyGraph.)

т   и те р а то

т

р

•   graph_traits::directed_category

П р е д о с та в л я е е н ти р о в а н н ы м (Т р е б уе тс

т   и н фо р м ац и ю  о  том , я в л я е тс . Т а к  к а к  SG B Graph* — о р и е н ти р о в а н н ы й я   д л я  Graph.)

я  г р а

ф  о р и е н ти р о в а н н ы , это

т  ти

м  и л и  н ео р и п  — di rected_tag.

14.3.ы в о ф а Гр

е ре тп а д а

ы

263

•   graph_traits::edge_pa г а  11 el_categoryzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQ О п и с ы в ае т  воз м жн ост и  граф а  п о  вавскт е  п арлеь н ы х  реб р  (реб р  с  ои дн а ковы м и  н ачльн ы м и  и  кон че ы м и  верши н ам и ) . Graph* и з  SGB н е  п реп встуя т н е в л ао б д и ю  пьлнеар ы х  рреб , пмо тэ у  эо т т  ти п  ием т  а  11 ow_pazyxwvutsrqponmlkjihgfedc  г а  11 el _edge_tag. (Т рсебту я  дл я  Graph.) •   graph_traits::traversal_category Graph* и з  SGB опсебчи ва т  оо хб д  мн в отжсе а  врше и н , щяоид хс х  рбе р  и  сжме н ы х  верш и н . Т аки м  образ ом , те г  когериат и  оод хб а  опле рд н  сю ущдел и м  об р аз о м : struct  sgb_traversal_tag  : public  virtual  vertex_list_graph_tag, public  virtual  incidence_graph_tag, public  virtual  adjacency_graph_tag  {  }; (Т рсебту я  дл я  Graph.) •   graph_traits::vertices_size_type Т и п   и с п о л ь зс е т у я  дл я  рбаот ы  с  коли вчсет м  врше и н  в  граеф . (Т рсебту я  дл я   VertexListGraph.) •   graph_traits::edges_size_type Т и п   и с п о л ь зсет у я  дл я  работ ы  с  коли вчсет м  рбе р  в  граеф . (Т ресбту я  дл я  EdgeListGraph.) •   graph_traits::degree_size_type Т и п   и с п о л ь зсет у я  дл я  рбаот ы  с  коли вчсет м  ищяод сх и х  рбе р  верш и н ы . (Т рсетбу я  дл я  IncidenceGraph.) •   property_map::type property_map::const_type Т и п   о бт р а ж ен и я  дл я  свой ст в  врше и н  и  рбе р  граф . С вой ст о  зсаетд я  ш ба ло н ы м  амнеоургт м  Property Tag и  олждн о  бы т ь  он ди м  и з  товге , оп и нса ы х  ниж е в  раз елд е  «С вой ст а  вреш и н  и  рбер» . (Т ресбту я  дл я  PropertyGraph.)

иц к н у Ф

и  — д о тм е к а зУ е л т

иц к н у Ф

и  — н е д мо т е Н иж

ы

ь  н а  SGB Graph фн у кц и

й  — омдте

в  клас

с  н е  и мте

.

ы

е  п ри енвд ы  фну к ц и и  — н е  мод те ы  указ елт я  н а  SGB Graph. •   std::pair vertices(const  Graph* g) В о з в щр а е т  п ра у  иорвеат , опсечби юва щ и х  ду тос п  к  н орба у  вшре и (Т рсебту я  дл я   VertexListGraph.) •   std::pair edges(const  Graph* g) В о з в р ащ ае т  п ра у  и оератв , оспбечи вюа щ и х  дуост п  к  н боар у  рбе (Т рсетбу я  дл я  EdgeListGraph.)

н  грфа

р  д .

а  д .

2 6 4 в а Гл

а 14  •  Клс а

ы  BGL

•   std::pair< adjacency_iterator.  adjacency_iterator> adjacent_vertices(vertex_descriptor  v.  const  Graph*  g) zyxwvutsrqponmlkjihgfedcba

В оз вращ ае с  в е р ш и н о (Т р е б уе тс

т   п ар у   и те р а то р о в , о б е с п е ч и в а ю щ и й  v в  г р а ф е  д . я   д л я   AdjacencyGraph.)

х   д о с ту

п   к  в е р ш и н а м

, с м е ж н ы

м

•   std::pair< out_edge_iterator,  out_edge_iterator> out  edges(vertex_descriptor  v,  const  Graph*  g)

В оз вращ ае т   п ар у   и те р а то р о в ,  о б е с п е ч и в а ю щ и в ерш и н ы   v  в   г р а ф е   д .  Е с л и   г р а ф   н е о р и е н ти р о в а н н ы й с ту п   к о  в с е м   р е б р а м , и н ц и де н тн ы м  да н н о (Т р е б уе тс я   д л я  IncidenceG raph.)

х   д о с ту

п   к   и с хо д я щ и , э т и   з н а ч е н и е  v.

й  в е р ш и н

•   vertex_descriptor  source(edge_descriptor  e, const  Graph*  g)

В оз вращ ае (Т р е б уе тс

т   н ач аль н у ю   в ерш и н у  р е б р я   д л я  IncidenceG raph.)

а  е .

•   vertex_descriptor  target(edge_descriptor  e. const  Graph*  g)

В оз вращ ае (Т р е б уе тс

т   к о н еч н у ю   в ер ш и н у   р ебр я   д л я  IncidenceG raph.)

а  е .

•   degree_size_type  out_degree(vertex_descriDtor  u. const  Graph*  g)

В оз вращ ае (Т р е б уе тс

т   чи сл о  р е б р , и с хо дя щ и я   д л я  IncidenceG raph.)

х   и з  в е р ш и н

ы  и .

•   vertices_size_type  num_vertices(const  Graph*  g) В оз вращ ае (Т р е б уе тс

т   чи сл я   дл

о   в ерш и

н  в  г р а ф

е   g.

я   VertexListGraph.)

•   edges_snze_type  num_edges(const  Graph*  g) В оз вращ ае (Т р е б уе тс

т   чи сл я   дл

о  р е б

р   в  г р а ф

е   g.

я   EdgeListGraph.)

•   vertex_descriptor  vertex(vertices_size_type  n.  const  Graph*  g) В оз вращ ае

т   и - ю  в е р ш и н

у   в  с п и с к

е  в е р ш и

н  г р а ф

.

•   template  property_map::type get(PropertyTag.  Graph*  g) template  property_map::const_type get(PropertyTag,  const  Graph*  g)

В оз вращ ае (Т р е б уе тс

т   о б ъ е к т- о т б р а ж е н и е   с в о й с тв я   д л я   PropertyG raph.)

, з а д н н ы

й   PropertyTag.

•   template  typename  property_traits< typename  property_map::const_type

м   р ебр а м я  даю т   до -

14.3.ы в о ф а Гр

е ре тп а д а

ы

265

>: :value_type get(PropertyTag. const Graph* g, X x) zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONML

В оз вращ ае (Т р е б уе тс

т   з н ач ен и е  с в о й с тв а  д л я   д л я   PropertyG raph.)

я   х , гд е   х  — де с к р и п то

р  в е р ш и н

ы  и л

и   ребра

.

•   template  void  put(PropertyTag.  const  Graph*  g.  X  x. const  Value&  value)

Ус т а н а в л и в а е н ы  ил с о т в е т с в ую щ и (Т р е б уе тс

войс С т

т   з н ач ен и е  с в о й с тв а   д л я   х  в  val ue. З де с ь   х  — де с к р и п то и   р ебр а .  З н а ч е н и е  до л ж н о   бы т ь   п р е о б р а з уе м о   в  ти п   з н а ч е н и й   PropertyTag. я   д л я   PropertyG raph.)

а  верш и

н  и  рбе

г   14.19. Тге

и  стсйо в

,

р

С т р ук т ур ы   Vertex  и  Arc и з   SG B п р е до с та в л я ю т   в с п о м о г а те л ь н ы н и я  д о п о л н и те л ь н о й  и н ф о р м а ц и и . М ы  п р е дл а г е м   BG L- о б о л о ч к и п еч и в аю т   д о с ту п   к  э ти м   п оля м   ч ер з   о т браж ен и я   с в о й с тв .  К р о м та в л е н ы  о то б р а ж е н и я  и н дек с а  в е р ш и н ы  и  дл и н ы  р еб р а . О б ъ ек -т о т б р а ж ен и може т  б ы т ь  п о л уч е н  и з  SG B Graph* при м е н е н и е м  ф ун к ц и и  get О д ы д ущ е м   р а з де л , а  ти п  о то б р а ж е н и я  с в о й с тв а   — ч е р з  к л а с с  с в о й с т т   бы т ь   и сп оль з ован ы  д л Ук а з а н н ы е   ниж е  те г и   с в о й с т в   м о гу г а те л ь н о г о   п оля , д л я   к о т р о г о   тр е б у тс я   о т бр аж ен и е   с в о й с тв Л и с ти н

р   в ерш и я  с в о й с тв а

в  дл

е   п ол

я  д л

я   рх а н е е  о б е с ,  п р е до с е  с в о й с т в , о п и с а н н о й  в  п р е в   propertyjnap. я   з ад н и я  в с п о м о а   (л и с т и н г   14.19). , к о т р ы е  то г

я   SGB Graph*

/ /   ег Т и   с во й т в  вш рнеи : template   u_property: emplate   v_property: template   w_property; template   x_property; template   y_p rop ert y: template   z_property: / /   ег Т и   с во й т в  рбре : emplate   a_property: template   b_property:

Ш аблон н ы й   п арам ет р   Т  дл я   э ти х   те го в   о гр а н и ч е н  ти п а м и  в  о б ъ е ди н е н и и  uti 1, де к л а р и р о в а н н о м   в   з а го л о в о ч н о м   фай л е   gb_graph.h  б и б л и о те к и   SG B.  П е р е ч и с л и м  э т и  ти п ы : Vertex*, Arc*, Graph*, c har* и  long. О то б р а ж е н и я  с в о й с т в  д л я  в с п о м о г а те л ь н ы х   п оле й  я в л я ю т с я   м о де л я м и   LvatuePropertyMap. О то б р а ж е н и е   свой ст в  д л я   и н де к с о в  в е р ш и н  м о ж е т   бы т ь   п о л уч е н о   с  п о м о щ ь ю те г а   vertex_i ndex_t  и   э т о   о т б р а ж е н и е   свой ст в   м о д е л и р уе т   ReadablePropertyMap. О то б р а ж е н и е   свой ст в  д л я   д л и н  р е б р   ук а з ы в а е т с я   те г о м   edge_l ength_t, и  э т о  о то браж ен и е  с в о й с т в  — м о де л ь   LvaluePropertyMap, ч е й  т и п  з н а ч е н и я  — long.

14.3.5. GRAPH  и з  бке тои лб GRAPH Ш абло н   к лас а   GRAPH  и з   LED A  м о ж е г р а ф   б л а г о да р я   п е р г р жу е н н ы м   ф ун к ц и я м boost/ graph/ leda_graph.hpp.

и   LEDA т   бы т

ь   н ап р ям у , о п р е д л е н н ы

ю   и сп оль з ова м   в  з а г о л о в о ч н о

н   к а к   BG Lм   фай л е

2 6 6 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 14  •  Клс а ы  BGLzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDC Р еали з ац и п р и   н ап и сан и

я  BG L- и н етр ф й с и  а да п те р о

ми р П е

а  дл я  к лас в  дл

я  гр а фо в ы

х  к л а с о

а  GRAPH и з  LED А  о бжсуадл в  и з  с от р н н и

х  гр а фо в ы

ь   в  р аз едл х  б и б л и о етк

е   10.3 .

р

В   л и с ти н г BG L- г р а ф Л ис т н

е   14.20  п р и в е д . г 14.20.  Рат о б

н   п ри ме а  с о  гф а р

р  р а б о т

ы   с  LED A  г р а ф о м

, к а к  е с л

и   б ы   э т о zyxwvutsrq   ыб л

м  LEDA

#include  finclude  fundef  string  //  о кр ам с   и з  LEDA int  mainO { zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA using  namespace  boost; typedef GRAPH graph_t: graph_t g: g.new_node("Philoctetes"); g.newjiode("Heracles"): g.new_node("Al arena"); g.new_node("Eurystheus"): g.new_node("Amphitryon"); typedef  propertyjnap  ::type NodeMap; NodeMap node_name_map  -   get(vertex_all.  g): graph_traits  ::vertex_iterator  vi.  vi_end; for  ( t iet vi.  vi_end)  = vertices(g):  vi  !»  vi_end;  ++vi) std::cout  «  node_name_map[*vi]  «  std::endl: return EXIT_SUCCESS: } Э т а  п р о г р а м а  в ы в о ди т   с л е дюу щ е : Philoctetes Heracles Alcmena Eurystheus Amphitryon

м ар П т е Ниж

ы  ш обнла е  п р и в е д н

а ы  п а р а м е тр



ы   ш аблон

а  к л а с Ти ш ин

п  о б ъ е к та е  в  г р а ф

Ти

п  о б ъ е к та у   в  г р а ф

Е   бр

л е Мд о

ь  дл

а  GRAPH. , п р и к р е п л е н н о г е   LED A. , п р и к р е п л е н н о г е   LED A.

о  к  к а ж до

й  в е р  -

о  к  к а ж до м

у   р е  -

я

VertexListGraph,  BidirectionaLGraph и  AdjacencyGraph.  Т а к ж е   VertexMutablePropertyGraph и   EdgeMutabtePropertyGraph д л я  тего в  с в о й с т в  vertex_al l_t  и  edge_a1 l_t, к о т р ы е  о бес п еч и в аю т  до с ту п   к  о б ъ е к та м   V и  Е  в  г р а ф е  LED A. Т и п  GRAPH та к ж е  я в л я е т с я  Рг еро tyGraph д л я  vertex_i ndex_t и  edge_i ndex_t, к о т р ы й  п р е до с та в л я е т  до с ту п   к  и де н ти фи к ац и о н н ы м  ( I D ) н о м е р а м , к о т р ы е  LED A п р и с в а и в а е т  к а ж до м у  уз л у  (в е р ш и н е ) .

14.3. ы в о ф а Гр

дГ К л ас

с А о ц и р вн а ы Н иж

е о п р е лд с  GRAPH н иодсахт

е ре тп а д а

ы

267

н zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA я   в  фай л

е итп

е   boost/ graph/ leda_graph.hpp.

ы

е  п ри невд ы  асоц и рован ы е  тип ы  клас а  GRAPH. •   graph_traits::vertex_descriptor Т и п   е с д к р и п о тр в   в р еш и н , асоц и рован ы й  с  GRAPH. Испольсзет у я  ти п  node и з   LEDA. (Т ресбту я   лд я  Graph.) •   graph_traits::edge_descriptor Т и п   е дс к р и п о т р в   р бе ,  ас оц и рован ы й  с  GRAPH. И сп оль зсету я   ит п   edge и з   LEDA. (Т рсебту я   лд я  Graph.) zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCB ќ  graph_traits::vertex_iterator , воз вращ маеы х  фн у кц и е й  vertices О . Т и п   и е р о ат в (Т ресбту я   лд я   VertexListGraph.) ќ  graph_traits::out_edge_iterator , воз вращ маеы х  фн у кц и е й  out_edges(). Т и п   и ое р а т в (Т рсебту я   лд я  IncidenceGraph.) •   graph_traits::in_edge_nterator Т и п   и ое р а т в , воз вращ маеы х  фн у кц и е й  in_edges(). (Т рсебту я   лд я  BidirectionaLGraph.) •   graph_traits::adjacency_iterator Т и п   и е р о ат в , воз вращ маеы х   н фу к ц и е й   adjacent_vertices(). (Т рсебту я   лд я   AdjacencyGraph.) •   graph_traits::directed_category Т и п   GRAPH и з  LEDA — дл я  ори ен итрован ы х  гроафв , п омэт у  зсед ь   и сп о ль з у с те я  di rected_tag. (Т рсетбу я   лд я  Graph.) •   graph_traits::edge_parallel_category Ти п   GRAPH и з  LEDA п оз в ляе т  добавлне и е  п арлеь н ы х   рбе , п оэмт у  зесд ь и с п о л ь сз ет у я   allow_paral  1 el_edge_tag. (Т рсетбу я   лд я  Graph.) •   graph_traits::traversal_category О п и с ы в а ем ы й  ти п  граф а  п авсртлеяд т   ио р е а т ы   в р еш и н , ищяод сх и х   и  во х я дщ и х  рбер , иореат ы  смжен иост . Ти п  тге а  когериат и  оод хб а   ю у с л де щ и й : struct  Ieda_graph_traversa1_category  : public  virtual  bidirectional_graph_tag.

268 в а Гл

а 14  •  Клс а

ы  BGL

public  virtual  adjacency_graph_tag, public  virtual  vertex_list_graph_tag  {  }; zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQ

(Т р е б уе тс • 

я   дл

Т и п   и с п о л ь з уе т с (Т р е б уе тс • 

я  Graph.)

graph_traits::vertices_size_type

я   дл

я   д л я   п р е дс та в л е н и я  ч и с л а  в е р ш и н  г р а ф , а  э т о   in t. я  VertexListGraph.) zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFE

graph_traits::edges_size_type

Т и п   и с п о л ь з уе т с я   д л я   п р е дс та в л е н и я  ч и с л а   р еб (Т р е б уе тс я   д л я   EdgeListGraph.) •   graph_trants::degree_size_type Т и п   и с п о л ь з уе т с (Т р е б уе тс

я   дл

я  д л я  п р е дс та в л е н и я  IncidenceG raph.)

я  ч и с л

р   гр а ф

, а  э т о  то ж

а  и с хо дя щ и

х   ребе

р  г р а ф

е   i nt.

а   — э т о   i nt.

•   property_map::type property_map::const_type

Ти п   о т браж ен и я   дл я   с в о й с т в   в ер ш и н   и  р е б р   в  г р а ф е .  К о н к р е тн о е  с в о й с тв о о  б ы т ь  о дн и м  и з   с л еюду з а д е тс я   ш аблон н ы м  а р г му е н то м   Property Tag  и  до л ж н щ их :  vertex_index_t,  edge_index_t,  vertex_all_t  и л и  edge_all_t.  Т е г и   с   «all»  и с п о л ь з ую т с я   д л я   д о с т уп а   к   о б ъ е к та м   V и   Е  г р а ф а   LED A.  Т е г и   vertex_index_t и   edge_index_t  о б е с п е ч и в а ю т  до с ту п   к  и д е н ти ф и к а ц и о н н ы м  н о м е р а м , к о т р ы е LED A  п р и с в а и в а е т   к а ж до м у   уз л у   и   р е б р у . (Т р е б уе тс я   д л я   PropertyG raph.)

иц кн у Ф

и  — д о мт е У  к л а с б ы  м о д и ф и к а ц и

иц кн у Ф

ы

а  GRAPH не т  до п о л н и те л ь н ы и  и с ох дн о г

и  — н е д о тм е Ниж

о   код

х   ф ун к ц и а   LED A)

й  — м е то д

в   (та к  к а к  э т о  п о тр е б о в а л

о

ы

е  п р и в е д н ы  ф ун к ц и и  — н е  м е то д ы   к лас а  GRAPH. •   std::pair< vertex_iterator,  vertex_iterator> vertices(const  GRAPH& g) В оз вращ ае гр а ф (Т р е б уе тс

т   п ар

у   и те р а то р о в

,  о б е с п е ч и в а ю щ и

х   д о с ту

п   к   м н о ж е с тв

у   в ерш и

н

а  д . я   дл

я   VertexListGraph.)

•   std::pair< edge_iterator.  edge_iterator> edgesCconst  adjacency_matrix&  g)

В оз вращ ае (Т р е б уе тс

т   п ар у   и те р а то р о в , о б е с п е ч и в а ю щ и я   д л я   EdgeListGraph.)

х   д о с ту

п   к  н а б о р

у   р еб

р   гр а ф

а  g

•   std::pair< adjacency_iterator.  adjacency_iterator> adjacent_verti ces(vertex_descri ptor  v. const  adjacency_matrix&  g)

В оз вращ ае см еж н ы (Т р е б уе тс

т   п ар у   и те р а то р о в ,  о б е с п е ч и в а ю щ и х   с  да н н о й  в е р ш и н о й  v г р а ф я   д л я   AdjacencyGraph.)

х   д о с ту а  д .

п   к   м н о ж е с тв

у   в ер ш и н

,

14.3. ыов фар Г

е е р п ат д

ы

269

•   st d : : p ai r< out_edge_iterator.  out_edge_iterator> out_edges(vertex_descriptor  v.  const  GRAPHS g) zyxwvutsrqponmlkjihgfedcbaZYXWVUTSR

В оз вращ ае т   п ар у   и те р а то р о в ,  о б е с п е ч и в а ю щ и верш и н ы   v  в   г р а ф е   д .  Е с л и   г р а ф   н е о р и е н ти р о в а н н ы й с ту п   к о  в с е м   р е б р а м , и н ц и де н тн ы м  в е р ш и н (Т р е б уе тс я   дл я  IncidenceG raph.)

х   д о с ту

п   к   и с хо д я щ и , э т и   з н а ч е н и

м   р ебр а м я  да ю т   до -

е  v.

•   std::pair< in_edge_iterator.  in_edge_iterator> in_edges(vertex_descriptor  v.  const  GRAPHS g)

В оз вращ ае т   п ар у  и те р а то р о в , о б е с п е ч и в а ю щ и ш ин ы   v в  г р а ф е  д . О п е р а ц и я  н е до с тпу н а р а  Di r ected  б ы л о  ук а з а н о  di rectedS, и  до с туп н (Т р е б уе тс я   дл я   BidirectionalG raph.)

, е с л

п  к  в ох дя щ и м  р е б р а м  в е р х  до с ту и  в  к а ч е с тв е  ш а б л о н н о г о  п а р а м е т а  п р и  undi rectedS и  bidi recti ona 1S.

•   vertex_descriptor  source(edge_descriptor  e, const  GRAPH& g)

В оз вращ ае (Т р е б уе т с

т   н ач аль н у ю   в ерш и н у  р е б р я   д л я  IncidenceG raph.)

а  е .

•   vertex_descriptor  target(edge_descriptor  e. const  GRAPHS g)

В оз вращ ае (Т р е б уе т с

т   к о н еч н у ю  в е р ш и н у  р е б р я   дл я  IncidenceG raph.)

а  е .

•   degree_size_type  out_degree(vertex_descriptor  u, const  GRAPHS g)

В оз вращ ае (Т р е б уе т с

т   чи сл о  р е б р , и с хо дя щ и я   д л я  IncidenceG raph.)

х   и з  в е р ш и н

ы  и .

•   degree_size_type  in_degree(vertex_descriptor  и . const  GRAPHS g)

В оз вращ ае к о  е с л (Т р е б уе т с

т   чи сл о  р е б р , в хо дя щ и х   в  в е р ш и н и  bidi rectionalS  б ы л о  ук а з а н о  в  к а ч е с тв я   д л я   BidirectionatG raph.)

у  и . Э т е  ш а б л о н н о г

а  о п е р а ц и

я  до с туп н а о  п а р а м е тр

, то л ь а  Di r ected.

•   vertices_size_type  num_vertices(const  GRAPHS g) В оз вращ ае

т   чи сл

(Т р е б уе т с

я   дл

о   в ер ш и

н  в  г р а ф

е  g.

я   VertexListGraph.)

•   edges_size_type  num_edges(const  GRAPHS g) В оз вращ ае

т   чи сл

(Т р е б уе тс

я   дл

о  р е б

р   в  г р а ф

е  g.

я   EdgeListGraph.)

•   std: :pair add  edge(vertex_descriptor  u.  vertex_descriptor  v. GRAPHS g)

Д о бав ляе лен н о г (Т р е б уе тс

о  (м , zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA  v)  к  г р а ф у  и  в о з в р а щ а е т  де с к р и п то р  р е б р а  д л я  в н о в ь  до б а в . Д л я  э от г о  гр а ф о в о г о  ти п а  л о г и ч е с к и й  ф л а г  в с егд а  беду т  л о ж н ы м . я   д л я   EdgeMutableGraph.)

т   р ебр о  р еб р а

2 7 0 в а Гл

а 14 • с Кла

ы  BGL

•   std::pair< edge_descriptor.  bool> add_edge(vertex_descriptor  u.  vertex_descriptor  v. const  E& ep. GRAPHS g) zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFE

  {и,  v)  к   г р а ф у   и  з а к р е п л я е т   з а  н и м  е р  в   к а ч е с тв е   з н ач ен и я До бав ляе т   ребр о zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA д л я   хр а н е н и я  в н утр е н н е г о   с в о й с тв а . (Т р е б уе тс я   д л я  EdgeMutabLePropertyGraph.) •   void  remove_edge(vertex_descriptor  u.  vertex_descriptor  v, GRAPHS g) Уд а л я е т   ребр о  {и,  v) и з  г р а ф . zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFED (Т р е б уе тс я   д л я  EdgeMutabLeGraph.) •   void  remove_edge(edge_descriptor  e.  GRAPHS g)

даУ л я е т   р ебр о  {и,  v) и з  гр а ф . Ф ун к ц и я  о тл и ч а е тс я  о т  remove_edge (u.  v,  g) в  сл у  я  ге ч а е  м ул ь ти г р а ф а :  д а н н а я  ф ун к ц и я  уда л я е т   о дн о  р е б р о , то гд а   к а к  ф ун к ц и move_edge(u.  v.  g) уда л я е т   в с е  р е б р а   {и,  v). (Т р е б уе тс я   д л я  EdgeMutableGraph.)zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPO

ќ  vertex_descriptor add_vertex(GRAPHS  g) Добавляе в ерш и н ы (Т р е б уе тс

т   верш и н у   к  г р а ф у   и   воз вращ ае . я   д л я   VertexMutableGraph.)

т   де с к р и п то

р   верш и н

ы   дл

•   vertexjjescriptor  add vertex(const  VertexPropertiesS p. GRAPHS g) До бав ляе т   в ерш и н у   (и  е е  с в о й с тв о ) к  г р а ф у   и  в о з в р а щ а е т  д е с к р и п то н ы   д л я  н о в о й  в е р ш и н ы . (Т р е б уе тс я   д л я   VertexMutablePropertyGraph.)

я  н о в о

й

р  в е р ш и

-

•   void  clear_vertex(vertex_descriptor  u.  GRAPHS g)

дУ а л я е та е тс (Т р е б уе тс

т   в с е  р е б р а , и с хо дя щ и е  и  в ох дя щ и е я   в о  м н о ж е с тв е   в ер ш и н  г р а ф . я   д л я  EdgeMutableGraph.)

, д л

я  да н н о

й  в е р ш и н ы

. В е р ш и н

а  ос -

•   void  remove_vertex(vertex_descriptor  u.  GRAPHS g)

дУ а л я е (Т р е б уе тс

т   в ерш и н я   дл

у   и  и з  м н о ж е с тв а   в ер ш и я   VertexMutableGraph.)

н  г р а ф

.

•   template  property_map;:type get(PropertyTag,  GRAPHS g)

В оз вращ ае т   и з м ен яем ы й  о б ъ е к т- о т б р а ж е н и е   свой ст ук а з а н н о й  с  п о м о щ ь ю   Property Tag. (Т р е б уе тс я   д л я   PropertyGraph.) •   template  property_map::const_type get(PropertyTag.  const  GRAPHS g)

в  д л

я  с в о й с тв

а  в е р ш и н ы

,

В оз вращ ае ук а з а н н о (Т р е б уе тс

в  д л

я  с в о й с тв

а  в е р ш и н ы

,

т   к о н с та н тн ы й  о б ъ е к т- о т б р а ж е н и й  с  п о м о щ ь ю   Property Tag. я   д л я   PropertyGraph.)

е  с в о й с т

14.3.ы в о ф а Гр

е ре тп а д а

ы zyxwvutsrqpo 271

template typename property_traits< typename property_map::const_type >::value_type get(PropertyTag. const GRAPHS, g. X x) zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONML В о з в р ащ ае т  з н ачен и е  свой ст а  дл я  х , гд е  х  — ескдри по т р  верш и н ы  и л и  рбреа . (Т ресбту я  дл я zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFED  PropertyGraph.) template void put(PropertyTag. const GRAPH& g. X x. const Values value) а сн т У а в л и в а е т   з н а ч ен и е  свой ст а  дл я  х  в  value. Зесд ь  х  — ескдри п от р  вреш и н ы  и л и  рбера . (Т ресбту я  дл я  PropertyGraph.)

1 4 . 3 . 6 . st d : : ve c t o r < Ed g e List > std::vector П ерз г у к а  фн у к ц и й  в  boost/ graph/ vector_as_graph.hpp длае ь  ти п  врод е  std:: vector v S  - - >  Г   Г  W

t  - - > х

-

2 7 2 в а Гл

а 14 • с Кла

ы  BGLzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGF

и   - - >  tzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

V  - - > W - - >  t X х   - - >  у У   - - >  U

Гд

е  опредл Ти

н

п   vector_as_graph  соидтхна

м ра П т е

я   в лй  фа

ы  ш боанл

Ниж

е  п р и в е д

е  boost/ graph/ vector_as_graph.hpp.

а zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

н  п а р а м е т

р  ш а б л о н

а  ти п

Container, в  к о т р о м  val ue_type п о з в о л я е т  п ре образ ован и е  к  si ze_type д л я  st d :: vector (чот б ы  з н а ч е н и я  м о ж н о  б ы л о  и с п о л ь з о в а т ь  в  ка а  в е р ш и н ы ) . е св т ч е  де с к р и п то р

EdgeLi st 

л е Мд о

ь  лд

а   vector_as_graph.

я

VertexListGraph, IncidenceGraph  и  AdjacencyGraph.

с А о ц и р вн а ы

е  тип

Ниж

ы

е  п р и в е д н ы  а с о ц и и р о в а н н ы е  ти п ы   vector_as_graph. •   graph_traits< std: :vector>:  :vertex_descnptor Т и п  д е с к р и п то р о в   в ерш и н , а с о ц и и р о в а н н ы х  с  г р а ф о м (Т р е б уе тс я   д л я  Graph.) •   graph_traits< std::vector> ::edge_descriptor иТ

.

п  д е с к р и п то р о в   р еб р , а с о ц и и р о в а н н ы х  с  г р а ф о м (Т р е б уе тс я   д л я  Graph.) •   graph_traits< std::vector> ::vertex_iterator

.

Т и п  и те р а то р о в , в о з в р а щ а е м ы х   ф ун к ц и е й   vert ices( ) . (Т р е б уе тс я   л д я   VertexListGraph.) •   graph_traits< std::vector> ::out_edge_iterator Т и п   и те р а то р о в , в о з в р а щ а е м ы х   ф ун к ц и е й  out  edges ( ) . (Т р е б уе тс я   д л я  IncidenceGraph.) •   graph_traits< std::vector> ::adjacency_iterator Т и п   и те р а то р о в , в о з в р а щ а е м ы х   ф ун к ц и е й   adjacen t_vertices(). (Т р е б уе тс я   д л я   AdjacencyGraph.) •   graph_traits< std::vector> ::directed_category х  г р а ф о в , п о э то м у   з де с Г р афо в ы й  ти п  д л я  о р и е н ти р о в а н н ы rected_tag. (Т р е б уе тс я   д л я  Graph.) •   graph_traits< std::vector> ::edge_para!lel_category Э то т  г р а ф о в ы й  т и п  поз в о л я е т  и м е т р и и   — al 1ow_paral  I el_edge_tag. (Т р е б уе тс я   д л я  Graph.)

ь  п а р а л е л ь н ы

е  р еб р а

ь   и с п о л ь з уе т с

, п о э то м

я   di -

у  ти

п  к а те го

-

14.3.ы в о ф а Гр

е ре тп а д а

ы

273

•   graph_traits< std::vector> ::vertices_size_typezyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQ Ти п ,  и с п о л ь з уе м ы й   д л я   п р е дс та в л е н и я   к о л и ч е с тв а   в ерш и н  в  г р а ф е . (Т р е б уе т с я   д л я   VertexListGraph.) •   graph_traits::degree_size_type

Ти п ,  и с п о л ь з уе м ы ш ин ы   гр а ф (Т р е б уе т с

иц к н у Ф

й   дл я   дл

т   до п о л н и те л ь н ы

иц к н у Ф

а   и с хо д я щ и

х   р еб

р   дл

я   в ер

-

ы х   ф ун к ц и

и  — н е д о тм е Ниж

я   к о л и ч е с тв

я  IncidenceG raph.)

и  — д о тм е Не

я   п р е дс та в л е н и

.

й  — м е то д

в   к лас а

.

ы

е   п ри в ед н ы  ф ун к ц и и  — н е  м е то д ы   клас а   vector_as_graph. •   std::pair< vertex_iterator.  vertex_iterator> vertices(const  stid::vector&  g)

В о з в ращ ае т  п ар у  и ертао в , о бесп еч и в аю щ и х  доуст п  к  м н о ж есвт у  в ер ш и н  гр а ф а  д . (Т р е б уе тс я   д л я   VertexListGraph.) •   std: :pair< adjacency_iterator. adjacency_iterator>  adjacent_vertices(vertex_descriptor  v. const  std::vectors  g) В оз вращ ае т   п ар у   и те р а то р о в , о б е с п е ч и в а ю щ и х   д о с ту п   к  в е р ш и н а м , с м е ж н ы м верш и н е  v в  г р а ф е  д . (Т р е б уе тс я   д л я   AdjacencyGraph.) •   std::pai r out_edges(vertex_descriptor  v.  const  std::vector&  g) В оз вращ ае т   п ар у   и те р а то р о в ,  о б е с п е ч и в а ю щ и х   д о с ту п   к   и с хо д я щ и м   р ебр а м в ерш и н ы   v  в   г р а ф е   д .  Е с л и   г р а ф   н е о р и е н ти р о в а н н ы й , э т и   з н а ч е н и я   да ю т   до с ут п   к о  в с е м   р е б р а м , и н ц и де н тн ы м  в е р ш и н е  v. (Т р е б уе тс я   д л я  IncidenceG raph.) •   vertex_descriptor  source(edge_descriptor  e. zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJ

const std::vector& g) В оз вращ ае т   н ач аль н у ю   в ерш и н у  дл я   р е б р а  е . (Т р е б уе тс я   д л я  IncidenceG raph.) •   vertex_descriptor  target(edge_descriptor  e. const  std::vectors  g) В оз вращ ае т   к о н еч н у ю  в е р ш и н у  д л я   р е б р а  е . (Т р е б уе тс я   дл я  IncidenceG raph.) •   degree_size_type  out_degree(vertex_descriptor  u. const  std::vector&  g) В оз вращ ае т   чи сл о  р е б р , и с хо дя щ и х   и з  в е р ш и н ы  и . (Т р е б уе тс я   дл я  IncidenceG raph.) •   vertices_size_type  num_vertices(const  std::vector&  g) В оз вращ ае т   чи сл о  в е р ш и н  в  г р а ф е  д . (Т р е б уе тс я   д л я   VertexListGraph.) 10  З ак

.  375

к е т о и лб Б и н е ж а рб о т ст й о в

а й в

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

в  н Бо л ь ш и н св т о   а л ог р и м т о н о т с ящ и м с я   к  вреш и н а м  и и л и  мощ н тос ь  рбрае , муго т  бы т ль е н т а г ы е  флаиг , таки е  ка к  цтев м н ог о  сп осб в  хран и т ь  э т и и  о-во ткеъб еб р р  д о  мисаво в ы ч и с л е ям ы х  п р и  н иодебмх ст ал е т й   п р а с е в тд л н и я   св о й ст

а  граф  рбрае

х   ю рб у е т м   р а гф

т  дп уост

ь  ни мдо хбе , дл я  и н идкац и  дан ы е  в  п амият , иискнавеор д ы . Д л я  оелндт и в   в ио дс т я   а р б с кт ц и я

.  Н ап ри м ер ы  дл

а   к  раз ли ч н ы м   с в о й ам т , , таки е  дан ы е , ка к  дли н а я  аолгрим тв , равн о  ка к  и  впс ом и  пщосе н и я  верш и н ы . Сещву тсе т : о т  п оле й  дан ы х  оовбък-ет вреш и н х  ныро тке м  и номксе д , и л и  свйотс , я  обощ не ы х  алогри мт в  о т  де , н аз ы ваем я zyxwvutsrqponmlkjihgfe  инме ажр бто

тйвсо^ .

Н ес к о л ь о  коргеи ат й  свой тс в  дп у отс а  пюваялостдре readable  (толь к о  четн и е) . С вой ст о  може т   ыб т в р ащ аю с т я   п о  з н ачен и ю . М н иог е  ообртажне и т  оп ьелрятсд з ач д и   (таки х , ка к  все а  ребр ) муог о тл ь к о  дл я  четн и я .

т  раз ли чн ы о  п рочи ант о

ь   о л ьт к я  свой ст

в  дл я   ка к  ообтраж ен и

writable (толь к о  з ап и сь ) . С вой ст о  може т  бы т ь  толь к о ле й  дл я  з ап и с и  пе т у й   в  древ е   п о и ск а  в  ш и р н у  яв ляест ж ен и я  свой сат , корт е  може т  бы т ь  оплнерд о  ка read/ write  (чент и е  и  з ап и сь ) . С вой ст о  може т  бы т ь  ка н о . С вой ст о  расотян и я  дл я  аолгрим т а  кчайрт ш и ка к  чент и я , та к  и  з ап и с . lvalue (1- з н ачне и )е . С вой ст о  фаикт ческ и  расп олжне н о ст ь  п очлиу т ь   н а  н ге о  ссы лку . Ообтраж ен и я  свой ст п ре ж д и о в аю т   к а к  чне т и е , та к  и  з ап и сь . Д л я   к ажо д й   к е а го т р и и  ообтраж ен и й   св о й ст в   о п р е л дн '  В щ иуы д епр ш лье»ат ) м в а т с д ер

х хья  ста , В  миргаескот и  дп у тос

, юпыиаосщв й  дицарсет а  к  на д ы

х  BGL, нокцп еи и  Димрат м  (data accessors).

я в т сс д ер а  Кю л

а п у т со д я  [24] св тс дер

е  воз м жн иост . Дан ы

 з ап и сан о к  толь к к  з ап и сан о х  пе т у

я  внод хы

х   ан д ы я  свой ст

. М аси в  риеодт я  п ри мео м  оароб т о  дл я  з ап и с . , та к  и  п рочиа т й  Дей крст ы  те рбу

о  в  п ам ят в  эот

и  и  етс й  коеграти а   е ог тв а

а  был а  дп уост

: е  воз

х в т

ь  воз мж

и  такж

е

я   р а ку с т

а  нназв а  к  свойа тс

а  Decorator («уарк м  н занв

. ы

15.1. и ц п е ц но К

и и н е ж а рб о т

й тс й о вс

в zyxwvutsrqpo 275

namespace boost { struct readable_property_map_tag { }; struct writable_property_map_tag { }; struct read_write_property_map_tag : public readable_property_map_tag. public writable_property_map_tag { }; struct lvalue_property_map_tag : public read_write_property_map_tag { }; zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONM

к о р ыт б р а ж ен и св о й ст п о ль з о в ан

П н об д

о  ксал у  iterator_traits и з  STL, етс ь  ксал с  property_traits  (ли ст н г  15.1), й   м ож е т   бы т ь   и сп о ль з в а н  дл я   вы не д и я   ас о ц и р о в ан ы х   ит п о в  оо т я  свой ст : тип а  кюл ч а  и  ти п а  з н ач ен и я , а  такж е   о г ер ик а т и   о б т р а ж ен и я . И мсет я  сп ец и ал з ац и я  property_trai ts, чоб т ы  указ елт и  млог и  бы т ь  и с ы  ка к  объкет ы  ообратжне и й  свой ст .

Л ис т н

г 1 5 . 1 . с а Кл

с property_traits

namespace boost { template struct property_traits { typedef typename PropertyMap::key_type key_type: typedef typename PropertyMap::value_type value_type: typedef typename PropertyMap::reference reference: typedef typename PropertyMap::category category; }: / / и ц а з л и ц ес п я л д я и н а во з ь с и ло п я е л тз а к у й template st r u c t p rop ert y_t rait s< T* > { typedef T valuejt yp e: typedef T& reference; typedef s t d : : p t r d i f f _t key_type: typedef lvalue_propertyjnap_tag category;

ак

к и н е ж а рб о т о

й

с во й т

в

template st r u c t p r op er t y_t r ait s< c onst T*> { typedef T value_type: typedef const T& reference; typedef s t d : : p t r d i f f _t key_type: typedef lvalue_property_map_tag category; }:

15.1. ицпе но К И н йерф т с  онжеарбоит щ бо и й  мна хеи з м  дл я  ообржанет и з н а ч ен и я , скры вая , таки и с п о л ь юз у щ и х  ообртажне и в ан и я  к  ообтраж ен и я м н е  опнлерд ы . П оскьл м ож н о  п зергуи т ь   н фу к ц и п р о и з в о ль н ы е  тип ы  ообратжне и н и й   св о й ст в   о ис т т  и

и и н е ж а рб о т й  свой тс

й тс й о в в  сио тс

т  и з  нроба

в

а  кно ц пе и й , кыро т е  оюялепдр т й  н а ю ву сщтс веиот е   ы о бк ъ е т м  озрабом и  ралеи з ац и и  оожрбанет и я  о т  аолгрим тв , я  свой ст . Д л я  обспе чн и я  больш е й  ги бкост , трбео  свой ст в  п о  ти п у  оовбъ-кет клю че й   и  з н ач ен и й  сп ец и аль н о у  опцрае и и  ожнраобе ти й  свой ст в  — гьлаонб ы е  фн у кц и , и  оображтне и я   акт , чт о  бу д у т   и с п о л ь з о вь а т с я   п оч т и й  свой ст в  и  ти п о в  клю чйе . И н ертфй с  оображте з  тер х   нфу к ц и й : get(),  put()  и  operator[]. В  ли ст н г е   15.2 я  о-во ктеъб юкл че , дал те

2 7 6 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 15 • к е  Бт о и л б и а и н е ж а рбо то й  стс й о в в zyxwvutsrqponmlkjihgfedcbaZYXWVUTS п о к аз н о ас о ц и р о в ан ы

, ка к  эт и  тр и  фн у кц и м  с  раз н ы м

Л ис т н

г 15.2.  м еи р П

и  муог

т  бы т .

и  лю ьмди

р и н а иво з ь ло пс

ь  и сп ольз ван

ы  дл

я с й е ф р е т н и

а и н е ж арбо т

я  дп уост

а   к  аасер д

я  в тсйо вс

м

а

template  void  foo(AddressMap  address) { typedef  typename  boost::property_traits:: value_type  value_type: typedef  typename  boost::property_traits::key_type  key_type: value_type  old_address.  new_address: key_type  fred = "Fred"; old_address  = get(address.  fred): new_address  = "384 Fitzpatrick  Street" put(address,  fred,  new_address): key_type  joe = "Joe": value_type&  joes_address  -  address[joe]: joes_address  = "325 Cushing Avenue":

чй е о б р та ж н е и н е вд и ю и стп м ы у о б р аж т н е и в  свои

} Д л я   о г кжа д , дл я  корты

о   о ба - ъ к е т о б р а тж н е и х  ообртажне и

я   св о й т

я  свой ст

в  дл и  ображтне и

. К он ц еп ц и х  клю че

я  ни остпмдегу

, должн .

х   п с л о ру в е д и я х

о  кюл ч й  свой ст я  и л и  м оид ф ц и сяетру а   к а зу ы в а т

й  созсаетд е  свой ст

б е н о иО ч з а

в   и с м те

я   н аб о

е  н а  оыбъкет - з н ачне и

х   ю лк . Вы з о

. Ф ну к ц и я й  н або

т  к  н оепнл рд ом , ка к  эт о  мн вожсте , корта я  и сп оль зе у р  доипстмуы х   юк л ч е

а  п ри вод в  н е  опюляе рд т

ь   о ж и м еа ы д

р  диопстмуы

я  оп ленрд о

-

в  фн у кц и

и у  п о о  д о т й

я

В   с л е д юу щ и

х   р а з де л а •   аМР

р  — ти

•   ша р

р  — о б ъ е к

х   и сп оль з ован п  о то б р а ж е н и

ы  та к и я   с в о й с тв

т   о т браж ен и

е  о б о з н а ч е н и я

:

; я  с в о й с т

в  ти п

а р  Ра М

;

•   key — ке объ

т  тип

а  property_traits: :key_type;

•   val — ке объ

т  тип

а  property_traits: :value_type.

1 5 . 1 . 1 . Re a da ble Prope rt yM a p К о н ц еп ц и нию , а с о ц и и р о в а н н о м get О  в о з в р а щ а е

о н ечт и У

я   ReadablePropertyMap п р е до с та в л я е у  с  да н н ы м  к л ю ч о м т   коп и ю  о б ъ е к та - з н а ч е н и я

т   д о с ту , ч е р .

з  в ы з о

п   п о  ч те н и в  ф ун к ц и

ю  к  о б ъ е к т-у з н а ч е и  get( ) . Ф у н к ц и

е  дл я CopyConstructibLe

с А о ц и р н в ыа

е   ит п

Ниж

ы

е  п р и в е д н ы  а с о ц и и р о в а н н ы е  ти п ы  к о н ц е п ц и •   property_traits::value_type Ти

п   с во й а т

.

и  ReadablePropertyMap.

я

15.1. и ц п е ц но К

и и н е ж а рб о т о

в zyxwvutsrqpon 2 7 7 zyxwvutsrq

й тс й о вс

•   property_traits::reference Ти п ,  п р е о б р а з уе м ы й   к  ти п у  з н а ч е н и я . •   property_traits::key_type Т и п   о б ъ е к та - к л ю ч а ,  и с п о л ь з уе м о г н и е   свой ст в  м о ж е т   бы т ь   п а р а м е тр и з о в а н э то т  ти п  м о ж е т   бы т ь   void.

о  д л

я   п ои ск

а  з н а ч е н и о  п о  ти п

у   к лю ч а

я  с в о й с тв а , в  н е к о т р о

.  О то б р а ж е

м   с л уч а

е

•   property_traits::category

К а те г о р и

я   с в о й с тв а

о п ус Д и т м ы

: ти п

е  вени ыржа

, п р е о б р а з уе м ы

К он ц еп ц и

я

я   ReadablePropertyMap  и м е •   getCpmap,  key) В оз вращ ае С е м а н ти к а

й   к   readable_property_map_tag.

т   ти п : п о и с

т   о дн

:  reference. к  с в о й с тв а   о б ъ е к та

о  до п ус ти м о

е   в ы раж ен и е

, а с о ц и и р о в а н н о г

.

о  с  к л ю ч о

м   key.

1 5 . 1 . 2 . Writ a ble Prope rt yM a p К он ц еп ц и ас оц и и рован н ы

о н тч е и У

я  WritabLePropertyMap  и м е й  с  да н н ы м  о б ъ е к то м - к л ю ч о м

т  в о з м о ж н о с т

ь   п ри сваи ват

ь  о б ъ е к т- з н а ч е н и е

,  п о с р е дс тв о

м   ф ун к ц и

, и  put О .

е  дл я CopyConstructible

с А о ц и р вн а ы

е  тип

Ниж

е   п ри в ед н

ы

ы   ас оц и и рован н ы

е  ти п

• 

property_traits::value_type

•  Ти п ни е э то • 

п   с во й а т . property_traits::key_type   о б ъ е к та - к л ю ч а ,  и с п о л ь з уе м о г о  д л   свой ст в  м о ж е т   бы т ь   п а р а м е тр и з о в а н т  ти п  м о ж е т   бы т ь   void. property_traits::category

Ти

К а те г о р и

о п с у и мД т ы

я   с в о й с тв а

: ти п

е  вени ыржа

К он ц еп ц и

ы  к о н ц е п ц и

и  WritablePropertyMap.

я   п ои ск

а  з н а ч е н и о  п о  ти п

, п р е о б р а з уе м ы

у   к лю ч а

я  с в о й с тв а , в  н е к о т р о

.  О то б р а ж е

м   с л уч а

е

й   к   writable_property_map_tag.

я

я   WritablePropertyMap  и м е

т  о дн

о  до п ус ти м о

е   в ы раж ен и е

.

•   put(pmap.  key.  vai) В оз вращ ае С е м а н ти к а

т   ти п : п р и с в а и в а е

: void. т   val  с в о й с тв у

,  а с о ц и и р о в а н н о м

у  с  к л ю ч о

м   key.

1 5 . 1 . 3 . Re a dWrit e Prope rt yM a p К он ц еп ц и я   ReadWritePropertyMap  ут о ч н я е т   кон ц еп ц и и   WritablePropertyMap.  ReadWritePropertyMap  т а к ж е   до б а в л я е

и   ReadablePropertyMap т   тр е б о в а н и е ,  ч т о б ы

2 7 8 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA вал Г а 15 •  Бкеиболт а   е н и о бт р жа й   с во й т в p r o p e r t y_t r ait s< PA> :  :c ateg ory  и м е л pertyjnap.

15.1.4.

й   к   r ead _wr it e_p r o -

,  п р е о б р а з у е м ы

L v a l u e P r o p e r t y M a pzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJ

т   у о стд п   к  ссы лк е  н а   об-ъкет свой т о я   LvaluePropertyMap  обсеп чи вае и  оа кътбе , ка к  в  get ()).  LvaluePropertyMap мжое т  бы т ь  и з мне яо й  и  не . И з м ен яем а я  Lval uePropertyMap воз вращ ае т  ссы лку , тдог а  ка к  ниезм я  — ссы лк у  н а  кон асту .

К о н ц еп ц и (вмсте и з м ен я м о й н яе м а

о  коп и

о н ечт и У

е  дл

я

ReadablePropertyMap дл

с А о ц и р н вы а

я  н ие з м не мяой

е  тип

Н иж

а   ти п

, ReadWritePropertyMap  лд

я  и з м ен ям ой

.

ы

е  п ри невд ы  асоц и рован ы е  тип ы  кон ц пе ц и •   property_traits::reference

и  LvaluePropertyMap.

С сы ло ч н ы й   ит п н а   val ue_type ообтраж ен и

й   ил

, корты

й  долж е я  свой ст

н   бы т .

ь   с ы лк о

и   к о н ас н т о

й  ссы лко

й

•   property_traits::category

К о ег р и а т

о п с иу м т Д ы

я  свой сат

: ти п

е  вени ыржа

К о н ц пе ц и

, п роебмазыу

я

я   LvaluePropertyMap  и ме •   pmap[key] В о з в р ащ ае С ем а н и т к а

15.2. с а л К

т  ти п : п чоаелу

й  к   lvalue_property_map_tag. т  он д

о  диопстму

:  reference. т   с ы лк у  н а  свой ст

ы ине  ож арбо т

е  вы раж ен и е

, и енд ит ф ц и рован о

.

й  стсйо в

е  кюл чом

.

в

15.2.1.  propertyjraits property_tratis К с ал и пт а ч ан и ю п о а р в с е д лт я

ит п о

с   property_traits  паволсерятд т   ан м х е и з м   лд я  дп уост а   к  асоц и рован ы м м  онжароеб ти я  свой тс . Н псец и ла з и ронва а я  (и пс оеьлз у т  з н чае и я  п о  умол )  верси я   к л ас а   property_traits  п рдеоталг ,  чт о   обртажне и е   св о й ст а т   о п е лр н д и я  дл я  вес х  асоц и рован ы х  ти п ов .zyxwvutsrqponmlkjihgfedcbaZ namespace boost { template  struct property_traits { typedef typename PA::key_type key_type; typedef typename PA::value_type value_type; typedef typename PA:reference reference; typedef typename PA::category category: }; }  //  namespace boost З а дн и е  ти п а  category  олдж н о   ыб т ь   о п н ле рд и е м   л д я   н од г о   и з   ю у щ д е лс и х в  и л и  тип а , корты й  не уасдл т   и з  он д ог о  и з  сю у щдел и х  ти п о в :

15.2. сал К

ы

е н о и т б р аж

й с во й т

в zyxwvutsrqpo 279

namespace boost { struct readable_property_map_tag { }: struct writable_property_map_tag { }: struct read_write_property_map_tag : readable_property_map_tag. writab1e_property_map_tag { }; struct lvalue_property_map_tag : read_write_property_map_tag { }; } / / namespace boost zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

Част о   ду о б н key_type  я в л я е т с t y_ t r a it s  и  п е р е г р уз к Лист ин

о   и сп оль з оват я   ц ело ч и слен н ы

ь   ка

ь   ук а з а т е л а   ф ун к ц и

г 1 5 . 3 . п еСц и л а з

к  о б ъ е к т- о т б р а ж е н и . Т а к а й   п ри в ед н

м   см ещ ен и ем й  о то б р а ж е н и я

дл

е   с в о й с тв я   сп ец и али з ац и ы  в  л и с ти н г

я property_traits и пер г узк

а у н цк и ф

namespace boost { tempi ate struct property_traits { typedef st d : : p t r d if f _t key_type: typedef T value_type: typedef value_type& reference; typedef lvalue_property_map_tag category; }: template void put(T* pa. std: :ptrdiff__t k. const T& val) { pa[k] = val; } template const T& get(const T* pa, st d ; ; p t r d if f _t k) { return pa[ k] : } template T& at(T* pa. st d : : p t r d if f _t k) { return pa[ k] ; } } // namespace boost

м ра П т е

ы ш о бн л а

К лас

а

с   property_ traits  и м е

т   о ди

н  п а р а м е т

р   ш аблон а

.

•   PropertyMap

Ти

п   о бт р а ж ен и

я  свой ст

д Г е   о п р е лд Кл а с

.

н

с   p r o p e r t y_t r ait s  н а хо д и тс

од М т е

я   в  фай л

е  boost/ property_map.hpp.

ы

Ниж

е  п р и в е д н ы  м е то д ы   клас а   property_ traits. •   property_traits::key_type п   -а о б ъ к е т к л ю ч а

Ти •  Ти

,  и сп ольмез гу

о  дл

я  п ои ск

property_traits::value_type п   с в о й с тв а

.

•   p r o p e r t y_t r ait s :  r ef er enc e Сс ы лк • 

Те

а  н а  ти

п  з н а ч е н и я

.

p r o p er t y_t r ait s: : c at eg o r y

г  коеграти

и  ообтраж ен и

я  свой ст

.

а  свой аст

.

й

я  д л я  ргоре е  15.3.

, то г д

а -

2 8 0 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 15  • к е  Бт о и л б и а и н е  ож а рбо т й  тс й о вс в 15.2.2.

i t e r a t o r _p r o p e r t y _m a p

iterator_property_map zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQ

т   оболоч к у   д л я  ти п а , м о де л и р ую щ е г о   Ran • д а А п те р  i terator_property_map  с о з да е domAccessIterator  д л я  с о з д а н и я   LvaluePropertyMap.  Э то т  а да п те р   част о  п о л е з е н  д л я с о з да н и я   о т браж ен и я   свой ст в   и з   м ас и ва ,  гд е   к л ю ч о м   я в л я ю тс я   ц елы е   ч и сла см ещ ен и я   о т   н ач ал а   м ас и ва ,  а   м а с и в   с о де р ж и т   о б ъ е к ты - з н а ч е н и я .  К о гд а   ти п к лю ч а   — ц е л ы й , м о ж н о   п рост о   и сп оль з оват ь   identity_property_map  д л я   п а р а м е т е   п р и де тс я   п р е до с та в и т ь   о т браж ен и е р а   ш аблон а   IndexMap. В   п р о ти в н о м   с л уч а с в о й с тв , к о то р о е   п р е о б р а з уе т   клю ч   в  ц е л о е . Н а п р и м е р , г р а ф   м о ж е т   и м ет ь   в н ту рен н е е  с в о й с т в о   д л я   ve r t e xj  ndex_t, к о т р о е  м о ж е т   бы т ь   п о л уч е н о   п ри м ен ен и е м клас а   property_map.

им р П е

р

П ри ме

р  в  л и с т и н г

е   15.4 де м о н с тр и р уе

г   15. 4.   П ир ме

и с Л тн

т   с о з да н и

р  соз анд и

я   о бт р а ж е н и

е  о то б р а ж е н и я   св о й ст

я  с в о й с т

.zyxw

в  и з  м а с и в а

в

finclude  #include  zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

int mainO { using namespace boost; double x[] = { 0.2. 4.5. 3.2 }: iterator_property_map   pmap(x); std::cout  «  " x[ l]  = "  «  get(pmap,  1)  «  std::endl: put(pmap.  0.  1.7); std;:cout  «  "x[0]  -   "  «  pmap[0] «  std:;endl: return  0; } д   б д еу

В ы во

т   с л е д ую щ и й

:

x[l]  -   4.5 x[0]  =   1.7

Гд

е  опрелд да А п е т

н р   iterator_property_map  н а хо ди тс

м ар П т е

ы   ш об н л а

Ниж

е  п р и в е д н

я   в  ф а й л

е   boost/ graph/ property_map.hpp.

а ы   п а р а м е тр

ы   ш аблон

а  а да п те р

а   iterator_property_map.

I terator 

а д п А и т ер м у ы й   ит п  и етр ао RandomAccessIterator

IndexMap 

О то б р а ж е н и е   с в о й с тв клю ч а   в  ц е л о е   см ещ ен и е ReadablePropertyMap

Т  

. Д о л ж е ,  к о т о р о . Д о л ж н

н   м о ед л и р о в а т е   п р е о б р а з уе о   бы т

ь т   ти ь   м о де л ь

Т и п  з н а ч е н и я   и те р а то р а . П о   му о л ч а н и к Л ру е п а т е std::iterator_traits< Iterator> ::value_type

п ю

15.2.с а Кл

лМ е о д ь лд я LvaluePropertyMap с А о ц и р вн а ы

е ит п

Вс

е  дл

иц к н у Ф

, тмеырбу

и — д о тм е Н иж

иц к н у Ф

н и ст Л

ы я  LvaluePropertyMap.

ы

ы

е  п ри невд ы  фн у кц и и  — н е  одмте ы  аапредт а  iterator_property_map. •   template  •   iterator_property_map •   make_iterator_property_map(Iterator  it er, •   IndexMap indexjnap) С о з ат д ь  ообртажне и е  свой ст в  иореат .

15.2.3. Тге В  ли ст н г

в 2 8 1 zyxwvutsr

е  п ри енвд ы  фну к ц и и  — одмте ы  аапредт а   iterator_propertyjnap. •   iterator_property_map(Iterator  iter  -   IteratorO,  IndexMap  indexjnap  = IndexMapO) К о н к р ст у . •   template  •   reference  operator!  ](Key k) const; Вощзвра *теа (ite r  +•   get (indexjnap,  k)).

и  — н е  мд о т е Н иж

й тс й о в

Ти п  ссы лк и  иореат . П о  умолчан и ю : typename std::iterator_traits::reference



е  ти п ы

ы и н е ж а рб о т

и  стсйо в

е  15.5 п ри невд г  15.5.  г еТ и  стйосв namespace boost {

в ы  тге в

и  дл

я  н оркыет

х  свой ст

в  BGL.zyxwvutsrqponmlkjihgfedc

enum  vertex_index_t  {  ve r t e xjn d e x  = 1 } :  \ \   к е д ни с  н ш и р е в ы \ \   к е д ни с   рб е р а enum  edge_index_t  {  edgejindex  = 2 } ;  \ \   м и я  ррб е а enum  ed g ejiam ej;  {  edgejiame  =  3  } ;  enum  edge_weight_t  {  edge_weight  =  4  } ;  \ \   е в с  рр б е а enum  vertex_name_t  {  vertex_name  =  5  } :  \ \   м и я н  вш и р е ы \ \   м и я  гф а р а enum  graph_name_t  {  graphjiame  =  6  } :  enum  ve r t e xjjist an c e J :  {  vertex_distance  = 7 } :  \ \   и н о ся а р т е  н ш и р е в ы \ \   евц т  н ш и р е в ы enum  ver t ex_c o lo r _t  {  vertex_c olor  =  8  } :  \ \   н еп с т ь  н ш и р е в ы enum  vertex_degree_t  {  vertex_degree  =  9  } ;  enum  vertex_in_degree_t  {  vertex_in_degree  =  10  } : \ \   н еп с т ь   ншир е в ы   п о щ и я д о х в м  а р б е р м zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQ   о л еж р и п о н д  #

2 8 2 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 15 • к е  Бт о и лб и а и н е  ож а рбо т й  стс йо в в Л ис т н

г 15.5 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA  { пернио дл)ж enum vertex_out_degree_t  {  vertex_out_degree = 11 };

\ \  пенс т ь   нш ир е в ы   п о  щ и я д о х с и м  а р б е р м enum  vertex_disc over_time_t  {  vertex_discover_time  =  12  } : \ \  м е р в я   и нщ е с о п я  н ш и р е в ы enum  vertex_finish__time_t  {  ver t ex_f inish_t im e  - 1 3  } : zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONML

\\  мерв я  оиначок } namespace boost {

я  октобар

и   нишрев

ы

\\  сунаотви ь   с во й т о BOOST_INSTALL_PROPERTY(vertex,  ind ex); B00ST_INSTALL_PROPERTY(edge.  ind ex); BOOSTJNSTALL_PROPERTY(edge.  name);

15.3.  и н а д зо С и н е ж а рб о т

е и ск ь л е т ав поз ь ло й  стсйо в

х в

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIH

Г л ав н ы м   н а з н а ч ен и е м   и н ер тф й с а   о б рт а ж е н и и г бк о ст и  обощ не ы х  алогри мтов . Э т о  п оз в ляе м ож н ы м и  сп осбами , в  т о  ж е  врме я  п роаевдстля ю Су щ д л е и й   р аз е д л   р еж со ид т   п ри м е р  и сп оль з ован и ап ц д т и и  к  сортн е й  граофв й  би бл кеот е д л   14.3.4).  П осл е  эог т о   м ы  расмриот м   р ае л и з а ц и п о л ь з в ан и е м  std: :map.

15.3.1. Ои н е ж арбо т

я  стсйо в

в  дл

й   св о й ст т  хран и т я  аолгрим ат

в   я в л я е ст ь  свой ст

я   п о в ы ш не и а  мн оиг м и  воз м  общ и й  и н ерфтй с я  ообртажне и й   св о й т в   лд е  Stanford  G raphBase (SG B) (см . раз ю  ообртажне и я   св о й т в   с  и с

е . я -

я  Stanford GraphBase

епат д А п у о ст д ы с ев а о б р т а ж не и

р  BGL дл я   Stanford  G raphBase вкюл чеа т   в  сбе я  ообртажне и е   св о й т в  дл я а  к  раз ли ч н ы м  п оля м  суктр р  Vertex и  Arc и з  SG B. В  эо т м  разелд е  м ы  оп и м  он д у  и з  сорт н  реали з ац и и  аапредт а  SGB в  качвсет е  п ри м ер а  реали з ац и и й  свой вст . SGB  и сп оль зе у т  сю ущдел у ю р суктр у  Vertex дл я  хран е и я  и н офрм ац и и  о  вре ш ин а х  в  граеф . Указелт ь  arcs  — свзя н ы й  сп и ос к  ищяод хси х  реб р  врше и н ы . Пол е name и  вортепс н ы е  п ол я  о т  и  д о  z — свой ст а  врше и н ы  (uti 1 — эт о  ои бдъен н и е   C+ +  (union), п оз в люя щ е е  хран и т ь   р аз ли ч н ы е  сщ у н ост и   в  верш и н е) . Эо т т р аз е д л  оп и сы вате , ка к  созатд ь  оображтне и е  свой ст в  дл я  дп уост а   к  п ол ю  name.

ци Эт ны ко ж не и е

typedef  struct  vertex_struct  { struct  arc_struct* arcs: char* name: util  u,  v.  w.  x.  y.  z; } Vertex; О сн о в н а я  и ед я  реали з ац и и  эогт о  ообртажне и я  свой ст в  — оп елрнд и й   operator[](), get()  и  put() в  трем и н а х  дп у отс а   к  маод те м   р ук т с у  работ у  п рощ е  слеатд ь  с  п омщ ь ю  ксал а  put_get_hel per, в  корт   put() и  get О  пво тс дре м  operator[]. Сьленовтад , ос теа я  раели з оват   о п ре а ц и ю  operator^]. К ром е  тог , асоц и рован ы е  ти п ы , тмеырбу м  свой ст , такж е  должн ы  бы т ь  опнлерд ы .

е  фн ук ы   ан д ы х м  раели з ова ь  тьло е   а р бо т

. -

15.3. и н а д з о С

е и кс ь л е т а в о з ь л о п

х и н е ж а рб о т о

й тс й о вс

В  ли ст н г е  15.6 пнеирдв а  раели з ац и я  sgb_vertex_name_map.  М ы  и пс еоьлз у put_get_hel per (о н  оел пдр н  в  boost/ property_map.hpp) дл я  упорщ не и я  снаозди о б р ж а тн е и я  свой ст . М ы  рилае з у м   operator^] О , a put_get_hel per рлиае з у и  get(). П ревы й  анме- утгр и т п  в  ш нолба е  ксал а  put_get_hel per — и т п  воз щвра мео г о  з н ачен и я  дл я  operator[], коры т й  в  н ша е м  сча ул е  етс ь  char*. Вор т й и т п   м ас ог о  ообржанет и я  свой ст . Ти п  reference  ожлед н  дйевильстн о кой , тольк о  есл и  онжаробе ти е  свой тс в  дожлн о  бы т ь  Lval uePropertyMap. В ча е  м ы  сеаоз д м   ReadablePropertyMap. Ае пат д р  SGB и сп оьлез у т   Vertex* дл орт а  вреш и н ы  vertex_descriptor  афрг , та к  чт о  эт о  key_type ообржанет и н и ст Л г  15.6.   ицзла Ре я  sgb_vertex_name_map class sgb_vertex_name_map : public put_get_helper< char*, sgb_vertex_name_map > { public: typedef boost::readable_property_map_tag category: typedef char* value_type: typedef char* reference: typedef Vertex* key_type; reference operator[ KVertex* v) const { return v- >name; } }:

15.3.2.и н е ж арбо т О

е тс й о в

в zyxwvutsrqpo 2 8 3 zyxwvuts

м  ксал с я  эго т о т   put О

 амне ург т  —  бы т ь  сыс л  н ша е м  сул я  дскери п я   св о й т .zyxwvut

в и з std::map

В  п ыщрдеу м   п ри м е е  о-бъкет обржатне и е   св о й т в  н е  нслажд у я   в  сранох е и -о гк а и л б о  сноя тс и я , а т к  ка к  о- ткеъб зн чеаи е  мо г  быт ь  печ уло н  ннев тс дперо п о  кюл чу . Та к  быеав т  н е а вд гес . Оыб нч о  кю л ч  исптеьолз у я  дл я  п ио кс а  о-а ткеъб зн а ч ен и я  в  н коерт й  всп омлеьантг о й  ср укт е  дна ы х .  Очвеин д ы м   к ан ио д т н а  таку ю  ср укт у  яв ляест я  std:: map. Ообртажне и е  свой ст , корт е  и сп оль зе у std: :map в  квачсет е  реали з ац и , нс таежду я   в  хран е и и  указ елт я  н а  эо т т  асоц и а ит в н ы й   к о н е йт н е р . М ы  слеад и   и т п   к о н ей т н ер а  п армоте м   ш б а ло н , та к   чт о тб р а ж е н и е   св о й ст в  може т  бы т ь  и сп оль з ован о  с  дигру м и   к о н ейт н ер а м и , атк и м и   к а к   hashjnap.  К он ц еп ц и я ,  оп и сы ваю щ а я   а кт о й   в и д   к о н ей т н ер а , н аз ы в аест UniquePai rAssociati veContainer  (ли ст н г   15.7). Л ис т н г 15.7. и ц а з и л а е Р я associative_property_map template class associative_property_map : public put_get_helper< typename UniquePairAssociativeContainer::value_type::second_type&. associative_property_map > { zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA typedef UniquePairAssociativeContainer C; public: typedef typename C::key_type keyjtype; typedef typename C::value_type::second_type value_type; typedef value_type& reference: typedef lvalue_property_map_tag category: associative_property_map() : m_c(0) { } associative_property_map(C& c) : m_c(&c) { } reference operator[ ](const key_type& k) const { return  (*m_c)[k]; }

и о м т о я

ы н ь л е тм о с пВ а г о нк ц е п и и цинк фу

е ,сал к и

16.1. Buffer К он ц еп ц и м е н ты т р е б уе в   кот ро ч ен и я

ы

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

я   Buffer  (б у ф е р )  — э т о   н е ч то , в о  ч т о   м о ж н о   п о м е с ти т , а  з а те м   уд а л и т ь .  К о н ц е п ц и я  Buffer  и м е т   о ч ен ь  м а л т   к ак о го - т о   о п р е де л е н н о г о   п о р я дк а   хр а н е н и я   э л е м е н то м  о н и  уд а л я ю т с я .  О д н а к о  о б ы ч н о  и м е тс я   н е к о то р о .

б е н о иО ч з а

ь   н ек от ры о  т р е б о в а н и й в   ил е  п р а в и л

е  э л е . О н и   п о р я дк а о  уп о р я д о

а  н е , -

я В  да н н о

й  г л а в В  — ти п Т  — ти

е   б ду

т   и сп оль з ован

, м о де л и р ую щ и я  э л е м е н то т   ти п

инавоберТ

е   о бо з н ач ен и я

:

й   Buffer;

п  з н а ч е н и

t  — о б ъ е к

ы  с л е дую щ и в  В ;

а  Т .zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

я Ч то б

ы  ти

п  м о де л и р о в а

л   Buffer, о н  до л ж е

н   и м ет

ь  с л е дую щ и

е   м е то д

ы   к лас а

.

•   В : :value_typ e

Ти

п   о б ъ е к та

, хр а н и м о г

о   в  б уф е р е

. Т и

п  з н а ч е н и

я  до л ж е

н   бы т

ь   Assignable.

•   B::size_type

Без з н ак о в ы

й   ц елы

й  ти

п  д л

я   п р е дс та в л е н и

я  ч и с л

а   о б ъ е к то

в   в   б уф е р е

.

•   b.push(t)

В с та в л я е •   .Ь ро

т   t  в  б уф е р

.  П р

и  э от

м   b. size О   ув е л и ч и в а е тс

я   н а  е ди н и ц у

.

О

Уд а л я е т   о бъ ек т   и з   Buffer.  Э т о  то т   с а м ы П р и  э то м  b. s i ze ()  ум е н ь ш а е тс я   н а  е ди н и ц у П р е д ус л о в и е :  b. empty ()  — л о ж ь .

й   о б ъ ек т

,  к о т р ы .

й   воз вращ ае

т   b.t o p( ) .

16.3. MultiPassInputlterator zyxwvutsrqpon 285 •   b.topOzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

В оз вращ ае П р е д ус л о в и е

т   с ы лк

у   (и л и  к о н с та н тн у : b. empty ()  — л о ж ь

ю  с с ы л к у

) н а  н е к о т р ы

й  о б ъ е к

т  в  б уф е р е

.

т   э к в и в а л е н те

н   b. size( )  ==  0.

.

•   b.sizeO

В оз вращ ае И н вари ан т

т   чи сл о  о б ъ е к то в   в   б уф е р е : b. size О   >=  0.

.

•   b.empty()

Ти

п   в о з в ращ аем о г

и ран т Г

о   з н ач ен и

и  сно с тл ж

Дл

я   к он ц еп ц и

я  — bool. Р е з ул ь та

и и  Buffer  и м е ю тс

я   с л е д юу щ и

•   pushO, pop()  и  sizeO  д о л ж н о т  р а з м е р а   б уф е р а . •   top О  и  empty ( ) до л ж н

л Ме од

е   г а р а н ти

и  с л о ж н о с ти

ы   в ы п о л н я ть с

ы  в ы п о л н я ть с

я  н е  б о л е

. е  ч е м  з а  л и н е й н о

я  з а  а м о р ти з и р о в а н н о

е  в р е м

е  п о с то я н н о

я

е  в р е м я

.

и

std::stack,boost::mutable_queue, boost::priority_queue и  boost::queue.

16.2.

Co lo r Va lue

К он ц еп ц и я   CoLorValue  о п и с ы в а е т  тр е б о в а н и я  к  ти п у , и с п о л ь з уе м о м у  д л я  з н а ч е н и й ц в е то в .  М н о г и е   а л г о р и тм ы   BG L  п р и м е н я ю т   о т браж ен и е   с в о й с тв а   «ц в е т »  д л я о тс л е ж и в а н и я  п р о дв и ж е н и я  а л г о р и тм а  п о  гр а фу . Т и п  з н а ч е н и й  ц в е т а  до л ж е н   бы т ь EqualityComparable. К л а с с  co1or_traits  с п е ц и а л и з и р о в а н  д л я   Т  так , ч то б ы   бы л и  о п ред лен ы   с л е д ую щ и е   ф ун к ц и и . З де с ь  Т  — ти п , к о т р ы й  м о де л и р уе т   ColorValue. •   color_traits< T> ::white() В оз вращ ае

т   ти п

С е м а н ти к а

: в о з в р а щ а е

: Т . т   о бъ ек т

, к о т р ы

й  п р е дс та в л я е

т   белы

й   ц в ет

.

, к о т р ы

й  п р е дс та в л я е

т   сер ы

й   ц в ет

.

, к о т р ы

й  п р е дс та в л я е

т   ч ерн ы

•   color_traits< T> ::gray() В оз вращ ае С е м а н ти к а

т   ти п : в о з в р а щ а е

: Т . т   о б ъ ек т

•   color_traits< T> : :Ы а с к ( В оз вращ ае С е м а н ти к а 16.3.

т   ти п : в о з в р а щ а е

)

: Т . т   о бъ ек т

й   ц в ет

.

M ultiPassInputlte rator

К он ц еп ц и я   MultiPassInputlterator  м н о г п р о х дн о г е м  In p utlterator. О н а  до б а в л я е т  тр е б о в а н и я д л я   н е о дн о к р а тн о г о  п е р е б о р а  в с е х  з н а ч е н и й м е н о в а ть , т о   *+ + itl  ==  *+ + it2.

, ч то б

о  и те р а то р а  я в л я е т с я  уто ч н е н и ы  и те р а то р  м о г  б ы т ь  и с п о л ь з о в а , и  е с л и   i t l  ==  it 2  H i t l  м о ж н о  р а з ы

н -

286 в а Гл

а 16  •ы н ь л е  Вт а мг о пс

е  ки цпе но

, кс а л

и zyxwvutsrqponmlkjihgfedcbaZY

ы  и и ц к н  фу

И те р а то р   MultiPassInputlterator п о д б е н   Forwardlterator.  Р а з н и ц , ч то б ы  ти п  reference  б ы л  val ue_type&, то гд ч т о  Forwardlterator тр е б ут Inputlterator  п о х ж   н а  Inputlterator в  то м , ч т о  ти п   reference  д о л ж е з еу м   к  ти п у   value_type. 1 6 . 4 . 

а  с о с то и т   в  то м , а  к а к  MultiPassн   бы т ь   п р ео б р а -

Monoid

К он ц еп ц и я   Monoid о п и с ы в а е т   п р о с то и з   м н о ж е с тв а  э л е м е н то в  5, б и н а р н о elem en t). В   C + +  м о н о и д  п р е дс та в л я е н арн у ю  о п е р а ц и ю , м н о ж е с тв о  о б ъ е к то в н е й тр а л ь н ы й   э лем ен т .

о н еч т и У

е  дл Ти п   э лем ен т Т и п   ф ун к ц и о н а л ь н о г

а   м н о ж е с тв

н ы в р и аь П л

е  вени ыржа

й  в и д  а л г е б р а и ч е с к о й  о п е р а ц и и  и  н е й тр а л ь н о г т   собо й  о б ъ е к т- ф ун к ц и ю , п р е дс та в л я ю щ и

й   с и с те м ы

. О н

о  э л е м е н т , р е а л и з ую щ и х  э л е м е н т

а  с о с т и т а  (iden tity й   би ы  5", и  о б ъ е к т  —

я а   5  до л ж е о  о б ъ е к т

н   бы т а  до л ж е

ь   м о де л ь н   м о де л и р о в а т

ю   Assignable  и   CopyConstructible. ь   BinaryFunction.

я

Т и п   X — э т о   ти п   э л е м е н та .  О б ъ е к т ы   a,  b и   с  — о б ъ е к т ы   ти п а   X, п р е дс та в л я ю щ и э лем ен т ы  м н о ж е с тв а   S. О б ъ е к т   1 — о б ъ е к т   ти п а  X, о б л а д ю щ и й   с в о й с тв а м раль н ог о   э лем ен т а   (п р и в е д н ы  н и ж е ) . О б ъ е к т   о р  — э т о  ф ун к ц и о н а л ь н ы кот ры й  р е а л и з уе т   о п ер ац и ю  н а  м о н о и де . •   о р ( а ,  Ь ) В оз вращ ае т   ти п : X. С е м а н ти к а : с м . н и ж е . •   а   —  b В оз вращ ае т   ти п С е м а н ти к а : в о з в р а щ а е

: bool.

•   а   !-   b В оз вращ ае т   ти п С е м а н ти к а : в о з в р а щ а е

: bool.

р н в иИ а т

т  и с ти н у

т   и с ти н у

, е с л

и  а  и  b п р е дс та в л я ю

, е с л

т  о ди

и  а  и  b п р е дс та в л я ю

е и   н ей т й  о б ъ ек т

н  и  то т  ж е  э л е м е н

т   раз н ы

е  э л е м е н т

,

т  5.

ы zyxwvutsrqpo  S.

ы •   З а м к н ут о с т ь Р е з ул ь т а

т   ор(а

. .  Ь ) та к ж

е  я в л я е т с

•   сА о ц и а т и в н о с т ь . о р( о р( а .  )Ь .  с )  —  ор(а .  (ро Ь е  н ей ралть н ог •   О п рел д н и ор(а ,  i )  == а 1 6 . 5 . 

я  э л е м е н то .  с ) ) о  элмен а т

м  S.

.

m u t a b l e _ q u e u ezyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

mutable_queue д аА п те о р и те а

р  mutable_queue  п р е дс та в л я е м   (р е а л и з о в а н а  с  и с п о л ь з о в а н и е

т   соб й  с п е ц и а л ь н ы м  к уч и ) , к о т р а

й  в и я  и м е

д   о ч ер д т   о п ерац и

и   п о  п р и ю  о б н о в

-

16.5. mutable_queue 2 8 7 zyxwvutsrq

л ен и я  (update). Э т о  п оз в ляе ка к   к р и е т й  упорчяден и ват ь  Q.update(x). Чобт ы  э фекит вн н уф о к т р  (объ-ект н уф кц и ю к о рт ы й  mutable_queue  зе ат в   ч ек у . Гне римыу е  и енд ит ф ократ п а н ре д о е  кон кртус у

м ра П те

ы ш он б л а

Н иж

к  элмен от в  в  ои чдре . П осл е  тог о а  х  м ен сят , ниодмбех о  вы з ы о  ниодтха ь   х  в  ои дчре , ни одм хбе о   н ап и с ат ь ) дл я  ообржатне и я  х  в  ун и кальн ы й  и енд ит ф коат р  (ID), м   и с п о л ь зе у т   л д я   о б р та ж н е и я  раз м ещ ен и я  элем н т а ы  должн ы  бы т ь  о т  0 д о zyxwvutsrqponmlkjihgfedcbaZYXW  N, д г е  ./V — з н ачен и е ,   mutable_queue. я  дл

т  и з м ен ят я  объкет

ь  п ордя а  элмен т

а

е  п ри невд ы  п рамте ы  ш болан а  аапредт а   mutable_queue.zyxwvutsrqponmlkjihgfed ќ  IndexedType Е сл и   ID н е  п о едр ж и в а естя ,  т о  до лж н а   бы т ь   о п р едл н а   ф ну к ц и я   index(t) (гд е   t  — о б ъ ек т   ит п а   IndexedType),  к о т р а я   в о з в ращ ае т   н ек о т р ы й   ц елы й ит п . •   Container М ле о д ь  дл я   RandomAccessContainer. Ти п  з н ач ен и я  кон йе т ре а  долж е н  бы т ь  та ки м   же , к а к  ти п  IndexedType. П о   м о ул ч ан и ю : std:  :vector. •   Compare М ле о д ь   лд я   BinaryPredicate  (би н арн ы й  п риед к)ат , корта я  пчеаолу т   о б ък е т ы ит п а  IndexedType в  качвсет е   м а ре н у г о в т . П о  у м о л ч а н и ю

: st d : :less .

•   ID

М ле о д ь  дл я  ReadablePropertyMap, корат я  п ри н и мае кю л ч а , а  воз вращ ае т   н к ое р ы т й  ц леы й  ти п  в  качвсет П о   м оу л ч а н и ю : i dent i ty_property_map.

од М т е Н иж

т  IndexedType в  квачсет е  ти п а  з н ач ен и я

е  ти п

а

.

ы е  п ри невд ы  мод те ы  аапредт а  mutable_queue. •   valuejtype То т  ж е  ти п , чт о  и  IndexedType. •   size_type Ти п ,  и сп оль зем ыу й  дл я  п авсртледн и я  раз мре а  ои чдре

.

•   mutable_queue(size_type n.  const  Compares  с . const  ID&  i d  =  IDO)

К о н к рт с у . Р ез рви сетру я  мтсе о  дл я  п  элем н овт . •   template  mutable_queue(lnputlterator  f ir st ,  Inputlterator  last, const  Compares  с   const  IDS  i d  =  IDO)

К о н к рт с у . К он ейт н е [first,  last).

р  std:: vector  no умолчан и

•   bool  empty О   const

В о з в р ащ ае

т  и истн у

, есл

и  очдре

ь   а ст п у

.

ю  з ап олн сяет

я  и з  ди ап з он

а

288 в а Гл

а 16  •ы н ь л е  Вт а мг о пс

е  и цпе но к

, кс а л

ы  и и ц к фун

и

•   void  popО zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

дУ а л я е

т   о бъ ек

т   и з  о ч е р ди

.

•   value_type&  top()

В оз вращ ае

т   с ы лк

у   н а  п е р в ы

й  э л е м е н

т   о ч е р ди

.

•   value_type&  front О Д р уг о

е  и м

я  д л

я   top().

•   void  push(const  value_type&  x) В с та в л я е

т   коп и

ю  о б ъ е к т

а   х  в   о ч е р дь

.

•   void  update(const  value_type&  x)

«З н а ч е н и е р я до ч е н и у  в  к уч е м е н та

»  э л е м е н т е   к уч и .  Э то ,  д л я   к о т о р о г

а   и з м ен и лось , и  д о л ж н о   бы т ь   з ан ов о   п р о и з в е де н т   м е то д   п о д р а з ум е в а е т ,  ч т о   и м е т с я   с та р ы о   index (у )  ==  index(x),  и   ч т о   х —  н о в о е   з н ач ен и

о   уп о

-

й   э лем ен

т е   эле

-

.

16.6. Нщюс еаи к ес р е п

я  в тс е мжо н

а

16.6.1. disjoint_sets disjoint_sets

К лас с  di s joi nt_sets  п р е до с та в л я е т   о п ер ац и и zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQ  шкесиающхяпрн  твсеах жон м (Н М ) , и н о г д а  н а з ы в а е м ы х  с тр ук тр о й   да н н ы х  д л я  о б ъ е ди н е н и я  и  п о и с к а  (unionfind  data  st ru ct u re) .  С т р ук т ур а   да н н ы х   Н М   п о держ и в ае т   н або р   5  =  5,, S 2,..., S k н е п е р е с е к а ю щ и хс я   м н о ж е с тв .  К а ж д о е   м н о ж е с тв о   и д е н т и ф и ц и р уе т с я   свои м ,метасвилдепр   в з я ты м   и з   м н о ж е с тв а .  М н о ж е с тв а   п р е дс та в л е н ы   к орн евы м и де р е в ь я м и , к о т о р ы е  з а к о д и р о в а н ы  в  о то б р а ж е н и и  с в о й с тв а   ParentMap. Дл я  ус к о рен и я   оп ерац и й   и с п о л ь з ую т с я   дв е   э в р и с т и к и : оине д ъ б   п о   а гн р у   и  атие жс п у т й е.

м р а т еП

ы  ш обнла Ниж

е  п р и в е д н

ы  п а р а м е тр

RankMap 

ParentMap 

Fi ndCompres s 

и рм П е Ти п и чн ы жи т

а ы   ш аблон

а  к л а с

а   disjoin t_ sets.

Долж е н  б ы т ти п о м  з н а ч е н и п о м  э л е м е н т

ь  м о дел ь

Долж е н   бы т к лю ч а  и  з н а ч ен и т а   м н о ж е с тв

ь  м о де л ь

я  и  ти п о а   м н о ж е с тв я  до л ж н

ю   ReadWritePropertyMap  с  ц елы м м  к лю ч а , с о в п а д ю щ и м  с  ти а ю   ReadWritePropertyMap. Т и п ы  со в п адт ь  с  ти п о м  э лем н

ы -

а

Долж е н  б ы т ь  о дн и м  и з  ф ун к ц и о н а л ь н ы х  о б ъ е к то в кот ры е  м ы  о б с диу м   п о з дн е е  в  э то м   р а з де л е . П о  ум о л ч а н и ю :  find_with_full_path_compression

р й   образ е ь   в  а л г о р и тм

ц   и сп оль з ован и я  н е п е р е с е к а ю щ и хс я   м н о ж ест е   kruskal jninimum_spanning_tree().  В  п р и м е р

в   можн е   в  л и с ти н г

о   обн ару е   16.1  м ы

,

16.6. ющасрпекН и

вы з ы вае чи т

м   link О   в м е с т о   union_set(), та к  к а к  и  и   v п о л уч а ю тс е   я в л я ю тс я  п р е д с та в и те л я м и   свои х   м н о ж е с тв

, уж

Лист ин

г 1 6 . 1 . с И з о п вн и аь л

е н е п р с ю а ещ к и с х

я

а zyxwvutsrqponm 2 8 9 zyxwvutsrqp

я ем св т н о ж

я   и з  fin d_set(),  а  з н а

-

.

м ес т но ж

в

disjoint_sets dsets(rank. p); for (ui = vertic es(G).first: ui != vertices(G).second: ++ui) dsets.make_set(*ui): while ( IQ.emptyO ) { e = Q.frontO; Q.popO: u  •  dsets.find_set(source(e)): v  = dsets.find_set(target(e)): i f  (  u  !=  v  )  { *out++  -   e: zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA dsets.link(u.  v):  //  инавызяс е } }

од М т е

ы

Ниж

е   п ри в ед н ы  в о з м о ж н ы е  м е то д ы   к лас а   disjoin t _ set s. •   disjoint_sets(RankMap  г .  ParentMap  p) Ко н с тр у к то р

.

•   d isjo int _set s( c o nst  d isjo int _set s&  x) Ко н с тр у к то р  к о п и р о в а н и я . •   template  void  make  se t t le m e n t  x)

С о з да е

т   м н о ж е с тв

о   и з  о дн о г

о  э л е м е н та

, с о де р ж а щ е г

о   э лем ен

т  х .

•   template  void  link (Element  x.  Element  y)

О б ъ е ди н и т

ь   дв

а   м н о ж е с тв а

,  п р е дс та в л е н н ы

е   э л е м е н та м

и  х  и  у .

•   template  void  union_set(Element  x.  Element  y) О б ъ е ди н и т ь   дв а   м н о ж е с т в а ,  с о де р ж а щ и е   э лем ен т link( f ind _set ( x) .  find_set(y)).

ы   х   и   у .  Э т

о   э к в и в а л е н тн

о

•   template  Element  find  set (Element  x)

В оз вращ ае

т   п р е дс та в и те л

я   м н о ж е с тв а

, с о де р ж а щ е г

о   э лем ен

т  х .

•   template  b o o s t : : t i e d .inser t ed ) = s. in se r t ( n e w_vals[ k ] ) ; i f ( ! inser t ed ) st d : : c o u t « * i « " ж у е со ли до х а н ь в о .евст м онж " « st d ::end l: else st d : : c o u t « * i « " ш е псн у о в с а ле т н о . " « s t d : : e nndl: d l;

} zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA r e t u r n  EXIT_SUCCESS: }

П р о фа м 3 н ш е п ус 9 уж

а  вы ивод

т   ю у щ д есл

о о ен л в а т с е с ол и д о ха н

16.8.

ь

. в о е в с т м жо н

: .

g r a p h _ p r o p e r t y _ i t e r _ r a n g e

graph_property_iter_range< Graph. PropertyTag>

Эо т т  клас п  к  свой ст р  в  графе

у ст бр е

ри м П е

т   п ра у  иореат ы  дл я  вес х  врше и

в  begin/ end,  орыкт н  в  граф е  и л и  к  свой ст

е  п оарвседтляю у   рбе

а  дл

т   од я  вес х

р

В  п ри м ре в  свой ст в  сант рд ы Л ис т н

с  гне рие у у   в р еш и н .

е  (ли ст н г  16.3) пбире юа с т о   «и м я» .  З еат м   нс о в й   вы од .

я  вс е  врше и н а   п р еб и аю с т

ы  в  герфа я   в с е   в р еш и н

, с  п ри своне и е ы   и   в ы в со я т д

м  сро т я   и м не

к а

г 16.3. й Фа л graph- property- iter- eg.cpp < graph- property- iter- eg.cpp > zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFE  = #include #include #include int mainO

п е р н и о дл ж

 •Ј>

2 9 2 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA в а Гл а 16 •  Вс поным ьел тоаг е   ок н ц е п и , ксал ы   и  фуцнки и г 1 6 . 3 zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA  { пернио дл)ж

Лист ин {

using  namespace  boost: typedef  adjacencyjlist  <  l i s t s .  vecS.  directedS, property  <  vertex_name_t.  std::string  >  > graph_t: graph_t g(3): const  char  *vertex_names[]  = {  "Kubrick".  "Clark",  "Hal" } ; int  i  = 0; zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA graph_property_iter_range ::iterator v. v_end: for (tie(v, v_end) » get_property_iter_range(g. vertex_name): v != v_end: ++v. ++i) *v -  vertex_names[i]:

tie(v, v_end) -  get_property_iter_range(g, vertex_name): std::copy(v. v_end. std::ostream_iterator  Cstd::cout. "  ")): std::cout «  std::endl; return  0: }zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA П р о амг а  вы виод т  сю у щдел : Kubrick  Clark Hal

д Г е   о п енр л д лКа с

а я  в йал  ф

с  graph_property_iter_range н ахо ди ст

м р а т еП

ы  ш обнла Ниж

е  п р и в е д н

а ы   п а р а м е тр

ы   ш аблон

а  к л а с

Graph 

Г р афо в ы

Property Tag 

Т е г  ку а з ы в а е т н ы   п р о и с ох д и

с А о ц и р н вы а

е   ит п

Ниж

е  п р и в е д н

е  boost/ graph/ propertyjter_range.hpp.

а   graph_property_iter_range. й  ти

п  до л ж е

н  б ы т

, к  к а к о м т   д о с т пу

е  ти п

ы  к л а с

graph_property_iter_range::iteratorй   и те р а то р ,  ти п  з н а ч е н и я   кот рог .

• 

graph_property_iter_range::const_iterator

,  ти

п  з н а ч е н и

я   котрог

.

•   graph_property_iter_range::type Ти •  Ти

иц к н у Ф

п   s t d : : p ai r < i t e r at o r ,  i t e r a t o r s graph_property_iter_range::const_type п   st d : : p air < c o nst _it er at o r .  c o nst _it er at o r > .

и  — мд о т е H e  и м е т

.

ы

у  р е б р

а  и л

и  вер

ш  и  -

а   graph_property_iter_range.

•  И з м ен яем ы с в о й с тв а

й   и те р а то р

ю  PropertyGraph.

ы

ы   ас оц и и рован н ы

К о н с та н тн ы с в о й с тв а

у  с в о й с тв .

ь  м о де л ь

о  — с в о й с тв о

,  ук а з а н н о

е   те г о

о   — с в о й с тв о

,  ук а з а н н о

е   те г о

м

м

16.8. gгpа h_property_iter_rang e 2 9 3

иц к н у Ф

и — н е д о тм е Н иж

ы

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

е  п ри невд ы  фн у к ц и и  — н е  мод те ы  клас а   graph_property_iter_range. •   tempiate typename  graph_property_iter_range::type get_property_iter_range(Graph&  graph,  const  Tag& tag)   у ст о д п   к  свой сут , В о з в р ащ ае т   п р а у   и з м не м я ы х   и о ер а т в , корыт е  дюа т zyxwvutsrqponmlkjihgfedcbaZ к ау з н о м у  тогме . И еорат ы  п юарогбе т  п о  все м  вреш и н а м  и л и  п о  все м  рбе ра м  граф . •   tempiate typename  graph_property_iter_range::const_type get_property_iter_range(const  Graph& graph, const  Tag& tag) В о з в р ащ ае т   п ар у   к о н а с т н ы х  иореатв , корыт е  дюа т  доуст п   к  свой сут , к а уз н о м у   о гм е т .  И оерат ы  пюагроеб т   п о  вес м  вреш и н а м  и л и  п о  вес м  ре бра м  граф .



и ф а р г о и лб Б

я

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSR

1. Dm i acs impelmentao tin file  format. htp/:/dm i acsr.utgerse.du/ChaLelnge 2. A. Aelxandrescu. Beter tempalte  eror mesages. C/C++  Users  J 3. M . Hd. A sterensel. G n ig and the STL. Pro series. A dsion-u W y, 1e9n 9e9rci.  Programm 4. G . B aumb ga rrn taer a nd V . F . R uso oyl. S gipn a tures i: A l an g. S uageotf v iand E n g t yp e a s t c t o i n a n d s u b t y p e p m o r h s i m n  C + + xpereince, 25(8):863-889, August 1995. 5. R l58a.n. On a routn ig probelm. Quarteryl  of App eild  87-9. B 0, 1e9m 6. Boost. Boost C++  Lb irareis, htp/:/wwwb .oosto .rg/. 7. A . B rok d es,r, a  R . K umar,ein F . M aghou ,lu P . R agh ah va n, S. R A . T o m n i n d J . W e r .  G r a p h s t r c t u r e i n  t e w eb. W eb Conefrence, 2000. 8. K . B. P . Beirru cee. O , Ln b . Cn aa rd e,il G. C a. T stagna ,  the  H opk n is  O bejc a n d B c i r y m e t h o d s h e o r y  a n d P r a c t c i e o 12 :21-242,1995. 9. B . C rm f kasky a nd A . G d lcib rg. O mtapn elm n tig o fr t. V he m am xiheu o lw p robel. V m. T echon ael r epon i rt,  S o frden U 10. T iest.  Introducto in to A Hil,. C  199or0m .en, C. Lesierson, and R. Rv 11. E k jiak sti, 1 tra. A n te  o elms in connexoin wtih M. D athem 2:69-271o, 1 95n t 9. wo prob 12. L ordath a nd D . F l0e4rs, 1 on. M ial fo lw through Jour. R nal o. F f M em actis, p. R ages 3 99u - 4k 956. axm 13. L. R. Ford and D. R. Fuk lerson. Folws in Networks. Prn ic

и ф а р гои лби Б

я

2 9 5 zyxwvutsrqp

14. Е . Gamma, R. Helm, R. J ohnson, and J. Vlissides.  Design  Patterns: Elements of  Reusable  Object- Oriented  Software.  Professional  Computing.  AddisonWelsey,  1995. 15. M. G arey and D. Johnson. Computers and Intractibility: A G uide to the Theory of N PCompleteness. W.H . Freeman, New York,  1979. 16. A. V.  G oldberg. A new max- flow algorithm. Technical  Report MIT/ LCS/ TM291, MIT, 1985. 17. A. V.  G oldberg and R. E. Tarjan. A new approach to the maximum flow problem. Journal of the ACM, 1988. 18. R. G raham and P. Hell. On the history  of the minimum spanning  tree problem. Annals of the H istory  of Computing, 7(1 ) :43- 57,  1985. 19. С   H edrick.  Routing  information  protocol. Internet  Requests  For Comments (RF C)  1058, June  1988. 20. A. V. Karzanov. D etermining the maximal  flow  in a network  by  the method of preflows. Sov.  Math. Dokl., 1974. 21. S. E. Keene. Object- Oriented  Programming in Common LISP: A Programmer's G uide to CLOS. Addison- Wesley,  1989. 22. D. E. Knuth. Stanford  G raphBase: A Platform  for  Combinatorial  Computing. ACM Press,  1994. 23. J.  B.  Kruskal.  On the shortest  spanning  subtree  of  a graph  and  the  traveling salesman problem. In Proceedings of the American Mathematical Sofiety, volume 7, pages 48- 50,  1956. 24. D. Ktihl. Design  patterns for  the implementation of graph algorithms.  Master's thesis, Technische U niversitat  Berlin, July  1996. 25. J. Lajoie  and S. B. Lippman. C+ +  Primer. Addison  Wesley, 3rd  edition,  1998. 26. E. L. Lawler. Combinatorial Opimization: Networks and Matroids. Holt, R inehart, and Winston,  1976. 27. D. Matula. Determining edge connectivity in o(mn). In Sumposium on F oundations of Computer Science, pages 249- 251,  1987. 28. J. McQuillan. The new  routing  algorithm  for  the arpanet. IEEE  Transactions on Communications, May  1980. 29. K. Mehlhorn and S. Naher. The LEDA Platform  of Combinatorial and G eometric Computing. Cambridge  University  Press,  1999. 30. B. Meyer. Object- oriented  Software  Construction. Prentice Hall International Series  in Computer Science. Prentice Hall,  1988. 31. E. Moore. The  shortest  path  through  a maze. In International Symposium  on the Theory of Switching,  pages 285- 292.  Harvard  U niversity  Press,  1959. 32. R. Morgan. Building  an Optimizing  Compiler. Butterworth- H einemann,  1998. 33. J. Moy. Rfc 1583: Ospf version 2. Network Working Group Request for Comment, March  1994.

296 и ф а р г о и лб и Б

я zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

34. D .  R.  M usser,  G. J.  D erge,  and  A.  Saini.  STL  Tutorial  and  Reference  G uide. Addison- Wesley, 2nd edition, 2001. 35. D . R. M usser  and A. A. Stepanov. A library  of generic algorithms in ada. In U sing Ada  (1987  I n tern ation al  Ada  C onference),  pages  216- 225,  N ew  York,  N Y, D ec.  1987.  AC M  SIG Ada. 36. N . C. M yers. Traits: a new and useful  template technique. C + +  R eport, J un e 1995, 37. R. Perlman. F ault- tolerant b roadcast of routing information. C omputer N etworks. D ecember  1983. 38. R. P rim . Sh ortest  connection networks  and  some  generalizations.  Bell  System Technical Journ al, 36:1389- 1401,  1957. 39. J. Siekan d  A. Lumsdaine. C oncept checking: Binding param etric polymorphism in  C + + .  In F irst Workshop  on C + +  T em plate P rogramming, Erfurt,  G ermany, October  10  2000. 40. A. A.  Stepanov  and  M. Lee. Th e Standard Tem plate Library.  Technical Repon; X3J16/ 94- 0095,  WG 21/ N 0482,  I SO  P rogram m in g  Lan guage  C + +  P roject, M ay  1994. 41. B. Stroustrup. D esign  and Evolution  of  C + + .  Addison- Wesley,  1994. 42. B. Stroustrup. The  C+ +  Programming  Language.  Addison  Wesley,  special  edition,  2000. 43. R. Tarjan.  D epth- first  search  and  linear  graph  algorithms.  SIAM  Journ al  on C om puting,  l(2):146- 160,  1972. 44. R. E. Tarjan.  D ata Structures  and N etwork  Algorithms.  Society  for  I ndustrial and  Applied  M athem atics, 1983. 45. B. L. van  der Waerden .  Algebra. F rederick U ngar P ublishing,  1970.

46. H . С   Warnsdorff.  Des  roesselsprungs  einfachste  und  allgemeinste  loesung. Schmalkalden,  1823.

ине лоп До

е к и ф а р г о и лб

и

ое р и Т

я о ф ра г

в

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

1.zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA   х Ао   .А ,  Хт фпко р ., Дж ан ьм л  У . Дж  П роснет и е  и  ан али з   в ы ч и с л е ьт н ы а л ог р и м т о в .  — М. : М и р , 1979. 2. ан м л е Б в ан и я 3.  Е втисген р ев ь 4.  в он ьяас К з а лу и з а ц и

 Р., ус йеф р Д . — М. : Н кау

 С.  П ри клнад ы ,  1965.

 В.  А., в Кон ьяас . — Н ов си б рск  В.  Н .,  Евтисген я   и  п ри м ен и е

5.  се ид фтиоср К

 Н .  Теори

6.  икпс йЛ

 В.  К ом би н орати к

7.  ер О

  .О  Т ео ри  .Л  Р., н Фоскре ал

9.  иарХ

 Ф.  Т еори

я  графов

о   п р о га м и р о : Аоримглт

-

ы   о б р ак т

и   ед -

: окбарот

, ви

-

. — М. : М и р

, 1978.

,  2003.

. Аорлгим т чскеи

й   од п х

я  п рогам и овст

. — М. : Н кау

. — М. : М и р

, 1988.

,  1968.

 Д.  Р.  П окт я  графов

и   и д н а м и ч се к о г

 В.  Н .  Теори я   р г а оф в ,  1994.  В.  А.  Гфар ы  в  п рогам и рован и . — С П б. : БВ Х- Пргебут а  дл

я  граофв

8.  д р о Ф

: Н кау

е   з ач д

х

и  в  схя те

. — М . : М и р

. — М. : М и р

, 1966.

, 1973.

C++ и STL 1.  ксеур каднс лА р га м и р о в а н и ск и 2.  учБ

 А.   С оврем н о е  и  п ри нклад ы й  до м  «В и ль ям е»

е  п роиект ван и е  ш онлба

3.  вдеурВан К и ев

: И з еалтдь ски

е  н а  C+ + : Обощ не о . — Киве

е  п ро

-

: И зельатд

-

, 2002.

 Г.  Обънект о- ори ен ит рован ы п р и л о ж ен и

ы  п роиект ван и я й   ан ли

й  н а  C+ + . — М . : И з еалтдь ски  Д., атсои  Дж  Н .  Ш аблон й  до м  «В и льмя» е

з  и  п роиект ван и й  до м  «БИ Н О М » ы  C+ + : С п равочн и , 2003.

е  с  п ри м ера , 2001. к  раз р бчоти ка

и . —

298 и н е ло п До

е к и ф а р гои лби

и zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIH

  ма м Га  Э.,  Хм ле   Р., н ос ж Д  Р.,  Все идс л . Дж   П р и ем ы  о б ъ е к тн о - о р и е н ти р 4.zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA

в ан о г

о  п роекит рован и я

: Прент а

П и ер т

, 2003.

5. ьютсио ж Д

ы  п роеикт рован и я

 Н .  C+ +  сант рд а

6.  Мсйре СП б

 С.  Э фекит вн о : П и ерт

я  бикаелбот е  и сп оль з ован и

 М .  Г.  Обощ не о е  сант рд о

й  би бл кеот

8.  аугре лП

 П.,  и Л  М .,  М.Д реса , в  С + . -   С П б.

: БВ Х- Прг ебут

9.  ат реС И з еа л д т ь с к и 10.  уатпрс С «БИ Н О М » 11.  уатпрс С

-  Дл

: П ире т

я  п роефси он алов

е  STL: Би бл оект

о

, 2001 . — С П б

а  п ромаг и ст

. . —

, 2002

7.  нтрес О р ащ и в ан и ш аб ло н о

. — С П б.

 Г.  Р еш ен и

е  п рогам и рован и е  твпеаонС

е  солжн ы й  до м  «В и льмя» е

 Б.  Яз ы , 2001.  Б.  Ди з ай

и   C+ + . — С П б.

 A,  STL — сант рд а ,  2004.

х   аз д ч   н а  C+ + . С ери ,  2003.

к   п р о г ам и р о в ан и н  и  эволю ц и

и  и  STL: и сп оль з ован и : Н евск и

е  и  н а , 2004.

й  Ди алкет я   б и л ке о т

я  C+ +  In- D epth. — Киев

я   C+ + . — М . :  И з адетль ск и я  яз ы к

а

а  C+ + . — М . : Д М К

й   од м , 2000.

:

ы н ит в а ф л А

й л е т аз к у

a d arth p ters  32sitior 67 a g l o i m v ao g h itm  tiors  a llo crta or tyv psie  23431

ь

zyxwvutsrqponmlkjihgf

generic programming 39

H

zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA hop 90

В zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA identity element 286 back edge 69, 83 internet protocol 90 backtracking graph search 127 bidirectional graph 32 К Boost Concept Checking Library, BCCL 54 keyword parameters  58 Boost Graph Library, BGL 17, 59 Boost Tokenizer Library, BTL 79 breadth- first search 77, 89 LEDA 130 Link- State Routing 95 literate programming style 20 Callback 165 collections 28 M concept 26, 39 Matrix Template Library, MTL 17 concept covering 55 minimum disconnecting set 118, 125 depth- first search 62 disconnected set 119 disjoint- sets 205

N named parameters 58 О overloaded functions 33

edge 25 edge descriptors 26 external property storage 64 p flow  network 117 forward or cross edge 83 framework 45

P policy class 135 preflow 117 priority queue 129 property interface 230 property map 27 push- relabel algorithm 117

3 0 0 ы н т и в а ф Ал

й ле т аз к у

ь

а л го р и т м zyxwvutsrqponmlkjihgfedcbaZYXWVU   ин)е{пж л о д о р RzyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA си яз н ы х  к о м п о н е н т  200 refinement  47 Т арь ян а  202 то п о л о г и ч е с к о й   с о р ти р о в к и   182 у в е л и ч и в а ю щ и хс я   к о м п о н ен т signatures  extension  42 св яз н о ст и  207 Standard Template Library, STL 26 Ф о р да - Ф а л к е р с о н а   117 Stanford  G raphBase  130 Э дм о н дс а - К а р п а   117, 209 ас оц и и рован н ы е  ти п ы  47 tag dispatching  52 template specialization  50 баз овы й   бло к  84 traits class 47,  49,  151 б и б л и о те к а Transmission  Control Protocol, TCP 90 LED A 130 traversal  category  219 а л г о р и тм о в   н а  г р а ф а х   59 tree edge 83zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA лек си ч еск о г о   раз бор а  79

и

п ро в ерк

union- find data structure 288 v vertex 24 vertex descriptors 26 visitor concepts 164 w WWW, World  Wide Web 109 а д п те

а д и ти в н а а л геб р а л го р и т

р   33 futered_graph  33 iterator_property_m ap  280 mutable_queue  287 r e ve r se gr a p h 33 д л я   Stanford  G raphBase 282 я   абел в а   г р пу а   40 а м н о г о с о р тн а я  11 м Бел м ан а- Ф о рд а   92,  188 Д е й к с тр ы  96,  183 Дж он сон а   192 К раскал а   102,194 о бо бщ ен н ы й   13 п ои ск а  в  г л уб и н у  62,  82,  177 п ои ск а  в  ш и р и н у  77,  89,  172 П ри м а   102,  197

и  к о н ц е п ц и 9

б и к о м п о н е н т10

й  54

в

в ерш и н

а до с ти ж и м а п р е до р о ди те л см еж н а

в н еш н е в р ем в рем

я   109 к  77,  89 ь   77,  89 я  25 е  хр а н и л и щ е   свой ст я  о к о н ч а н и я  о б р а б о тк я   п о сещ ен и я  62

в  64 и   в ер ш и н

г а р а н ти гр а

ы  6 2



и  с л о ж н о с т и  48 ф  25 knights_tour_graph  125 в ерш и н а  24 д в ун а п р а в л е н н ы й   32, 216 гду а  25zyxwvutsrqponmlkjihgfedc ын аворитнеироен й  25 ын аворитнеиро й  25 рбер о   25 уз е л  24 гр а фо в ы е   а д п те р ы   32

д де р е в

о п ои ск п ои ск

а  в  г л уб и н а  в  ш и р и н

ди с п е тч е р и з а ц и

я

у  62 у  77,  89

те г о

в  52

ы н т и в а ф Ал

и д с п ч ет р и з а ц и

я  вы з ов

з ча д

И и м не о в а н ы и н в ар и н т и н р е т - м ар ш и т з о р у а и н р е т - п о кр т и н йр е ф т и н йр е ф т о и р т ае

сал к

и  вы п олн е и и  ком п и ляц и е  вы ражне и

я  42 и  42 я  47

к лас

ь

3 0 1 zyxwvutsrqpo

с  (пин)е ж ло д р Point 43 property 70, 79, 249 property_map  248 property_traits  275,  278 put_get_helper  282 reverse_graph 252 а std48 ч й а тк ш р г е о  пт у и  и з  он до й  вшре и н ы  90 у  вмес и ч к йа р т ш г е о  пт у и  мжде topo_visitor  73 п р ам и  врше и н zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA  90 с ак л с  свой тс в  47,  49 у  дмву я ч к а йр т ш г е о  пт у и  мжде к с ал с  экви нале т ос и  П О рв ш е и н м а и  89 к ом п н е т а  свзя н ост и  200 м и н и м ал ь н о г о  оовнтс г о  двре а   102 си ль н а я   110 од хб а  кон е м  124,  130zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA к он йе т е р  45 к о н ц пе ц и я  26, 39 Adjacency G raph  154 е  пр мате ы   58 AdjacencyMatrix  157 ы  48 BellmanFordVisitor  168 р   90 BFS Visitor  165 л  90 BidirectionalG raph  153 с  26 Buffer  284 с  свой ст в   230 Color Value 285 р  28,  45 DFS Visitor  166 вр ше и н  28zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA Dijkstra Visitor  167 бер р   28 ищядохв х е  EdgeListG raph  156 ищядохси х е  бер р  28 EdgeMutableG raph  160 ебер р   28 EdgeMutablePropertyG raph  164 мс ж е н о тс и  28 Graph  151 IncidenceG raph  152 LvaluePropertyMap  278 с Monoid 286 adjacency_list32,215,  274, 284 MultiPassInputlterator  285 adjacency_list_traits  246 MutableBidirectionalG raph  161 adjacency_matrix  32, 33, 2 35 MutableEdgeListG raph  162 adjacency_matrix_traits  247 MutablelncidenceG raph  161 array_traits 50 PropertyG raph  162 back_edge_recorder 85 ReadablePropertyMap  276 bacon_number_recorder 81 ReadWritePropertyMap  277 color_traits 285 UniquePairAssociativeContainer  283 C olorP oin t 43 VertexListG raph  155 C olorP oin t2 44 VertexMutableG raph  159 c o m p o n en t in d ex  208 VertexMutablePropertyG raph  163 disjoint_sets 288 WritablePropertyMap  277 e d ge jist  250 о б р жа т н е и я  свой ст а  27 filtered_graph  256 ч й а кт ш р е е  роняаст и е  77,  89 graph_property_iter_range 71, 291 ч йа к р т ш и й  пт у ь  77,  89 gr a p h t r a i t s  53, 2 43 ве с  89 в рм е н в р ме н

и о п с тд м у ы

в

й ле т аз к у

3 0 2 ы н т и в а ф Ал

ь zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCB

й ле т аз к у

п рот ко л Л zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA м а р ш р ут н о

ле с п ои ск

а  в  г л уб и н

п ротко

у   62

й   и н фо р м ац и и

с  о п р е д л е н и е

м

м   к р а тч а й ш е г а   95

м а р ш р ут

м а р ш р ут и з а ц и с  уч е то

м  с о с то я н и

я  л и н и

а  с м е ж н о с т ь   41

и   95

и   32 ф   25 д   42

раз ре расш и рен и р ебр

н н еп ер есек аю щ и ес

я  м н о ж е с тв

о бо бщ ен н о о бо бщ ен н ы о б р а нт о о б р а тн ы о б ъ е к т - ф ун к ц и о п и с а те л

е  п р о г р а м и р о в а н и й  ук а з а те л е   то п о л г и ч е с к о й  в ы з о

а   205

е   182

в   170 я   30

ь в ер ш и р еб

о т бр аж ен и о т бр аж ен и

н   26 р   26 е   свой ст в   274,  284 е   с в о й с тв а   27 identify_property_map  36

п п ар ам ет п е р ох п ои с п о к р ы ти п о ли м о р фи з

п о с е ти те л п о с л е до в а те л п о с ти н к р е м е н п от п р е дп о т п р е дш е с тв е н н и п реи н к рем ен п р о в ер к п р о п ус к н а

р compare  30 д   90 к   К ен и г а   56 е  к о н ц е п ц и и  55 м   40 п а р а м е тр и ч е с к и й   39,  41 п о дти п о в   40 ь   31,  67 ь   84 т   48 к   117 к   117 к   84 т   48 а  к о н ц е п ц и и  54 я  с п о с о б н о с т ь о с та о ч н а раз рез

я   117 а   118,  125

з   118,  125 е  с и г н а ту

с в о й с тв сеч ен и сп ец и али з ац и сп и со ср ед с та н д а р тн а с ти л с т р ку т р

р   42

о в ох д я щ е др е в е с н о и н ц и н де н тн о и с ох д я щ е к о н еч н а н асы щ ен н о н ач аль н а о б р а тн о п ар ал ель н о п е тл п о п ер ч н о п р ям о

е   16,  39 ь   45 е   пу о р я д о ч е н и

о

п рот и п - клас с   55 п ту ь  89,  109 п ту ь дл и н а , в е с   89

я

м а тр и ц м о де л м ул ь т и г р а м лу ь т и м е т о

и  91

л   м а р ш р ут и з а ц и

е   25 е   77, 83,  89 е   25 е   25 я   в ерш и н а   25 е   117 я  в е р ш и н а   25 е   69, 83, 118, 125 е   25 я   25 е   83 е  83, 118, 125

о   27 е   118,  125 я  ш а б л о н а   50 к  с м е ж н о с т и   32 а  р а з р а б о тк и   45 я   б и б л и о те к а   ш аблон о ь  г р а м о тн о г о   п р о гр а м и р о в а н и а Arc  282 Vertex  282

те г   52 т и п  да н н ы а б с тр а к тн ы ти п  р а с п р е д л и те л то п о л о г и ч е с к о х

й   39 я   п ам ят е   уп о р я д о ч е н и

У ут о ч н е н и

в   16,  2(:i я   20

е   к о н ц еп ц и

и  47

и   234 е   34zyxwvutsrqponm

ы н т и в а ф Ал

й ле т аз к у

ь

3 0 3 zyxwvuts

Ф zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA фа й л  (п zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQP ин)е ж ло дор фай

л adjacency_list.hpp  218,  246 adjacency_matrix.hpp  238,  247 bellman- example.cpp  190 bellman- ford- internet.cpp  92 bellman_ford_shortest_paths.hpp  189 bfs- example.cpp  174 breadth_first_search.hpp  173 cc- internet.cpp  110 connected_com ponents.hpp  200 container_gen.cpp  233 depth_first_search.hpp  178,  181 dfs- example.cpp  179 dijkstra- example.cpp  187,  229 dijkstra_shortest_paths.hpp  185 edge- connectivity  .cpp  122 edge_list.hpp 251  . edge_property.cpp  232 edmunds_karp_max_flow.hpp  209 family- tree- eg.cpp  216 filtered_graph.hpp  258 gb_graph.h  262,  265 girth.cpp  262 graph_archetypes.hpp  55 graph_concepts.hpp  54 graph- property- iter- eg.cpp  291 graph.cpp  136 graph_traits.hpp  245 graphviz.hpp 96,  104 incremental- components- eg.cpp  206 incremental_components.hpp  207,  208 interior_property_map.cpp  233 johnson_alljpairs_shortest_paths.hpp  192 kevin_bacon.txt  79 kruskal- example.cpp  196 kruskal_minimum_spanning_tree.hpp  195 kruskal- telephone.cpp  104 leda_graph.hpp  33, 131,  136,  244, 266,  267 miles_span.cpp  262 prim- example.cpp  199 prim_minimum_spanning_tree.hpp  198 prim- telephone.cpp  106 property.hpp  66, 225,  226,  242, 243,  248, 250,  256 property_iter_ran ge.hpp  292

фо р м а ф ун к т о ф ун к ц и

property_map.hpp  73,  279,  280,  283 P R O T O T YP E S  132,  261 relax.hpp  186,  190 reverse- graph- eg.cpp  252 reverse_graph.hpp  253 roget_components.q)[)  262 scc.cpp»  112 stanford_graph.hpp  33,  132,  244, 261,  262 strong_components.hpp  202 topological_sort.hpp  182 topo- sortl.cpp35 topo- sort2.cpp  37 topo- sort- with- sgb.cpp  133 tuple.hpp  290 vector_as_graph.hpp  33, 271,  272 т   D I M AC S  210 р  30,  164 я accumulate  46 add_edge  29 a d d ve r t e x  29 adjacent_vertices  29,  64 back_edge  67 backtracking_search  127 bellman_ford_shortest_path  58,  92 breadth_first_search31,  79,  172 com pute_loop_extent  86 connected_com ponents  110,  200 depth_first_search  34,  38,  82, 177 depth_first_visit  82,  88,  181 dijkstra_shortest_paths  96,  183 discover_vertex  67 edmunds_karp_max_flow  209 equal  43 find_loops  84 finish_vertex  67 forward_or_cross_edge  67 get  71,  275 has_cycle  66,  69 has_cycle_dfs  66 in _edges29,  148 increm ental_com ponents  207 initialize_incremental_components  207 is_self_loop  26 johnson_all_pairs_shortest_paths  192

304  ны ти в а ф Ал н фу к ц и

й  ле зтак у

ь

я  (п zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA ин)е ж ло дор н уф к ц и я  (пин)е ж ло дор

kruskal  minimum  spanning  tree 104,  194 m ake_iterator_property  map  93 num  vertices  56 number_of_successors  128 operator  275 out_ edges29,  148 prim _m inim um _spanning_tree  197 prin t_tran s_delay  27,  28 prin t  vertex  name 27,  28 put  275 push  relabel  max  flow  212 read_graphviz  96 same  com ponent  207 st d 30,  80 sum  40 source  148 st r o n gc o m p o n en t s  202 tie 28,  290 topo  sort  65,  69

topo  sort  dfs  63 topological_sort  34,  182 tree_edge67,  81 target  148 vertex_index_map  36 visitor  31,  82 warnsdorff  129 who_owes_who  232 в с тр а и в а е м а я   42 о бо бщ ен н а я   14 п е р г р жу е н н а я   33zyxwvutsrqponmlkjihgfedcbaZ

ц

цик

л   84 го л в

а   84

•  •

ч

ч а с ти ч н а чи сл ч и сл

о  Б э к о н о   Э р де ш

я  с п е ц и а л и з а ц и я   51 а   79 а   78zyxwvutsrqponmlkjihgfedcbaZY