333 53 38MB
Russian Pages 301 Year 2006
Ь » "А "
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
3в
'• •
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
м ар П т е Ниж
ы ш обнла е п р и в е д н
а ы п а р а м е тр
V
ы ш аблон
а к л а с Ти ш ин
п о б ъ е к та е в г р а ф
Ти
п о б ъ е к та у в г р а ф
Е бр
л е Мд о
ь дл
а 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
R
е ти п ы
ы и н е ж а рб о т
и стсйо в
е 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
•