Compare commits
1909 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4e4f0cc72f | |||
| 23e8514ac7 | |||
| aa97fdc26a | |||
| f865d6209e | |||
| 751f8b5b7c | |||
| 73f24694dd | |||
| 5255835126 | |||
| 341a685ff1 | |||
| 6365afac60 | |||
| c28a996668 | |||
| 23ca414964 | |||
| c09b24159b | |||
| eb60f8c235 | |||
| 3884b842c6 | |||
| 05a4441935 | |||
| 8e5d48c839 | |||
| da3b568cb4 | |||
| e9747c0143 | |||
| e54f2934e1 | |||
| c691ac49f7 | |||
| fa42d8aa92 | |||
| 40ffa294a2 | |||
| b2be8e3dfc | |||
| 98d0755817 | |||
| 2f99e5b87f | |||
| 1cc2f6e13a | |||
| 2006d41573 | |||
| 4bda985420 | |||
| 666a919f70 | |||
| 03560ab9ae | |||
| a86a446429 | |||
| 8dfc1ad52c | |||
| dcb43119d5 | |||
| aa79cb6919 | |||
| 9d3d4e9a44 | |||
| 5461181e7f | |||
| d0432740ef | |||
| e6cd5bc377 | |||
| 148c441158 | |||
| a080a480ce | |||
| 1dfcd0e6fb | |||
| f3c29e22d2 | |||
| f6a8e8c66e | |||
| 54ff05ca06 | |||
| 1b69ebe5b5 | |||
| efcb9317fc | |||
| 96f923a52e | |||
| 45d0f1331b | |||
| 9445aff028 | |||
| f65f09bba9 | |||
| 43f0e01be5 | |||
| 7fdb4af8f6 | |||
| 660107b872 | |||
| ee9b816984 | |||
| e79c27b97b | |||
| 3125c8577d | |||
| b2bc98e410 | |||
| 4c8c2403c8 | |||
| 02cdd5c0f8 | |||
| 1f84c5b232 | |||
| 78d2fd885f | |||
| efa2fe286f | |||
| 45a2d06d94 | |||
| 55d57690f1 | |||
| 3f97161db1 | |||
| 0f49c8dcb2 | |||
| fcf80df5f9 | |||
| 85dd95cf77 | |||
| 1d8d4322d2 | |||
| 15d8e1dc21 | |||
| 99a56222da | |||
| 3bec282dbd | |||
| 3d5661096c | |||
| dfb49e339d | |||
| b493c0ea47 | |||
| c4a7c8cd37 | |||
| 64b6038f92 | |||
| 9d8f8ce0cd | |||
| fbd5c5120f | |||
| 46ae2cb6c1 | |||
| 83e26c7109 | |||
| d83d611b18 | |||
| 4af336e307 | |||
| e53d23d7d7 | |||
| 401165fe0c | |||
| 7e7359b330 | |||
| a728a94caa | |||
| 833169b3a0 | |||
| 770cce09ef | |||
| a237fb8cd9 | |||
| 79a1ef7d8f | |||
| dde01478fe | |||
| 41051db37b | |||
| 0a8a6f0812 | |||
| 1cfa23497b | |||
| 99d4f31d38 | |||
| a86397fc34 | |||
| 2c884b70b7 | |||
| 3c852ac7a0 | |||
| 0cb7bbf192 | |||
| a306a8119f | |||
| 88edab5b45 | |||
| b0474f1dd9 | |||
| 21b9a9f799 | |||
| 59ba89640e | |||
| d1c241d77e | |||
| 83e6c4a9c3 | |||
| 3ae3292696 | |||
| e0367b4a21 | |||
| f1257a09d1 | |||
| f4e0af95f1 | |||
| 4c5c2fc303 | |||
| 344dd6b155 | |||
| 392f5fa635 | |||
| bf2f7f86fa | |||
| cc4f49d760 | |||
| 0d2d95b2f2 | |||
| 58e287d115 | |||
| e505bf99db | |||
| d34d447b68 | |||
| a03ed0e26d | |||
| 9233499dbc | |||
| f4b0928c2d | |||
| 04fea004d9 | |||
| bc49236ccc | |||
| 73b6ddc2d4 | |||
| d4db30f9d3 | |||
| 3a07fe7c22 | |||
| a7c753ded9 | |||
| ac847ac715 | |||
| 47214f4fdc | |||
| ec2dcfddbb | |||
| ec7156274d | |||
| 9badc94845 | |||
| 39b29f3d79 | |||
| 65f63fecc1 | |||
| 7c5f9daa62 | |||
| 62cc164059 | |||
| fc6ec3f791 | |||
| 560f485326 | |||
| b47cf53fcb | |||
| 5898cc5bae | |||
| 0d30a51129 | |||
| 1035ddac56 | |||
| ce0f796b84 | |||
| 1b3a6936a2 | |||
| ad8a07eb09 | |||
| b659351ea7 | |||
| ff7a5d1282 | |||
| cfe0e0b552 | |||
| 50b1f74b93 | |||
| bf73135721 | |||
| 826f7a33d8 | |||
| 1b468cb8aa | |||
| fcd3996f0e | |||
| 05a7299c0e | |||
| e5848fee44 | |||
| fb06d7e38e | |||
| ebb6697936 | |||
| 77e5f0701d | |||
| 53f5645393 | |||
| 6b24966483 | |||
| ac1e867af4 | |||
| 62c6d9ef2f | |||
| 69c5cf732c | |||
| 0b1a337f52 | |||
| f44af6dd2f | |||
| 891ec4e4e3 | |||
| 96a3f1fa67 | |||
| 64428fc074 | |||
| 9a10195600 | |||
| fcf5d92ca6 | |||
| 0d52712c3d | |||
| 5597592ff5 | |||
| dea8296e5b | |||
| bcb16ef822 | |||
| ce0ec9e236 | |||
| 9e359134a1 | |||
| be9ad03abe | |||
| dbe744f6e2 | |||
| 9084e6ce9b | |||
| a4a5a1a42b | |||
| f9da93dbe2 | |||
| a0919bdff6 | |||
| 573f424452 | |||
| 4a159ba118 | |||
| 0d6c5bb4e2 | |||
| 6616bdba33 | |||
| 7a6a6fcbb6 | |||
| 11f9e9b044 | |||
| 399aa3b28a | |||
| a9e4925167 | |||
| 3eadd82c6b | |||
| 779274575b | |||
| 5f28b0237a | |||
| 29a09c1fc0 | |||
| 7465bc2c20 | |||
| 36656fda3d | |||
| 0245e863c8 | |||
| af44a9cfa5 | |||
| 22ca266765 | |||
| 12aa017c9f | |||
| bb6401e096 | |||
| 6cff97469a | |||
| 75100306fe | |||
| da3078ed52 | |||
| 70bbfe664b | |||
| 3f81217fad | |||
| 3d7d3eb428 | |||
| 7f05dc489b | |||
| 70e0dd2d23 | |||
| 654e43a7ed | |||
| 4f36d52ec3 | |||
| 174d0d2dff | |||
| f7db7b7771 | |||
| d0176ea39d | |||
| 42b9c97d31 | |||
| 0e08ed3d80 | |||
| 665b330286 | |||
| f36e7b9170 | |||
| 7815e65261 | |||
| eddae97983 | |||
| e96148194d | |||
| c668929a24 | |||
| e5a0f4f5fc | |||
| efd6f46383 | |||
| 61c59d9c1d | |||
| 727a9d994d | |||
| f836ed2531 | |||
| 5b572a82a3 | |||
| a1b7e1cd95 | |||
| 9df2b90f56 | |||
| 183d88cfb6 | |||
| 472dba30ed | |||
| d8fc6477d7 | |||
| 2a204d5482 | |||
| db9796ddfd | |||
| d629b74d98 | |||
| 421842272a | |||
| c4d72905bf | |||
| f497c3d195 | |||
| 86e4dd21af | |||
| c8ffc289d9 | |||
| 5879c83284 | |||
| 8041171b33 | |||
| 1e416130db | |||
| 2e318dccc1 | |||
| 02f8dbe592 | |||
| 18586182a1 | |||
| 0d93784f95 | |||
| 9225f94c4b | |||
| 69317c5bdc | |||
| ada2d70c01 | |||
| 5271a6bef6 | |||
| 6937336a09 | |||
| 9ba47b4b7b | |||
| bb1fba7555 | |||
| e87ac08817 | |||
| cc60980341 | |||
| 6fe01d0c4c | |||
| 29d60b8e6a | |||
| 0e2f464666 | |||
| 1e42266075 | |||
| aa3dcfb2e1 | |||
| 9be555c4f5 | |||
| 8899a047d4 | |||
| 6c93d9b187 | |||
| a5c1c8d953 | |||
| 80147f664b | |||
| 7ae0a8d974 | |||
| 549f85c80f | |||
| 4df63cf4f3 | |||
| 6466795448 | |||
| 4373b57677 | |||
| 97e891fee0 | |||
| cd346002ea | |||
| 48577cde2f | |||
| 0a4891fcf0 | |||
| 91e1935e1d | |||
| 8fe7018793 | |||
| 85e1d7e344 | |||
| ca5bbacc2e | |||
| b48254406d | |||
| 49ca29e905 | |||
| e10fef2660 | |||
| fddbb9b66e | |||
| 48867ed3ab | |||
| 75d3e89442 | |||
| ba824058ef | |||
| fe508c8c46 | |||
| 73a5b07661 | |||
| bbe399a2b0 | |||
| 786336804e | |||
| 869dab48ef | |||
| b62baf4ec1 | |||
| cf9d1521d8 | |||
| 6df693c448 | |||
| 64f732195e | |||
| 034950f993 | |||
| 309f243ea1 | |||
| 9294975522 | |||
| 50bd84a168 | |||
| 7ce3496b77 | |||
| 6aca595636 | |||
| eaffe5d5d0 | |||
| 39868b1498 | |||
| f11b29f1e7 | |||
| ad169e0261 | |||
| 6bc7f34a38 | |||
| ce4eb73bfa | |||
| 6864b4cb77 | |||
| 72ad366ad3 | |||
| c113d0c078 | |||
| 82e676d99f | |||
| f11331b2f1 | |||
| 9934fd8da4 | |||
| d745a537bf | |||
| 4e3c936503 | |||
| 0e295d01c3 | |||
| b9a10e2861 | |||
| d76004af71 | |||
| 0fbae0aeff | |||
| 63a3c9ce83 | |||
| 656907543a | |||
| 52507c33cf | |||
| 862343d802 | |||
| c1503a89a5 | |||
| 87588dd9ff | |||
| c3ec244c89 | |||
| 38b526762a | |||
| 41ebb5fbc1 | |||
| 0a589fd44a | |||
| 430aef4b59 | |||
| 66e61339b1 | |||
| 90f1ec41a4 | |||
| 289715b159 | |||
| b904a829b6 | |||
| e184561762 | |||
| 34bc3a8786 | |||
| efc05efebd | |||
| 9fe51b2a58 | |||
| 631d35bcc2 | |||
| 003e90151e | |||
| 4bc19a1621 | |||
| ea6d11a47e | |||
| 041f615cc3 | |||
| cfb03e5e10 | |||
| 5220440e86 | |||
| 9915f79681 | |||
| 2e67897926 | |||
| 1a6a672c6e | |||
| 1420cc346d | |||
| 6b15ae6041 | |||
| 6ae80231b2 | |||
| 8d1a7de32f | |||
| 66ee37fbf4 | |||
| cfc4c1b7d1 | |||
| 9eb9501c27 | |||
| e3455c28eb | |||
| 08119fe298 | |||
| bbb0b30dd3 | |||
| 2242193f11 | |||
| 3623623cf9 | |||
| e75984a2fb | |||
| 2577136447 | |||
| 1fa1cd881b | |||
| 63be68e1cb | |||
| 88c47b4995 | |||
| baea51cfa6 | |||
| c6b23e89cf | |||
| 6f84b0e9c8 | |||
| 1d25fe6892 | |||
| c4b48cd144 | |||
| fb4e0aebd6 | |||
| 91ccce062e | |||
| 1f0e952ff2 | |||
| ce4275cf9b | |||
| 15b83ced14 | |||
| e2649f122f | |||
| 0d9a96fec4 | |||
| 0e0507520b | |||
| 65339366d3 | |||
| 4f9118a1d5 | |||
| 8f2516eefb | |||
| 6e4ed79c88 | |||
| 5ce0418131 | |||
| 426d8e1244 | |||
| 972743058e | |||
| 8b8d0183dc | |||
| fb2a029e97 | |||
| 896ddc7d95 | |||
| 3ba84d959e | |||
| 3c045dd60e | |||
| 76483e6dcc | |||
| 9203aaf140 | |||
| 0c1817ada1 | |||
| 3bb1276271 | |||
| d3d9fdc0e5 | |||
| 760b7f6c45 | |||
| 77ca9c37ca | |||
| 1e359e31ed | |||
| f237b9feee | |||
| 4167abcb5d | |||
| 852cc06c85 | |||
| 4a0081feb3 | |||
| 7c446ad0d4 | |||
| a882494f03 | |||
| d31c4b5a04 | |||
| 961a7d09cc | |||
| a8488328b1 | |||
| 3cca66df9c | |||
| 6bf503fa56 | |||
| e88397d209 | |||
| cdc7c6fcc8 | |||
| 5754d6d866 | |||
| b9f793cefd | |||
| 4ebce62921 | |||
| 03368b302f | |||
| 3390d77e28 | |||
| c0783b62c0 | |||
| 85daa2c5c6 | |||
| 429f5c9d25 | |||
| c154f4ff95 | |||
| 1f33664599 | |||
| cc462f60ec | |||
| 4864d12d0c | |||
| 121f9b26c3 | |||
| 414d9cfeee | |||
| a6f984b406 | |||
| b02d2011a8 | |||
| 60e424c882 | |||
| 81703b0fb5 | |||
| 534b3efa0a | |||
| 500be67439 | |||
| bbd352bd57 | |||
| 558b1a2fef | |||
| 216a5a7f12 | |||
| 7fecf688bc | |||
| ef5fdd8cc6 | |||
| bc931e3286 | |||
| 48d9ef8f54 | |||
| 0dc01eca8c | |||
| 111151a177 | |||
| 56bfe6f4b7 | |||
| 01f0eb9ad3 | |||
| 02635807ce | |||
| 2ffc396f29 | |||
| 77ff4c53b8 | |||
| f2a49988ce | |||
| 867851b81f | |||
| 5c155ac7a5 | |||
| bec9d1c8df | |||
| bf9af6d93a | |||
| e92cb8cf50 | |||
| 5b13bec33a | |||
| 65f8821e60 | |||
| dff6200ce2 | |||
| 1d39ccd924 | |||
| 28a1a88128 | |||
| 610cecce12 | |||
| 5604226901 | |||
| f27670da66 | |||
| fc3c19c664 | |||
| 6b12a2813a | |||
| ba2a9304e8 | |||
| a6d2c98a5f | |||
| 4ce0965553 | |||
| eae6dc4a8e | |||
| 6a4cc8e537 | |||
| f1278dca9f | |||
| 30ef8f84ff | |||
| 604e5a7a45 | |||
| 3ec6d263b8 | |||
| 48a0aff91d | |||
| a1078197fd | |||
| 2d2a71f7aa | |||
| f2a278fad5 | |||
| 945fb8717c | |||
| 98187feda4 | |||
| 9dd1992a9d | |||
| 0c82c42f3d | |||
| 9297879774 | |||
| d34fed2e2a | |||
| 26e586237e | |||
| f59a9cdb42 | |||
| 7d1c1f6c8a | |||
| 25e2a8e1d8 | |||
| 6229d096e5 | |||
| 8c2a5290ad | |||
| e7023ea88a | |||
| 6123fb57e9 | |||
| 5aa64b9cac | |||
| 17985eaec5 | |||
| 4a11e36f85 | |||
| a07d79a8d3 | |||
| 048d40185d | |||
| 5f9800a0a7 | |||
| f3ff95bdd8 | |||
| 71b302bc49 | |||
| 63cfb2e00b | |||
| 8d219e56bc | |||
| 9197a1028f | |||
| 4b6effe849 | |||
| f0057aaa80 | |||
| 6d118a94d0 | |||
| 2d5dab5647 | |||
| 6593010f65 | |||
| d3f694525e | |||
| 77c424a53d | |||
| 896c715e35 | |||
| 961d3586a7 | |||
| 2341889e69 | |||
| 3b9071cf27 | |||
| e7706a3320 | |||
| 0b782a2f7f | |||
| 6c7a79387a | |||
| 264620c744 | |||
| b89568dcc5 | |||
| fde46d6ee8 | |||
| b7d9331f0e | |||
| 1b13e37ec2 | |||
| 41e4d297e8 | |||
| d84342b076 | |||
| 95eeae244b | |||
| ed11fbce92 | |||
| e6c0a0b36e | |||
| ce9e9e0d89 | |||
| 103a676163 | |||
| 0f54780d9b | |||
| 5e84be1a7d | |||
| 455dae4bfe | |||
| 667f926d1c | |||
| 46e2920f70 | |||
| f2a534bf12 | |||
| 3082cb5195 | |||
| 83ed711d3c | |||
| e0356c30ca | |||
| 10008230eb | |||
| d32278ed01 | |||
| 0b137f41e2 | |||
| 836a69685b | |||
| 5de49c9ea3 | |||
| 6965fc78ba | |||
| d1be6c2495 | |||
| e4461f93d5 | |||
| d017d8e9e7 | |||
| 34fefcd0f6 | |||
| 008a8c7168 | |||
| db84792f9f | |||
| f3d206f725 | |||
| 656b0ce32d | |||
| 905969f542 | |||
| c3cddc3b96 | |||
| b1239433ae | |||
| 598c2d2478 | |||
| 145474f398 | |||
| d4125b58f9 | |||
| 4adbd15346 | |||
| 29f3336462 | |||
| dd45b3d00f | |||
| d91f3ba421 | |||
| f8d6dccdf8 | |||
| faaf1fdac9 | |||
| 96784e037d | |||
| e0435ccc26 | |||
| 7b66953776 | |||
| 778835199f | |||
| 220b44fe17 | |||
| 11ba494e4c | |||
| cfc41552e7 | |||
| 00a2844d66 | |||
| 4c469946fe | |||
| 10b91f71d1 | |||
| 51d60f9b43 | |||
| cbfc6ec8ed | |||
| 73ad3cb092 | |||
| eedac55a7d | |||
| 34f46c045a | |||
| 9d467c8df1 | |||
| 9613d2dd8c | |||
| e3dd9042b1 | |||
| cf24fa4ca0 | |||
| 23b3545c8d | |||
| c5b4dccdf4 | |||
| 5bc28643d3 | |||
| 59d480bd8d | |||
| e8d775f806 | |||
| f68d704b60 | |||
| 31b1be9154 | |||
| ce8344e9ad | |||
| 89476c57dd | |||
| 20548378ed | |||
| bd8397897e | |||
| 16cc6fed3c | |||
| 5e09a7498b | |||
| 6a9e86bb5c | |||
| bd938c930f | |||
| edf7ef8641 | |||
| b4a9b406c2 | |||
| 1ef454e8c1 | |||
| 844a2019a9 | |||
| d965824092 | |||
| cb1091cae1 | |||
| 9ae3a8d6d2 | |||
| 1a95b1fff0 | |||
| b6c9531d22 | |||
| a9e4a158fe | |||
| ff0ea074ab | |||
| 91b24b6363 | |||
| 24403e3f19 | |||
| 3ada410bc9 | |||
| 2a1889d012 | |||
| 21d9026dbb | |||
| b3cb4f8037 | |||
| 279466a85d | |||
| e70fc391b8 | |||
| 687befe638 | |||
| 32497ce2a2 | |||
| d1b0ceea22 | |||
| e29266e8a5 | |||
| 3c641d4ec2 | |||
| 04d0248a5a | |||
| 02ab786074 | |||
| 17fd766fa5 | |||
| de777b9164 | |||
| 1825798f2a | |||
| 508526c98d | |||
| 550aa7d162 | |||
| 7a9d91ec88 | |||
| b9b9aa5782 | |||
| d45205e37d | |||
| d4e507bab8 | |||
| 9b53c7b81b | |||
| 30d756a5f6 | |||
| e40de5b395 | |||
| 206c17b1e2 | |||
| 6a70bb518f | |||
| 66aa8548f7 | |||
| a5c6b3d272 | |||
| 60004ef651 | |||
| 0e14818262 | |||
| 542bf4520b | |||
| 5133c85054 | |||
| abf4ba7df9 | |||
| 2cebf15b79 | |||
| 3390833f0c | |||
| 12feb5896f | |||
| 71a7b595ad | |||
| b5ded5174e | |||
| 2044110d76 | |||
| 4110bf69a1 | |||
| 60f612a532 | |||
| 05888905a8 | |||
| d755f8f5c3 | |||
| f7fa2e2942 | |||
| ad20c88c20 | |||
| 70a7c5ce02 | |||
| 8a24790a12 | |||
| 697f856843 | |||
| 1ad3a206d0 | |||
| 26ccf90eb1 | |||
| a11e93caa4 | |||
| 547cd77748 | |||
| df87cf35fc | |||
| 9e39cceb5a | |||
| 315d6e4196 | |||
| 57a2bff506 | |||
| 23c981d632 | |||
| ccd8ecee09 | |||
| c3ad6d91cf | |||
| fbe0af0831 | |||
| 72df35f1fa | |||
| abd8f2aa84 | |||
| 9d583a1a91 | |||
| ffce9c06c9 | |||
| aa9b63ba07 | |||
| 818dcc73b0 | |||
| b6201b1288 | |||
| e0f1e4c036 | |||
| 324d895dd9 | |||
| 7f51375fc2 | |||
| 890769706d | |||
| 0fd24218e9 | |||
| 42a08f3ca5 | |||
| 278ba5a845 | |||
| decc08bb0e | |||
| 33913b20ea | |||
| 811cf59a54 | |||
| 40644bc5ed | |||
| 40e3b28909 | |||
| 924e1b1d9a | |||
| e60f34fca2 | |||
| 07fe2aafa3 | |||
| 276e86d0a6 | |||
| d11130909b | |||
| 668d9c7599 | |||
| 0658669b79 | |||
| 291b56aba0 | |||
| b21c4393ae | |||
| e7a047c5b1 | |||
| 196baddc84 | |||
| 6bd9634bda | |||
| 8febef8989 | |||
| a8a1df5ff2 | |||
| 63a8ee23c5 | |||
| 5a1526cc3b | |||
| 5b84611a39 | |||
| 7fbc23e3dd | |||
| b39891a708 | |||
| 3577a626b0 | |||
| a5abf00cc7 | |||
| 121bb31837 | |||
| 49e55bc606 | |||
| fd543d5fae | |||
| f52b93625f | |||
| 87bc680518 | |||
| 49d479632c | |||
| 3c65d754ee | |||
| 096c3d9eb2 | |||
| 6b3a136853 | |||
| c0fde285cd | |||
| e830cec2bf | |||
| a2c237a85d | |||
| ca79276a10 | |||
| edaf9a56b3 | |||
| 9b195bb299 | |||
| 9a6f00eb12 | |||
| 487bb3ad72 | |||
| b174cc0adf | |||
| 5f98c9923c | |||
| fd2844b35a | |||
| 81a1368fab | |||
| 50270ae7ba | |||
| 894905388c | |||
| 09488ccbbc | |||
| 8121e5394a | |||
| d8e0253233 | |||
| ab5cb5e51d | |||
| e530bade5b | |||
| b352541b14 | |||
| 4b9b46cf49 | |||
| dac729c926 | |||
| 03b8ab6734 | |||
| 015276d003 | |||
| f4d8b68e0e | |||
| 6715b847ca | |||
| 925ab9b163 | |||
| 5dfedd00db | |||
| bc232d0067 | |||
| 0f7fc74966 | |||
| fa46936c98 | |||
| f84665b72d | |||
| f8e19bd4e4 | |||
| 659b99dec8 | |||
| 2bab353870 | |||
| e6b7dfe69f | |||
| 566ded5df3 | |||
| df7037fba6 | |||
| c62a911429 | |||
| a1d45dfb0b | |||
| 04f72dd932 | |||
| 134e931fbc | |||
| 7e7074703d | |||
| ad6d5c75cd | |||
| 91f7d0d42d | |||
| 55581ff209 | |||
| 0fab95269c | |||
| e5f983c453 | |||
| e655580dcb | |||
| c275c502b6 | |||
| 508e8bcbed | |||
| 3e006dd6ea | |||
| 661eca78a1 | |||
| 1adbc147f1 | |||
| 0e88c8cf7a | |||
| e5a5be0d1d | |||
| ceb987e999 | |||
| aaf7b3191f | |||
| f5bf31f89d | |||
| bf177b12af | |||
| 8ec64fdd02 | |||
| 8840131daf | |||
| e055b2625c | |||
| 37f92a391c | |||
| 8a6fe44c8a | |||
| eefda06d3d | |||
| de72dd0fae | |||
| 3e954fede7 | |||
| 90a09357c7 | |||
| 1501df6386 | |||
| 329d43b6c6 | |||
| f7de068589 | |||
| 42852a6cf9 | |||
| f16a9890bf | |||
| 39104a5514 | |||
| 25dcd6f92c | |||
| 1b25060368 | |||
| 2b6b96b97d | |||
| 4e687216b7 | |||
| fdb0f8e6b4 | |||
| b3e7396c37 | |||
| 397ddb31ea | |||
| ea1bc03f71 | |||
| 69762c75ec | |||
| 58c22c7cf9 | |||
| a976e279a4 | |||
| b50bae2b22 | |||
| cfbf43e814 | |||
| a22326d2b5 | |||
| bb9e4ebe4a | |||
| 49488dd54a | |||
| 5c190c2da5 | |||
| 6a35e532d7 | |||
| e9152d8d8d | |||
| 8608ebaf0a | |||
| 258587e952 | |||
| 8fc0b12e34 | |||
| 8d4aaff25f | |||
| cad149a5de | |||
| 08bb638505 | |||
| 9f7c65022d | |||
| 4c668211c7 | |||
| 54a5a4a7a3 | |||
| 019cfbf502 | |||
| 6668dc65b8 | |||
| 6fea41727d | |||
| 4333f4c3f2 | |||
| 0415430b37 | |||
| ed7f263840 | |||
| dfb53a9695 | |||
| 274a57af77 | |||
| 185c8b4c66 | |||
| de3cf1c17c | |||
| 8e398e19c2 | |||
| 2647cb69a5 | |||
| 6778c5eaed | |||
| 85e8916e35 | |||
| 9dc4ef0c22 | |||
| f4392384c1 | |||
| 60d885a95f | |||
| 7578421de9 | |||
| b1fd572469 | |||
| 42e13e2f11 | |||
| 149b84cb99 | |||
| ac633fd8e5 | |||
| 6b08404083 | |||
| 22cb1e04ca | |||
| 87f63c1241 | |||
| 7085a2c7d9 | |||
| e4582d5118 | |||
| f18494eb54 | |||
| 9d978e16b2 | |||
| 74a679b769 | |||
| ccaaef7a72 | |||
| 0bbfbb9bdd | |||
| d9686745b8 | |||
| 73f3dc1a92 | |||
| a500eba00d | |||
| 39e27bc6a7 | |||
| 0f0cc3de96 | |||
| 7b96312a72 | |||
| f16dfaf309 | |||
| 595c3708ed | |||
| 877606cb52 | |||
| 802453b397 | |||
| 63cedbcc9c | |||
| c36c15cd47 | |||
| e0620c90c0 | |||
| 2d62520f3a | |||
| e7056e65de | |||
| 7fb2d45363 | |||
| 99fc1b170d | |||
| 42526b9ca5 | |||
| d70300766c | |||
| d5573da050 | |||
| b2ac4c2743 | |||
| eeefccf435 | |||
| 834d6ad8fd | |||
| 63290266da | |||
| ad88071877 | |||
| 1efa4097a2 | |||
| 2d30710ee0 | |||
| 76054ca8be | |||
| a78fe97664 | |||
| 1ef5b2d0f9 | |||
| 44ced84aa0 | |||
| 443172599b | |||
| 3ef6deec39 | |||
| ab2cb2b3d7 | |||
| 6394da10fb | |||
| 64f6b89c03 | |||
| 261dd8ab7b | |||
| c265a5d47c | |||
| f66b70570f | |||
| 41d9380175 | |||
| fc7d71789b | |||
| 3f735f2066 | |||
| b98e1687c2 | |||
| 49cf35b0ea | |||
| 0604ad7274 | |||
| e58e655b29 | |||
| 55581ebe44 | |||
| c5e6fda4de | |||
| 5ccae0f486 | |||
| f700be45cb | |||
| 2b112dcc11 | |||
| 50bd678384 | |||
| 9c5a05fba6 | |||
| 2c0ed06838 | |||
| 9c82870ba5 | |||
| 256fe97529 | |||
| d6c4087341 | |||
| 3f58e4d848 | |||
| f0ef1e67c2 | |||
| f49745c09c | |||
| 5df6b464fd | |||
| f458bf4b08 | |||
| bef01875bd | |||
| a671d97270 | |||
| e5b75b438e | |||
| aeb2d4a45c | |||
| e33c3b85f7 | |||
| cff7729134 | |||
| a49d3b463c | |||
| de0a153c53 | |||
| 8dc5ae74ee | |||
| cf7d296292 | |||
| c6976a6822 | |||
| 152ed87d83 | |||
| 130f137390 | |||
| 537acfbe1d | |||
| c2fa135465 | |||
| 4bb358841d | |||
| 6fa4c596fd | |||
| e4fa3d9e19 | |||
| 49c91d57a5 | |||
| fce3fe6ca6 | |||
| 4d9bc14e69 | |||
| d1f60541d9 | |||
| 22e8f37c3c | |||
| 97cab7e93e | |||
| b496ac4ede | |||
| f4f24955cb | |||
| b1c0d0f6c1 | |||
| c2cc2f1530 | |||
| dcb0dd0aa5 | |||
| e7c0d34a98 | |||
| b160dcdba8 | |||
| ed4bdc2417 | |||
| 6849cde487 | |||
| df3219f2cb | |||
| 750bd9a13d | |||
| b1784b9ebb | |||
| 7a31d48962 | |||
| 54f558ea0e | |||
| efa71a63bc | |||
| ab6d7a4b45 | |||
| b656236dfe | |||
| 64a41688bf | |||
| 097001da6a | |||
| 6fda589723 | |||
| 08b26e3f3b | |||
| b761b44a0d | |||
| 68b55f244d | |||
| 02ac6db93d | |||
| 12e472b741 | |||
| 994bbd5f4a | |||
| b18c5360ae | |||
| 73f8ed8f4c | |||
| 36a92c7f3b | |||
| aa0d999d15 | |||
| 33cca10d36 | |||
| 6f93b9d06d | |||
| fef88c6398 | |||
| bab22e8995 | |||
| 320200fbc5 | |||
| a2bf3d5d57 | |||
| 53c4b7e6cd | |||
| 2f2c90247e | |||
| ec25450524 | |||
| a0061ba07e | |||
| 5de2e1da53 | |||
| 980ba2c8ad | |||
| cc16790818 | |||
| d843017353 | |||
| 303d7671d8 | |||
| db43b1c850 | |||
| 7a1792c83c | |||
| c07cc82a4f | |||
| 14864367bd | |||
| 0a47324e23 | |||
| ab92236d78 | |||
| ff79797a30 | |||
| 8ddcdfd33e | |||
| dcde366d0e | |||
| 91d0af6c3c | |||
| fbb9320ea5 | |||
| f59476b6bf | |||
| 170c7d20fb | |||
| 25302ccbd7 | |||
| ed5bbee076 | |||
| 449d4a1155 | |||
| a722c03e20 | |||
| 05ca32e656 | |||
| 7234e21211 | |||
| 14df1ae19d | |||
| 571a855bbc | |||
| d54ebbf4bb | |||
| c31151437a | |||
| 9177957cfc | |||
| c8d186e50b | |||
| 352099dc87 | |||
| 0d9e90200b | |||
| 28d9222735 | |||
| 6503c7a8bc | |||
| 63cefa95f7 | |||
| 80b5933e0a | |||
| 80d971a7ab | |||
| 49fd1e8397 | |||
| 385f6886ad | |||
| 28946e60d2 | |||
| fea0a73313 | |||
| 7d838ee7a4 | |||
| 7ecf6f59a6 | |||
| bf33e66413 | |||
| 877f0d3b04 | |||
| e88bd871cb | |||
| 01a7242fc0 | |||
| 04c9f2a7d0 | |||
| 1ee576fea0 | |||
| 2f33232ea8 | |||
| f31e26f473 | |||
| cd177c8c15 | |||
| dfab7321dd | |||
| 4ac3b7c269 | |||
| ffc5a92b41 | |||
| 96fb1f3fac | |||
| 2af0e49c87 | |||
| 4585685c64 | |||
| f576c1828d | |||
| 0be3562844 | |||
| 79847fd163 | |||
| 1a29ad2c7a | |||
| 294cf572a3 | |||
| 7385173288 | |||
| 04ef43e4ac | |||
| cba36c6033 | |||
| 95120649d2 | |||
| 6b3b2d1c0c | |||
| 6605341a1e | |||
| ec28f6c8ee | |||
| 0385bca4b7 | |||
| 3601ab7b4a | |||
| 73f41b8785 | |||
| e579bf2cd1 | |||
| e4eb759d59 | |||
| 076be173e2 | |||
| 04bc75cd40 | |||
| 90cc4a95b4 | |||
| f664ee3baf | |||
| 140de98250 | |||
| 43efa28d29 | |||
| 74c9fa60de | |||
| 90e70dce7b | |||
| ea5aa3d107 | |||
| 01b3ee1c64 | |||
| 7eef43cea8 | |||
| 2c10480b28 | |||
| 7162fea287 | |||
| 304765a5ca | |||
| 4e958ba352 | |||
| 1c9b7a86f5 | |||
| 2d22a32f3a | |||
| f3ddfbfead | |||
| 3ddd054124 | |||
| 7d403bc6c7 | |||
| cb16f8a63e | |||
| a2fa9cf2cb | |||
| df1d831cdf | |||
| 6fb684c821 | |||
| 561ac6b939 | |||
| d65232abaa | |||
| e6aa3b06b0 | |||
| 1c31f8cafa | |||
| 1ffe30f89b | |||
| e7dda7eb6d | |||
| 4b7aa8fc4b | |||
| 86e7e07e2e | |||
| fbe3b430e0 | |||
| 048cf582e2 | |||
| 21ba3be83c | |||
| 2caa382c9d | |||
| af826c7074 | |||
| 8c5fc2a96e | |||
| 8888e44a0f | |||
| d5d69d0c82 | |||
| 44c8e75c2e | |||
| 98f6b487bd | |||
| f67afc52c8 | |||
| deb9d39027 | |||
| e52aa12a74 | |||
| 398aad812f | |||
| 1dd9c54a19 | |||
| bb278dfd8b | |||
| d265125e8f | |||
| 91afa63044 | |||
| c0176700a6 | |||
| bb0fc3a38c | |||
| 36e2a3074f | |||
| 3ec7cee5e2 | |||
| f79bd7ef42 | |||
| 4b772c3f03 | |||
| e3afc20360 | |||
| 5390ee0f7d | |||
| 5215e9b4f2 | |||
| d5f559e652 | |||
| 3bbe76382d | |||
| 393fa73878 | |||
| b32f7d7176 | |||
| 3521815d8c | |||
| ce7f13f760 | |||
| 1dd8aff67f | |||
| 35c92a9f40 | |||
| 167cd7ec62 | |||
| 77172b101e | |||
| c32f22631b | |||
| 223235a0f1 | |||
| 04c4df910d | |||
| 36da83ffe1 | |||
| c78cc61a52 | |||
| d08fbf9e34 | |||
| 0d833d261b | |||
| b6df85d0ff | |||
| 2c4ae14fbf | |||
| 61ba919d47 | |||
| f96a2347c0 | |||
| e60c67fa0c | |||
| 14dee94585 | |||
| 1af19ce75c | |||
| 918a13fd5d | |||
| 5254133ebc | |||
| bac38fd476 | |||
| b5cbee0b18 | |||
| ea0713d477 | |||
| d01e32a0c8 | |||
| f41fc4c8b0 | |||
| 02f68e8e0c | |||
| da4c8f3c59 | |||
| a8ccda6a94 | |||
| 78e6dc44cd | |||
| eb75d45b7d | |||
| cac9c7c670 | |||
| 741ac3cc5d | |||
| 37cfe92cd1 | |||
| be7fdbbc90 | |||
| 65c4f217e1 | |||
| 0adf317473 | |||
| 80d97db4d4 | |||
| 1490d11dc1 | |||
| 108ac662db | |||
| 63cb03ee66 | |||
| 936ea6d201 | |||
| 0868a30bf4 | |||
| 753f3deacc | |||
| 020fff0e68 | |||
| 8e55436641 | |||
| e49c09dbcc | |||
| 9f189ea251 | |||
| 06e257cca1 | |||
| 585bdc4581 | |||
| 92f34d87cf | |||
| 4978760586 | |||
| 78221a7d9d | |||
| f1218f29c1 | |||
| 8e883f6b8d | |||
| ebc42db0ac | |||
| a8169117e7 | |||
| 38d9e1c16a | |||
| fce1e474de | |||
| 79c23ef37c | |||
| 8dbcb2cc35 | |||
| 3633d698d5 | |||
| f4bee8e49d | |||
| 62e5677397 | |||
| 2b15915418 | |||
| 866581da18 | |||
| a53afa3f85 | |||
| d7fef57674 | |||
| cc7bb99dab | |||
| 2161263943 | |||
| 96f1e05c68 | |||
| 3573eca026 | |||
| 74f52fff4f | |||
| 1217a3640e | |||
| b7e10fba1e | |||
| 63801dee89 | |||
| 2dd42cbdec | |||
| 377af01609 | |||
| 6dba429c3c | |||
| 1cf5ee7e9a | |||
| ee45d0c93b | |||
| 1c27e7e1d7 | |||
| a28c64e02b | |||
| cab2ffe94b | |||
| af8a8a7515 | |||
| 3bd53a6cb9 | |||
| 87ada367fc | |||
| 298381d563 | |||
| a37ace5bd1 | |||
| 66e3331645 | |||
| 11143f35ed | |||
| a91c4c778d | |||
| 1b5044517d | |||
| 56ea9ab04f | |||
| fca2523c70 | |||
| f0b9143ff4 | |||
| fe0e452635 | |||
| 1f770d8cd5 | |||
| ca4b4c2b95 | |||
| 7c4b90d3a5 | |||
| df74e82f30 | |||
| 3be7ee713c | |||
| 8496830250 | |||
| 1b2fdeaa9a | |||
| df57d4ff71 | |||
| 888fd95090 | |||
| cb8b64e33f | |||
| f380608408 | |||
| c4c208cec5 | |||
| c609181bad | |||
| 76de551288 | |||
| 637c6d4b63 | |||
| 8aa0fb3e96 | |||
| 565759091a | |||
| 06984ec09b | |||
| 6f356bf76d | |||
| e415495f7a | |||
| 2af0b6c3e9 | |||
| d4d81791c3 | |||
| b4cd14409b | |||
| ead0a2ab0c | |||
| 0d06c41821 | |||
| 55cda1fbf2 | |||
| b97932bca6 | |||
| dd69c282a0 | |||
| 5e537cd741 | |||
| 32166306cc | |||
| 10e4fe85dd | |||
| 55f4d9f571 | |||
| 9c6f2e13b1 | |||
| d56e2dcca3 | |||
| d3afb05747 | |||
| 1ae3184d72 | |||
| 03c5d4bd5d | |||
| 3f2ba8e6c5 | |||
| efb7469f57 | |||
| 1a0b0ad901 | |||
| 71b616180a | |||
| 310050bc6a | |||
| 7c75d7dfce | |||
| 8235b88eed | |||
| 02a997f4be | |||
| c2f7b66d73 | |||
| 6180f6a138 | |||
| f9001b444a | |||
| 68335c5b4c | |||
| 4452ae08bb | |||
| b528c8d862 | |||
| 28696f5d5f | |||
| 3babab2bc3 | |||
| 36e574eeaa | |||
| 475917ad0c | |||
| d3fe34a860 | |||
| 009b171767 | |||
| 8be1db0687 | |||
| ad26f14c4d | |||
| f861bff900 | |||
| bed761e2c2 | |||
| db5a2b138d | |||
| 27960ba125 | |||
| 2251bbcb88 | |||
| c657912300 | |||
| 7530c853c1 | |||
| 93cdbc1d92 | |||
| 6509b5286c | |||
| 26229bc41d | |||
| 61a1d47e50 | |||
| b4b3d54454 | |||
| e2a15d933f | |||
| ccd4026450 | |||
| 0e5921515b | |||
| ce55233841 | |||
| 7762b3049e | |||
| 75c8652d82 | |||
| 6d9d3154ab | |||
| e662337924 | |||
| f71a3a3ec1 | |||
| 71c875133a | |||
| 00979a015f | |||
| 7f90a53c3f | |||
| 796580e232 | |||
| abe493726d | |||
| b7584b6716 | |||
| 8e26b31654 | |||
| 62d252cf30 | |||
| 6112510ccc | |||
| 03bdb90920 | |||
| 770d1be136 | |||
| 1d119b7e06 | |||
| f93174117d | |||
| dd326e44e1 | |||
| 46c4758971 | |||
| 08ebd39282 | |||
| 19ba74383b | |||
| b6d8de4cf9 | |||
| 2ddd8e0d87 | |||
| 0263065191 | |||
| 4e539c158a | |||
| 2466d4a818 | |||
| 980457c573 | |||
| 5615f1a34c | |||
| 66220c880f | |||
| 2b3b105bf8 | |||
| 49a7b57153 | |||
| c0c2fa34e6 | |||
| 6d14ca4278 | |||
| d2e2138c91 | |||
| 80c5421f5f | |||
| ce5ff30b1b | |||
| a1932a87df | |||
| a81199c4e8 | |||
| c39e9ba90d | |||
| 96c4ead801 | |||
| fd57957914 | |||
| da9b33a3d7 | |||
| aefe4d6b63 | |||
| c6f11d4bb7 | |||
| f4448a194c | |||
| 8209340d08 | |||
| af755d81cc | |||
| c11c698bec | |||
| ad8fc9ca0d | |||
| e0b96232d1 | |||
| 70a5ab79dd | |||
| fc1154b36e | |||
| 64bbd3a721 | |||
| c23f3afebe | |||
| 7824b8c5aa | |||
| eb9d16cd24 | |||
| 6447f3e0c1 | |||
| ff68b1284a | |||
| 66504e2668 | |||
| 4e87a15181 | |||
| 28e89ff16d | |||
| 10e21dd82f | |||
| 43a267a1a3 | |||
| e459d66d3f | |||
| d2259781a1 | |||
| 1c74d2312d | |||
| b0e3fe0c55 | |||
| 8ba27d50f6 | |||
| 62e49d786b | |||
| 1f8de0f4da | |||
| d869963bf3 | |||
| 051abb6a53 | |||
| 92015a0945 | |||
| 4a62f87add | |||
| 8faad7f551 | |||
| f2810ee881 | |||
| 836eadc96e | |||
| c68ee918eb | |||
| bc5483502c | |||
| cdb4c44d6a | |||
| 5f1921c974 | |||
| cedf8c9a0b | |||
| 41393743d6 | |||
| 911c3c3f08 | |||
| 5e9b1cd0d8 | |||
| f234453512 | |||
| 177fcbdf4a | |||
| c73e2920ee | |||
| 5bc0e8ee5b | |||
| 0cdcd94e5b | |||
| 49a1e57f72 | |||
| 4a8f1ea897 | |||
| dfcc95bc76 | |||
| 95ca715167 | |||
| beae839fea | |||
| 96fe03b71e | |||
| 8a1daa735b | |||
| 3e773ebaf7 | |||
| 12e4efbd39 | |||
| e28fd145c1 | |||
| ae3bdc2893 | |||
| 3df72bcb26 | |||
| 5fa95ae668 | |||
| 064b8ae9a2 | |||
| 53d0c78393 | |||
| 60dc2f1a1f | |||
| 65cf0ac5fc | |||
| 1be45c6e8e | |||
| 6adb05834e | |||
| fd02bd8c17 | |||
| 1078af6c86 | |||
| 960dc10fcd | |||
| 8a187ca541 | |||
| 9d302516af | |||
| a33577dfe9 | |||
| 17328ea518 | |||
| f992486a6a | |||
| 9073419fcb | |||
| fbd0726225 | |||
| f11e0c7736 | |||
| 8fb64a1adf | |||
| c0fe0b2432 | |||
| 61f5b67f8b | |||
| d11dcda3d8 | |||
| 1420a46386 | |||
| a040577d74 | |||
| c413e7ead7 | |||
| 7580614986 | |||
| dc4101b2fd | |||
| 44fa77830e | |||
| 81dfa0a162 | |||
| e6ac5e2e5b | |||
| 1c33e688e6 | |||
| 7f005bdc7c | |||
| ee3e58358a | |||
| c54553c136 | |||
| b1039f3430 | |||
| 7010aaa5c0 | |||
| 86c2394491 | |||
| 90dcb85b49 | |||
| 221e9f053d | |||
| 0d402ae6f5 | |||
| 4a200f9c7c | |||
| e9fafbf8e4 | |||
| 7146fd319c | |||
| fd7ed3fbff | |||
| 74f877d9a7 | |||
| ff49f4bf4f | |||
| f3986e9966 | |||
| 317695052b | |||
| 39a0c79d64 | |||
| 9f02e67a86 | |||
| ece11913e9 | |||
| ceb2bfadf2 | |||
| 404ed90019 | |||
| 66f660709a | |||
| 6631c93e76 | |||
| 027f7d6b5b | |||
| dda7b5b40b | |||
| 1cf743abfd | |||
| beb7b3d5c0 | |||
| a462655804 | |||
| 5cc0fa180f | |||
| 7a543fcd41 | |||
| 07b169eaaa | |||
| 4643560dc6 | |||
| 84dc415618 | |||
| fb9ac62539 | |||
| 96eaf05b11 | |||
| b30541503b | |||
| 4144c36acf | |||
| fb5826ced0 | |||
| 33291eaf83 | |||
| 66b0464770 | |||
| e5751f31f5 | |||
| 9780c3f430 | |||
| 318d4b042a | |||
| a7efb3cf0d | |||
| 8f51b15f85 | |||
| 34c2f27450 | |||
| d8d186bfe5 | |||
| 8c28c4f116 | |||
| e676e8ee2a | |||
| 095b01eb3f | |||
| a6cdd2cf65 | |||
| 55f6411bb9 | |||
| e80eb85175 | |||
| ca5c8ad7f0 | |||
| 69357fe4bb | |||
| 99ce28beaf | |||
| 1e55bc3aa6 | |||
| dec1eebc00 | |||
| e55726ffad | |||
| bdc78ab436 | |||
| 7dbf526742 | |||
| 23f017862e | |||
| 654872e2a0 | |||
| 4951f7b3c8 | |||
| 5a724284d0 | |||
| 778b4970d9 | |||
| 41959ed25b | |||
| 3b2a833749 | |||
| 6637e0681c | |||
| 729f743711 | |||
| 14cbbf71b6 | |||
| 27d93257f5 | |||
| be50fa129c | |||
| 3a4ebf174d | |||
| 51645430ea | |||
| c03b438253 | |||
| c3c09c0b99 | |||
| 5c6fa4c0cf | |||
| 6d07a3a5e8 | |||
| 29c92f9043 | |||
| 7d2d242856 | |||
| 5ba5e64d00 | |||
| 433eb40bb6 | |||
| 7d700ec514 | |||
| 423e0ccef1 | |||
| 2b0bba5ab7 | |||
| 65e10bc39f | |||
| 8401f69cbb | |||
| d1a819c8ae | |||
| 381100c372 | |||
| d5c5dd61f7 | |||
| 70750cdc9a | |||
| ae3c899bfa | |||
| fc9e23bad1 | |||
| a1dfaeab00 | |||
| 9df1764497 | |||
| 7c8dd99dab | |||
| 47fa4e6e65 | |||
| 4efaed6988 | |||
| ed7aa0ad30 | |||
| 3ae90ab840 | |||
| fb1d5b6a7a | |||
| bb22d80a95 | |||
| 977de50af6 | |||
| 6a42658199 | |||
| 2912e632e4 | |||
| 0a7f838911 | |||
| 744ef42a60 | |||
| 38b2aecf97 | |||
| b712b85d2b | |||
| cfbd495345 | |||
| 5fa6b2bf2d | |||
| 6b112523c7 | |||
| 3b5fdbec36 | |||
| c0227802dc | |||
| bd93c66090 | |||
| bf75444970 | |||
| 94c390e51b | |||
| d485334e75 | |||
| 0735bf5a73 | |||
| 0d1e4daf0b | |||
| 14f85b8986 | |||
| 13fe19c49b | |||
| 64ef954373 | |||
| 5e41c529cf | |||
| 1a31f705af | |||
| b9c6708852 | |||
| c34f602abb | |||
| 88e9336be9 | |||
| 514acdfa7c | |||
| 8934559187 | |||
| 93ba158730 | |||
| fc01bb9c72 | |||
| 5d27919240 | |||
| 8590ee9b64 | |||
| 55eb406cac | |||
| d5a7d42929 | |||
| f6d0b7ea44 | |||
| eae9b22a8d | |||
| ea705ac53f | |||
| 19ed2331fd | |||
| 850f2b1e7d | |||
| c1cb9240cf | |||
| db00049b35 | |||
| 636bc74d90 | |||
| 94e9e262d3 | |||
| 48892971bf | |||
| d87c810127 | |||
| b9f21c77ad | |||
| bd9f720581 | |||
| a99bad2398 | |||
| a6dc03773e | |||
| e3a8ba103a | |||
| 3f97794d58 | |||
| a0bf8389ce | |||
| 29a34b199d | |||
| 0e550aee82 | |||
| 4e29fa0497 | |||
| 90ea3b2441 | |||
| a156259d75 | |||
| b327f08b86 | |||
| 6a85d72962 | |||
| 7e7cad34fa | |||
| 531cbf475e | |||
| b9e27e9e73 | |||
| 701e70d99f | |||
| 6932248ef4 | |||
| 392bf86290 | |||
| 73f9128f12 | |||
| ed1001219a | |||
| 246387fe74 | |||
| 020754d41b | |||
| 019e7d59a4 | |||
| 613594cc4b | |||
| 60799c4d99 | |||
| aea2ef0bce | |||
| 572382815b | |||
| ee6e39cbf9 | |||
| 3ed034416a | |||
| abd95021fb | |||
| 9263d22520 | |||
| f0c213150c | |||
| 2ed00fe129 | |||
| a25a678a60 | |||
| 0c8db5bd23 | |||
| 9b81ec002e | |||
| 9a92335451 | |||
| 202ab00774 | |||
| 5561613f00 | |||
| ad856f3fd4 | |||
| 51d4f166cf | |||
| aa869df676 | |||
| f79f66db8f | |||
| d2608cc258 | |||
| 775da4350a | |||
| ae1d55dfee | |||
| 3e82ea3625 | |||
| c391a5e79c | |||
| bd22fe7c87 | |||
| 13cda0a4df | |||
| 1feee2a564 | |||
| b41490bdc8 | |||
| 1911f0e3ad | |||
| 6d38d384d0 | |||
| 646965f4ca | |||
| df1190bca6 | |||
| fae733fb9b | |||
| 69f205fd74 | |||
| 8192915c4f | |||
| 230e30aee3 | |||
| 37f4440d1d | |||
| 243d74572e | |||
| 11edc80fb1 | |||
| aa8e953574 | |||
| 1df5e72394 | |||
| a79b674ccf | |||
| 3632e499c9 | |||
| 41b167816f | |||
| b2f02dfc15 | |||
| 803a0b1fca | |||
| 807302b982 | |||
| e843876765 | |||
| 296884f7d9 | |||
| 88d1bbe387 | |||
| 01e3d04946 | |||
| a5d2a5b391 | |||
| fc8e4d8ffa | |||
| 0f9043b2ee | |||
| 6cba5f9690 | |||
| f568f28714 | |||
| 18620374e9 | |||
| 81b9c05023 | |||
| a00f975f0f | |||
| 754bf68739 | |||
| ba3379e5f2 | |||
| fa461fe18a | |||
| bf40cfee24 | |||
| c3530c9922 | |||
| 5587566c0c | |||
| 7e9e7069db | |||
| 81ba240349 | |||
| 0310203b92 | |||
| 81bb1d06c0 | |||
| 1ea3cd7c9f | |||
| 5707461397 | |||
| b53ceab41a | |||
| c13d4c8017 | |||
| 653aeaf9be | |||
| 9420c5ef82 | |||
| 19b9c60b0f | |||
| 97c6b57fbb | |||
| 4abe5ed59a | |||
| 06b6ee6849 | |||
| 2924dd1086 | |||
| b06af1b71d | |||
| 113f42064a | |||
| d368ee932e | |||
| e2cda00cd7 | |||
| fa3090baa7 | |||
| 0facc36866 | |||
| 643bbaaafb | |||
| d58d53c73c | |||
| 3498b74625 | |||
| ae7c6cdd96 | |||
| c73f757b5e | |||
| c67fd6fb60 | |||
| 6554a1e32b | |||
| 0b9b227105 | |||
| 4bfb9f8c8c | |||
| 37436fb7d1 | |||
| fb1d480100 | |||
| e10a70cb34 | |||
| f5e2426677 | |||
| 199bf7e18b | |||
| c423fe07e6 | |||
| 067c5ad7bb | |||
| 7c8ac36115 | |||
| 6245f43a0a | |||
| afdfa1a52f | |||
| 76efd12e1d | |||
| ebae5c8873 | |||
| 8a03201821 | |||
| e406d2fae7 | |||
| 438b752fb4 | |||
| 028a12ad27 | |||
| b05969ef6a | |||
| ad33e4a22e | |||
| e0f256559b | |||
| 8f6db8c5ad | |||
| 86ef707164 | |||
| 06d42a60d7 | |||
| 647877fa4a | |||
| 9ad28a9dfa | |||
| 3a3fcb6c6a | |||
| 21b923a7a1 | |||
| c1d54e7453 | |||
| cdd890cf62 | |||
| fa3510315b | |||
| 9e8c1e8fad | |||
| 65488f886d | |||
| ffe084cded | |||
| 265a05b189 | |||
| 022acc9531 | |||
| cfa4f5c4a1 | |||
| accc191da3 | |||
| f00f096e69 | |||
| 223399ed54 | |||
| 77e07e01c0 | |||
| 1afa60a8c5 | |||
| cc508a1489 | |||
| 1a23716343 | |||
| 059525402f | |||
| 4a1e3392b9 | |||
| 0cfab20daf | |||
| f3d631220d | |||
| 6327cf5298 | |||
| 6f120cab78 | |||
| 5b708ae608 | |||
| 03d520c3e6 | |||
| 8f790672c6 | |||
| 69e3ef232c | |||
| 451496b3db | |||
| 6b2ea41e4e | |||
| 81e1ffc806 | |||
| 4450f4cc26 | |||
| 3c1ad89057 | |||
| 8e7dcf7b03 | |||
| efd172b0bb | |||
| c34af68b3b | |||
| 9c5660d432 | |||
| 929df2bcdd | |||
| 1bb18dfc5e | |||
| 1a58adf027 | |||
| 4d860edaa9 | |||
| b11e09d46a | |||
| dd67268acf | |||
| c4b46b14a1 | |||
| 28ab969e24 | |||
| 324e2b5247 | |||
| 20c3c22786 | |||
| cadab548e8 | |||
| 09f684d24e | |||
| 5111085358 | |||
| 10dc120342 | |||
| 77c862da72 | |||
| ad87ccbcea | |||
| 02071c6f7c | |||
| f4e797844a | |||
| 382ffba2d9 | |||
| 4a77da43cd | |||
| 61632c8358 | |||
| e342992729 | |||
| 694df0dfab | |||
| f9feb604f8 | |||
| b0dbc39dfc | |||
| 7aa8610f4d | |||
| d4d05e4578 | |||
| 6bf1049b36 | |||
| 310da54aad | |||
| 277a3dc24e | |||
| d38cc95153 | |||
| 0be673aaf7 | |||
| 724c0ec33e | |||
| 1ed4660eeb | |||
| f865949f88 | |||
| 7e9bbc2dd0 | |||
| 3e81c3d721 | |||
| b81c6a1295 | |||
| 375d4babf8 | |||
| 60a5e33e58 | |||
| 1d6b555089 | |||
| f0a69e09fc | |||
| 9a2f59e810 | |||
| 859c2cfe53 | |||
| 20dedbca41 | |||
| e7a18e1974 | |||
| 2305f4d132 | |||
| e9ac0156c9 | |||
| d9bf2c41e8 | |||
| 663ac09003 | |||
| f0c68c9003 | |||
| c5ba516e61 | |||
| 15b4af5e2b | |||
| 7523d6dc5d | |||
| cdb94cdbd5 | |||
| f39d175888 | |||
| 4015378172 | |||
| 5d6cec7c5d | |||
| 4ab7a58de0 | |||
| c4886e3a2f | |||
| cd02f9c2a3 | |||
| 8f8fe50b93 | |||
| 9283cf2f26 | |||
| 0d61d68ec5 | |||
| 43d91e1160 | |||
| 92fb2b9965 | |||
| fa7bd23cc2 | |||
| 786a500615 | |||
| a1525a3cc3 | |||
| 4d25336a81 | |||
| 4912f811de | |||
| d7ebce6bd6 | |||
| 2e395b9db4 | |||
| 09d50f47cd | |||
| 5313b59936 | |||
| 9cd6e0909b | |||
| 13ddcb4eef | |||
| 229e724e1f | |||
| be00c4913d | |||
| cd99c65465 | |||
| 3c7f8e8389 | |||
| d6d4090450 | |||
| dd5e92c262 | |||
| 0d49f17875 | |||
| d5530745fa | |||
| d7bf176f41 | |||
| 3571c728c2 | |||
| e44bd607c9 | |||
| cb809502f8 | |||
| 19e37ef272 | |||
| f85a60382b | |||
| 77e8a3261b | |||
| 0ab1e60f23 | |||
| 81d1a4eb72 | |||
| a0201de5d1 | |||
| bc020d0f37 | |||
| 8e736d3a5c | |||
| ee9cb34524 | |||
| 25f755aa90 | |||
| d5efa4eac5 | |||
| 1e41917003 | |||
| c9bf3d72eb | |||
| b85839c838 | |||
| bda0391cf8 | |||
| 76a3eaf8b9 | |||
| bc4436fb64 | |||
| 2d1c56c56b | |||
| a3f2c25bd9 | |||
| ccf57a4ef3 | |||
| faee73eadc | |||
| a13ce4535a | |||
| b2fe5a80e9 | |||
| 403346272e | |||
| ac33db402e | |||
| c093f45545 | |||
| 07868b795a | |||
| 60ca63f417 | |||
| 45ad377d31 | |||
| febfcfd580 | |||
| 5ae3739a7b | |||
| 3640e80d37 | |||
| 38a3312384 | |||
| e6f1759887 | |||
| f082a7dcf2 | |||
| 453e67aba6 | |||
| 772e901723 | |||
| 79864c4de2 | |||
| df9b4add99 | |||
| 10de7f9078 | |||
| 34632115f7 | |||
| 3fcdd2f793 | |||
| 3579cb83af | |||
| 9176af4e92 | |||
| acacc9e1c2 | |||
| c4a156e0fe | |||
| 5ffd82ed12 | |||
| 6a4400cf97 | |||
| ea61223225 | |||
| 51dbf4868e | |||
| f227265694 | |||
| b2e9983a13 | |||
| ec6a1186b1 | |||
| 1e5dcbdd06 | |||
| 1a29852156 | |||
| 48d486929f | |||
| fd7f5d5a0e | |||
| 2d5fcd13e3 | |||
| d62f527dad | |||
| ef54d3af08 | |||
| b19244f4f4 | |||
| 80a715d0b0 | |||
| c674611c22 |
@@ -0,0 +1,55 @@
|
||||
# Copyright (c) 2002 Trustees of Indiana University
|
||||
#
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
project boost/graph
|
||||
: requirements <include>../src
|
||||
: source-location ../src
|
||||
;
|
||||
|
||||
local optional_sources ;
|
||||
local optional_reqs ;
|
||||
|
||||
if [ modules.peek : EXPAT_INCLUDE ] && [ modules.peek : EXPAT_LIBPATH ]
|
||||
{
|
||||
local EXPAT_INCLUDE = [ modules.peek : EXPAT_INCLUDE ] ;
|
||||
local EXPAT_LIBPATH = [ modules.peek : EXPAT_LIBPATH ] ;
|
||||
|
||||
if --debug-configuration in [ modules.peek : ARGV ]
|
||||
{
|
||||
ECHO "Expat include directory: $(EXPAT_INCLUDE)" ;
|
||||
ECHO "Expat library directory: $(EXPAT_LIBPATH)" ;
|
||||
}
|
||||
|
||||
optional_sources += graphml.cpp ;
|
||||
optional_reqs += <include>$(EXPAT_INCLUDE)
|
||||
<library-path>$(EXPAT_LIBPATH)
|
||||
<find-static-library>expat
|
||||
;
|
||||
}
|
||||
else
|
||||
{
|
||||
ECHO "warning: Graph library does not contain optional GraphML reader." ;
|
||||
ECHO "note: to enable GraphML support, set EXPAT_INCLUDE and EXPAT_LIBPATH to the" ;
|
||||
ECHO "note: directories containing the Expat headers and libraries, respectively." ;
|
||||
}
|
||||
|
||||
lib boost_graph
|
||||
:
|
||||
read_graphviz_spirit.cpp
|
||||
$(optional_sources)
|
||||
:
|
||||
<define>BOOST_GRAPH_NO_LIB=1
|
||||
<link>shared:<define>BOOST_GRAPH_DYN_LINK=1
|
||||
# # Intel compiler ICEs if we turn optimization on
|
||||
<toolset>intel-vc71-win-9.1:<optimization>off
|
||||
# Without these flags, MSVC 7.1 and 8.0 crash
|
||||
<toolset>msvc-7.1:<cxxflags>-GR-
|
||||
<toolset>msvc-8.0:<cxxflags>-GR-
|
||||
# Requirements for any "optional" sources
|
||||
$(optional_reqs)
|
||||
;
|
||||
|
||||
boost-install boost_graph ;
|
||||
@@ -0,0 +1,138 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) 2004 Kris Beevers
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: AStarHeuristic</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1>AStar Heuristic Concept</H1>
|
||||
|
||||
This concept defines the interface for the heuristic function of an A*
|
||||
search, which is responsible for estimating the remaining cost from
|
||||
some vertex to a goal. The user can create a class that matches this
|
||||
interface, and then pass objects of the class into <a
|
||||
href="./astar_search.html"><tt>astar_search()</tt></a> to guide the
|
||||
order of vertex examination of the search. The heuristic instance
|
||||
must incorporate any necessary information about goal vertices in the
|
||||
graph.
|
||||
|
||||
For further discussion of the use of heuristics in an A* search, see
|
||||
the documentation of <a
|
||||
href="./astar_search.html">astar_search()</a>.
|
||||
|
||||
<h3>Refinement of</h3>
|
||||
|
||||
<a href="http://www.sgi.com/tech/stl/UnaryFunction.html">Unary
|
||||
Function</a> (must take a single argument -- a graph vertex -- and
|
||||
return a cost value) and <a
|
||||
href="../../utility/CopyConstructible.html">Copy Constructible</a>
|
||||
(copying a heuristic should be a lightweight operation).
|
||||
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<TR>
|
||||
<TD><tt>H</tt></TD>
|
||||
<TD>A type that is a model of AStar Heuristic.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>h</tt></TD>
|
||||
<TD>An object of type <tt>H</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>G</tt></TD>
|
||||
<TD>A type that is a model of Graph.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>g</tt></TD>
|
||||
<TD>An object of type <tt>G</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>u</tt></TD>
|
||||
<TD>An object of type <tt>boost::graph_traits<G>::vertex_descriptor</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>CostType</tt></TD>
|
||||
<TD>A type that can be used with the <tt>compare</tt> and
|
||||
<tt>combine</tt> functions passed to A*.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>c</tt></TD>
|
||||
<TD>An object of type <tt>CostType</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Associated Types</h3>
|
||||
|
||||
none
|
||||
<p>
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
<table border>
|
||||
<tr>
|
||||
<th>Name</th><th>Expression</th><th>Return Type</th><th>Description</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Call Heuristic</td>
|
||||
<td><tt>CostType c = h(u)</tt></td>
|
||||
<td><tt>CostType</tt></td>
|
||||
<td>
|
||||
Called for the target of every out edge of a vertex being examined.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Models</h3>
|
||||
|
||||
<ul>
|
||||
<li><a href="./astar_heuristic.html"><tt>astar_heuristic</tt></a>
|
||||
</ul>
|
||||
|
||||
<h3>Concept Checking Class</h3>
|
||||
|
||||
<pre>
|
||||
template <class Heuristic, class Graph>
|
||||
struct AStarHeuristicConcept {
|
||||
void constraints()
|
||||
{
|
||||
function_requires< CopyConstructibleConcept<Heuristic> >();
|
||||
h(u);
|
||||
}
|
||||
Heuristic h;
|
||||
typename graph_traits<Graph>::vertex_descriptor u;
|
||||
};
|
||||
</pre>
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2004</TD><TD>
|
||||
<A HREF="http://www.cs.rpi.edu/~beevek/">Kristopher Beevers</A>,
|
||||
Rensselaer Polytechnic Institute (<A
|
||||
HREF="mailto:beevek@cs.rpi.edu">beevek@cs.rpi.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -0,0 +1,213 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) 2004 Kris Beevers
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: AStarVisitor</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1>AStar Visitor Concept</H1>
|
||||
|
||||
This concept defines the visitor interface for <a
|
||||
href="./astar_search.html"><tt>astar_search()</tt></a>. Users can
|
||||
define a class with the AStar Visitor interface and pass an object of
|
||||
the class to <tt>astar_search()</tt>, thereby augmenting the actions
|
||||
taken during the graph search.
|
||||
|
||||
<h3>Refinement of</h3>
|
||||
|
||||
<a href="../../utility/CopyConstructible.html">Copy Constructible</a>
|
||||
(copying a visitor should be a lightweight operation).
|
||||
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<TR>
|
||||
<TD><tt>V</tt></TD>
|
||||
<TD>A type that is a model of AStar Visitor.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>vis</tt></TD>
|
||||
<TD>An object of type <tt>V</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>G</tt></TD>
|
||||
<TD>A type that is a model of Graph.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>g</tt></TD>
|
||||
<TD>An object of type <tt>G</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>e</tt></TD>
|
||||
<TD>An object of type <tt>boost::graph_traits<G>::edge_descriptor</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>s,u,v</tt></TD>
|
||||
<TD>An object of type <tt>boost::graph_traits<G>::vertex_descriptor</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>d</tt></TD>
|
||||
<TD>An object of type <tt>DistanceMap</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>WeightMap</tt></TD>
|
||||
<TD>A type that is a model of <a
|
||||
href="../../property_map/ReadablePropertyMap.html">Readable Property
|
||||
Map</a>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>w</tt></TD>
|
||||
<TD>An object of type <tt>WeightMap</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Associated Types</h3>
|
||||
|
||||
none
|
||||
<p>
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
<table border>
|
||||
<tr>
|
||||
<th>Name</th><th>Expression</th><th>Return Type</th><th>Description</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Initialize Vertex</td>
|
||||
<td><tt>vis.initialize_vertex(u, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on each vertex of the graph when it is first
|
||||
initialized (i.e., when its property maps are initialized).
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Discover Vertex</td>
|
||||
<td><tt>vis.discover_vertex(u, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked when a vertex is first discovered and is added to the
|
||||
OPEN list.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Examine Vertex</td>
|
||||
<td><tt>vis.examine_vertex(u, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on a vertex as it is popped from the queue (i.e. it
|
||||
has the lowest cost on the OPEN list). This happens immediately before
|
||||
<tt>examine_edge()</tt> is invoked on each of the out-edges of vertex
|
||||
<tt>u</tt>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Examine Edge</td>
|
||||
<td><tt>vis.examine_edge(e, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on every out-edge of each vertex after it is
|
||||
examined.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
<tr>
|
||||
<td>Edge Relaxed</td>
|
||||
<td><tt>vis.edge_relaxed(e, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
Upon examination, if the following condition holds then the edge is
|
||||
relaxed (the distance of its target vertex is reduced) and this method
|
||||
is invoked:
|
||||
<blockquote>
|
||||
<pre>
|
||||
tie(u, s) = incident(e, g);
|
||||
D d_u = get(d, u), d_v = get(d, s);
|
||||
W w_e = get(w, e);
|
||||
assert(compare(combine(d_u, w_e), d_s));
|
||||
</pre>
|
||||
</blockquote>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Edge Not Relaxed</td>
|
||||
<td><tt>vis.edge_not_relaxed(e, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
Upon examination, if an edge is not relaxed (see above), then this
|
||||
method is invoked.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Black Target</td>
|
||||
<td><tt>vis.black_target(e, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked when a vertex that is on the CLOSED list is
|
||||
``rediscovered'' via a more efficient path, and is re-added to the
|
||||
OPEN list.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Finish Vertex</td>
|
||||
<td><tt>vis.finish_vertex(u, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on a vertex when it is added to the CLOSED list, which
|
||||
happens after all of its out edges have been examined.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Models</h3>
|
||||
|
||||
<ul>
|
||||
<li><a href="./astar_visitor.html"><tt>astar_visitor</tt></a>
|
||||
</ul>
|
||||
|
||||
|
||||
<h3>See also</h3>
|
||||
|
||||
<a href="./visitor_concepts.html">Visitor concepts</a>
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2004</TD><TD>
|
||||
<A HREF="http://www.cs.rpi.edu/~beevek/">Kristopher Beevers</A>,
|
||||
Rensselaer Polytechnic Institute (<A
|
||||
HREF="mailto:beevek@cs.rpi.edu">beevek@cs.rpi.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -0,0 +1,130 @@
|
||||
<html>
|
||||
<head>
|
||||
<!-- Copyright 2007 Aaron Windsor
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
--
|
||||
-->
|
||||
<title>AddEdgeVisitor Concept</title>
|
||||
</head>
|
||||
<body alink="#ff0000"
|
||||
bgcolor="#ffffff"
|
||||
link="#0000ee"
|
||||
text="#000000"
|
||||
vlink="#551a8b">
|
||||
|
||||
<img src="../../../boost.png" alt="C++ Boost" height="86" width="277">
|
||||
|
||||
<br clear="">
|
||||
|
||||
<h1>AddEdgeVisitor Concept</h1>
|
||||
|
||||
The AddEdgeVisitor concept exists to allow for some indirection in algorithms
|
||||
that modify graphs by adding edges. In such algorithms, it may be convenient
|
||||
to perform additional operations (such as updating an edge index map) at
|
||||
points in the algorithm where an edge addition occurs. Replacing calls to
|
||||
to <tt>add_edge</tt> with calls to <tt>AddEdgeVisitor::visit_vertex_pair</tt>
|
||||
allows for such operations to be defined independently from the algorithm.
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<table>
|
||||
<tbody>
|
||||
|
||||
<tr>
|
||||
<td> <tt>Visitor</tt> </td>
|
||||
<td> is a type that models the AddEdgeVisitor concept </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td> <tt>vis</tt> </td>
|
||||
<td> is an object of type Visitor </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td> <tt>Graph</tt> </td>
|
||||
<td> is the type of a graph </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td> <tt>u,v</tt> </td>
|
||||
<td> are objects of type <tt>graph_traits<Graph>::vertex_descriptor</tt>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td> <tt>e</tt> </td>
|
||||
<td> is an object of type <tt>graph_traits<Graph>::edge_descriptor</tt>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td> <tt>v</tt> </td>
|
||||
<td> is an object of type <tt>graph_traits<Graph>::vertex_descriptor</tt>
|
||||
</td>
|
||||
|
||||
</tr><tr>
|
||||
<td>
|
||||
|
||||
</td></tr></tbody></table>
|
||||
|
||||
|
||||
<h3>Associated Types</h3>
|
||||
|
||||
None
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
<p>
|
||||
|
||||
<table border="1">
|
||||
|
||||
<tbody><tr><th>Name</th><th>Expression</th><th>Return Type</th>
|
||||
<th>Description</th>
|
||||
|
||||
</tr><tr>
|
||||
<td> Add an Edge </td>
|
||||
<td> <tt>vis.visit_vertex_pair(u, v, g)</tt> </td>
|
||||
<td> <tt>void</tt></td>
|
||||
<td> Invoked every time an edge between vertices <tt>u</tt> and <tt>v</tt>
|
||||
should be added to the graph <tt>g</tt>.
|
||||
</td></tr>
|
||||
|
||||
</tbody></table>
|
||||
|
||||
</p><h3>Models</h3>
|
||||
|
||||
Two models of this concept are defined in the file
|
||||
<a href="../../../boost/graph/planar_detail/add_edge_visitors.hpp">
|
||||
<tt>add_edge_visitors.hpp</tt></a>:
|
||||
|
||||
<ul>
|
||||
<li><tt>default_add_edge_visitor</tt>: The constructor of this class takes
|
||||
no arguments.<tt>visit_vertex_pair(u, v, g)</tt> is just a dispatch to
|
||||
<tt>add_edge(u, v, g)</tt>.
|
||||
<li><tt>edge_index_update_visitor</tt>: The constructor of this class takes
|
||||
two arguments: the first, an EdgeIndexMap,
|
||||
is a <a href="../../property_map/ReadWritePropertyMap.html">
|
||||
ReadWritePropertyMap</a> that maps each edge in the associated graph
|
||||
<tt>g</tt> to a distinct integer in the range <tt>[0, num_edges(g))</tt>.
|
||||
The second argument is the number of edges in the underlying graph, which
|
||||
serves as the "next available index" counter within the visitor.
|
||||
For example, in the case the graph used has an initialized interior
|
||||
edge index, the <tt>edge_index_update_visitor</tt> constructor should be
|
||||
called with <tt>get(edge_index, g)</tt> as the edge index and
|
||||
<tt>num_edges(g)</tt> as the next available index. When
|
||||
<tt>visit_vertex_pair(u, v, g)</tt> is called, the
|
||||
<tt>edge_index_update_visitor</tt> will add the edge <i>(u,v)</i> to the graph
|
||||
and update the edge index for the newly created edge.
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
|
||||
<br>
|
||||
</p><hr>
|
||||
Copyright © 2007 Aaron Windsor (<a href="mailto:aaron.windsor@gmail.com">
|
||||
aaron.windsor@gmail.com</a>)
|
||||
|
||||
</body></html>
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>AdjacencyGraph</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -61,6 +57,12 @@ vertices, whereas in other contexts the edges are also important.
|
||||
|
||||
<Table border>
|
||||
|
||||
<tr>
|
||||
<td><tt>boost::graph_traits<G>::traversal_category</tt><br><br>
|
||||
This tag type must be convertible to <tt>adjacency_graph_tag</tt>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<TR>
|
||||
<TD><pre>boost::graph_traits<G>::adjacency_iterator</pre>
|
||||
An adjacency iterator for a vertex <i>v</i> provides access to the
|
||||
@@ -82,8 +84,11 @@ href="../../utility/MultiPassInputIterator.html">MultiPassInputIterator</a>.
|
||||
<td><a name="sec:adjacent-vertices"><TT>adjacent_vertices(v, g)</TT></a></TD>
|
||||
<TD>
|
||||
Returns an iterator-range providing access to the vertices adjacent to
|
||||
vertex <TT>v</TT> in graph <TT>g</TT>. <a href="adjacencygraph.html#1">[1]</a><br>
|
||||
Return type: <TT>std::pair<adjacency_iterator, adjacency_iterator></TT>
|
||||
vertex <TT>v</TT> in graph <TT>g</TT>.<a
|
||||
href="#1">[1]</a>
|
||||
|
||||
<br> Return type:
|
||||
<TT>std::pair<adjacency_iterator, adjacency_iterator></TT>
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
@@ -95,7 +100,8 @@ The <TT>adjacent_vertices()</TT> function must return in constant time.
|
||||
|
||||
<H3>See Also</H3>
|
||||
|
||||
<a href="./graph_concepts.html">Graph concepts</a>
|
||||
<a href="./graph_concepts.html">Graph concepts</a>,
|
||||
<a href="./adjacency_iterator.html"><tt>adjacency_iterator</tt></a>
|
||||
|
||||
<H3>Concept Checking Class</H3>
|
||||
|
||||
@@ -122,6 +128,18 @@ The <TT>adjacent_vertices()</TT> function must return in constant time.
|
||||
};
|
||||
</PRE>
|
||||
|
||||
<h3>Design Rationale</h3>
|
||||
|
||||
The AdjacencyGraph concept is somewhat frivolous since <a
|
||||
href="./IncidenceGraph.html">IncidenceGraph</a> really covers the same
|
||||
functionality (and more). The AdjacencyGraph concept exists because
|
||||
there are situations when <tt>adjacent_vertices()</tt> is more
|
||||
convenient to use than <tt>out_edges()</tt>. If you are constructing a
|
||||
graph class and do not want to put in the extra work of creating an
|
||||
adjacency iterator, have no fear. There is an adaptor class named <a
|
||||
href="./adjacency_iterator.html"> <tt>adjacency_iterator</tt></a> that
|
||||
you can use to create an adjacency iterator out of an out-edge
|
||||
iterator.
|
||||
|
||||
<h3>Notes</h3>
|
||||
|
||||
@@ -142,8 +160,8 @@ experience with graph algorithm implementations.
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>AdjacencyMatrix</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -37,6 +33,18 @@ concept.
|
||||
|
||||
<a href="./Graph.html">Graph</a>
|
||||
|
||||
<H3>Associated Types</H3>
|
||||
|
||||
<Table border>
|
||||
|
||||
<tr>
|
||||
<td><tt>boost::graph_traits<G>::traversal_category</tt><br><br>
|
||||
This tag type must be convertible to <tt>adjacency_matrix_tag</tt>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<H3>Valid Expressions</H3>
|
||||
|
||||
<table border>
|
||||
@@ -57,9 +65,14 @@ consisting of the edge descriptor if the edge was found.
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
<H3>Complexity guarantees</H3>
|
||||
|
||||
The <TT>edge()</TT> function must return in constant time.
|
||||
|
||||
|
||||
<H3>Models</H3>
|
||||
|
||||
No models of this concept are currently in the Boost Graph Library.
|
||||
<a href="./adjacency_matrix.html"><tt>adjacency_matrix</tt></a>
|
||||
|
||||
<H3>Concept Checking Class</H3>
|
||||
|
||||
@@ -82,8 +95,8 @@ No models of this concept are currently in the Boost Graph Library.
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,42 +2,39 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. We make no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: BFSVisitor</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1>BFSVisitor Concept</H1>
|
||||
<H1><img src="figs/python.gif" alt="(Python)"/>BFS Visitor Concept</H1>
|
||||
|
||||
This concept defines the visitor interface for <a
|
||||
href="./breadth_first_search.html"><tt>breadth_first_search()</tt></a>.
|
||||
Users can define a class with the BFSVisitor interface and pass and
|
||||
Users can define a class with the BFS Visitor interface and pass and
|
||||
object of the class to <tt>breadth_first_search()</tt>, thereby
|
||||
augmenting the actions taken during the graph search.
|
||||
|
||||
<h3>Refinement of</h3>
|
||||
|
||||
none
|
||||
<p>
|
||||
<a href="../../utility/CopyConstructible.html">Copy Constructible</a>
|
||||
(copying a visitor should be a lightweight operation).
|
||||
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<TR>
|
||||
<TD><tt>V</tt></TD>
|
||||
<TD>A type that is a model of BFSVisitor.</TD>
|
||||
<TD>A type that is a model of BFS Visitor.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
@@ -89,16 +86,6 @@ graph search.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Start Vertex</td>
|
||||
<td><tt>vis.start_vertex(s, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on the source vertex once before the start of the
|
||||
search.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Discover Vertex</td>
|
||||
<td><tt>vis.discover_vertex(u, g)</tt></td>
|
||||
@@ -108,6 +95,17 @@ This is invoked when a vertex is encountered for the first time.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Examine Vertex</td>
|
||||
<td><tt>vis.examine_vertex(u, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on a vertex as it is popped from the queue. This
|
||||
happens immediately before <tt>examine_edge()</tt> is invoked
|
||||
on each of the out-edges of vertex <tt>u</tt>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Examine Edge</td>
|
||||
<td><tt>vis.examine_edge(e, g)</tt></td>
|
||||
@@ -128,8 +126,8 @@ form the search tree.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Cycle Edge</td>
|
||||
<td><tt>vis.cycle_edge(e, g)</tt></td>
|
||||
<td>Non-Tree Edge</td>
|
||||
<td><tt>vis.non_tree_edge(e, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on back or cross edges for directed graphs and cross
|
||||
@@ -142,7 +140,7 @@ edges for undirected graphs.
|
||||
<td><tt>vis.gray_target(e, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on the subset of cycle edges who's target vertex is
|
||||
This is invoked on the subset of non-tree edges who's target vertex is
|
||||
colored gray at the time of examination. The color gray indicates
|
||||
that the vertex is currently in the queue.
|
||||
</td>
|
||||
@@ -153,7 +151,7 @@ that the vertex is currently in the queue.
|
||||
<td><tt>vis.black_target(e, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on the subset of cycle edges who's target vertex is
|
||||
This is invoked on the subset of non-tree edges who's target vertex is
|
||||
colored black at the time of examination. The color black indicates
|
||||
that the vertex has been removed from the queue.
|
||||
</td>
|
||||
@@ -166,7 +164,7 @@ that the vertex has been removed from the queue.
|
||||
<td>
|
||||
This invoked on a vertex after all of its out edges have been added to the
|
||||
search tree and all of the adjacent vertices have been discovered
|
||||
(but before their out-edges have been examined).
|
||||
(but before the out-edges of the adjacent vertices have been examined).
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -178,6 +176,27 @@ search tree and all of the adjacent vertices have been discovered
|
||||
<li><a href="./bfs_visitor.html"><tt>bfs_visitor</tt></a>
|
||||
</ul>
|
||||
|
||||
<a name="python"></a><h3>Python</h3>
|
||||
To implement a model of the <tt>BFSVisitor</tt> concept in Python,
|
||||
create a new class that derives from the <tt>BFSVisitor</tt> type of
|
||||
the graph, which will be
|
||||
named <tt><i>GraphType</i>.BFSVisitor</tt>. The events and syntax are
|
||||
the same as with visitors in C++. Here is an example for the
|
||||
Python <tt>bgl.Graph</tt> graph type:
|
||||
|
||||
<pre>
|
||||
class count_tree_edges_bfs_visitor(bgl.Graph.BFSVisitor):
|
||||
def __init__(self, name_map):
|
||||
bgl.Graph.BFSVisitor.__init__(self)
|
||||
self.name_map = name_map
|
||||
|
||||
def tree_edge(self, e, g):
|
||||
(u, v) = (g.source(e), g.target(e))
|
||||
print "Tree edge ",
|
||||
print self.name_map[u],
|
||||
print " -> ",
|
||||
print self.name_map[v]
|
||||
</pre>
|
||||
|
||||
<h3>See also</h3>
|
||||
|
||||
@@ -187,14 +206,14 @@ search tree and all of the adjacent vertices have been discovered
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>BasicMatrix</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1><A NAME="concept:BasicMatrix"></A>
|
||||
BasicMatrix
|
||||
</H1>
|
||||
|
||||
The BasicMatrix concept provides a minimalist interface for
|
||||
accessing elements from a 2 dimensional table of values.
|
||||
|
||||
|
||||
<H3>Refinement of</H3>
|
||||
|
||||
none
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<TR>
|
||||
<TD>{<tt>M,I,V</tt>}</TD>
|
||||
<TD>The matrix, index, and values types that together model the BasicMatrix concept.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>A</tt></TD>
|
||||
<TD>An object of type <tt>M</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>i, j</tt></TD>
|
||||
<TD>Objects of type <tt>I</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<H3>Associated Types</H3>
|
||||
|
||||
none
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
<Table border>
|
||||
|
||||
<tr>
|
||||
<td><a name="sec:elt-access"><TT>A[i][j]</TT></a></TD>
|
||||
<TD>Returns a reference to the element object stored at index <tt>(i,j)</tt><br>
|
||||
Return type: <TT>V&</TT> for mutable <tt>A</tt> or <TT>const V&</TT>
|
||||
for constant <tt>A</tt>.
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<H3>Complexity guarantees</H3>
|
||||
|
||||
Element access is constant time.
|
||||
|
||||
<H3>Concept Checking Class</H3>
|
||||
|
||||
<pre>
|
||||
template <class M, class I, class V>
|
||||
struct BasicMatrixConcept
|
||||
{
|
||||
void constraints() {
|
||||
V& elt = A[i][j];
|
||||
const_constraints(A);
|
||||
ignore_unused_variable_warning(elt);
|
||||
}
|
||||
void const_constraints(const M& A) {
|
||||
const V& elt = A[i][j];
|
||||
ignore_unused_variable_warning(elt);
|
||||
}
|
||||
M A;
|
||||
I i, j;
|
||||
};
|
||||
</pre>
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -2,42 +2,38 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. We make no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: BellmanFordVisitor</Title>
|
||||
<Title>Boost Graph Library: Bellman Ford Visitor</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1>BellmanFordVisitor Concept</H1>
|
||||
<H1><img src="figs/python.gif" alt="(Python)"/>Bellman Ford Visitor Concept</H1>
|
||||
|
||||
This concept defines the visitor interface for <a
|
||||
href="./bellman_ford_shortest.html"><tt>bellman_ford_shortest_paths()</tt></a>.
|
||||
Users can define a class with the BellmanFordVisitor interface and
|
||||
Users can define a class with the Bellman Ford Visitor interface and
|
||||
pass and object of the class to <tt>bellman_ford_shortest_paths()</tt>,
|
||||
thereby augmenting the actions taken during the graph search.
|
||||
|
||||
<h3>Refinement of</h3>
|
||||
|
||||
none
|
||||
<p>
|
||||
<a href="../../utility/CopyConstructible.html">Copy Constructible</a>
|
||||
(copying a visitor should be a lightweight operation).
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<TR>
|
||||
<TD><tt>V</tt></TD>
|
||||
<TD>A type that is a model of BellmanFordVisitor.</TD>
|
||||
<TD>A type that is a model of Bellman Ford Visitor.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
@@ -79,16 +75,6 @@ none
|
||||
<th>Name</th><th>Expression</th><th>Return Type</th><th>Description</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Initialize Vertex</td>
|
||||
<td><tt>vis.initialize_vertex(s, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on every vertex of the graph before the start of the
|
||||
graph search.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Examine Edge</td>
|
||||
<td><tt>vis.examine_edge(e, g)</tt></td>
|
||||
@@ -156,19 +142,42 @@ when there is a negative cycle in the graph.
|
||||
<li><a href="./bellman_visitor.html"><tt>bellman_visitor</tt></a>
|
||||
</ul>
|
||||
|
||||
<a name="python"></a>
|
||||
<h3>Python</h3>
|
||||
|
||||
To implement a model of the <tt>BellmanFordVisitor</tt> concept in Python,
|
||||
create a new class that derives from the <tt>BellmanFordVisitor</tt> type of
|
||||
the graph, which will be
|
||||
named <tt><i>GraphType</i>.BellmanFordVisitor</tt>. The events and syntax are
|
||||
the same as with visitors in C++. Here is an example for the
|
||||
Python <tt>bgl.Graph</tt> graph type:
|
||||
|
||||
<pre>
|
||||
class count_tree_edges_bellman_ford_visitor(bgl.Graph.BellmanFordVisitor):
|
||||
def __init__(self, name_map):
|
||||
bgl.Graph.BellmanFordVisitor.__init__(self)
|
||||
self.name_map = name_map
|
||||
|
||||
def edge_relaxed(self, e, g):
|
||||
(u, v) = (g.source(e), g.target(e))
|
||||
print "Relaxed edge ",
|
||||
print self.name_map[u],
|
||||
print " -> ",
|
||||
print self.name_map[v]
|
||||
</pre>
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Bidirectional</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -65,6 +61,12 @@ edges incident to the vertex.
|
||||
|
||||
<Table border>
|
||||
|
||||
<tr>
|
||||
<td><tt>boost::graph_traits<G>::traversal_category</tt><br><br>
|
||||
This tag type must be convertible to <tt>bidirectional_graph_tag</tt>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<TR>
|
||||
<TD><pre>boost::graph_traits<G>::in_edge_iterator</pre>
|
||||
An in-edge iterator for a vertex <i>v</i> provides access to the
|
||||
@@ -85,7 +87,11 @@ meet the requirements of <a href="../../utility/MultiPassInputIterator.html">Mul
|
||||
<TD>
|
||||
Returns an iterator-range providing access to the
|
||||
in-edges (for directed graphs) or incident edges (for
|
||||
undirected graphs) of vertex <TT>v</TT> in graph <TT>g</TT>.<br>
|
||||
undirected graphs) of vertex <TT>v</TT> in graph <TT>g</TT>.
|
||||
For both directed and undirected graphs, the target of
|
||||
an out-edge is required to be vertex <tt>v</tt> and the
|
||||
source is required to be a vertex that is adjacent to <tt>v</tt>.
|
||||
<br>
|
||||
Return type: <TT>std::pair<in_edge_iterator, in_edge_iterator></TT>
|
||||
</TD>
|
||||
</TR>
|
||||
@@ -134,7 +140,7 @@ undirected graphs).
|
||||
|
||||
<PRE>
|
||||
template <class G>
|
||||
struct BidirectionalGraph_concept
|
||||
struct BidirectionalGraphConcept
|
||||
{
|
||||
typedef typename boost::graph_traits<G>::in_edge_iterator
|
||||
in_edge_iterator;
|
||||
@@ -161,8 +167,8 @@ undirected graphs).
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,20 +2,16 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Buffer</Title>
|
||||
</HEAD>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -49,7 +45,7 @@ For a type to model the Buffer concept it must have the following members.
|
||||
|
||||
<tr> <td> <tt>value_type</tt> </td>
|
||||
<td> The type of object stored in the Buffer. The value type
|
||||
must be <A href="http://www.sgi.com/Technology/STL/Assignable.html">Assignable</a>.</td>
|
||||
must be <A href="http://www.sgi.com/tech/stl/Assignable.html">Assignable</a>.</td>
|
||||
</tr>
|
||||
|
||||
<tr> <td> <tt>size_type</tt> </td>
|
||||
@@ -78,7 +74,7 @@ For a type to model the Buffer concept it must have the following members.
|
||||
Precondition: <tt>empty()</tt> is <tt>false</tt>.</td>
|
||||
</tr>
|
||||
|
||||
<tr> <td> <tt>void size() const</tt> </td>
|
||||
<tr> <td> <tt>size_type size() const</tt> </td>
|
||||
<td> Returns the number of objects in the Buffer.
|
||||
Invariant: <tt>size() >= 0</tt>. </td>
|
||||
</tr>
|
||||
@@ -103,9 +99,8 @@ most linear time complexity in the size of the Generalized Queue.
|
||||
<h3>Models</h3>
|
||||
|
||||
<UL>
|
||||
<LI><a href="http://www.sgi.com/Technology/STL/stack.html"><tt>std::stack</tt></a>
|
||||
<LI><a href="../../pri_queue/queue.html"><tt>boost::queue</tt></a>
|
||||
<LI><a href="../../pri_queue/p_queue.html"><tt>boost::priority_queue</tt></a>
|
||||
<LI><a href="http://www.sgi.com/tech/stl/stack.html"><tt>std::stack</tt></a>
|
||||
<LI><a href="../../../boost/pending/mutable_queue.hpp"><tt>boost::mutable_queue</tt></a>
|
||||
</UL>
|
||||
|
||||
<p>
|
||||
@@ -114,8 +109,8 @@ most linear time complexity in the size of the Generalized Queue.
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame and C++ Library & Compiler Group/SGI (<A HREF="mailto:jsiek@engr.sgi.com">jsiek@engr.sgi.com</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University and C++ Library & Compiler Group/SGI (<A HREF="mailto:jsiek@engr.sgi.com">jsiek@engr.sgi.com</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. We make no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: ColorValue Concept</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -32,9 +28,9 @@ mark which vertices have been visited.
|
||||
<P>
|
||||
|
||||
<h3>Refinement of</h3> <a
|
||||
href="http://www.sgi.com/Technology/STL/EqualityComparable.html">EqualityComparable</a>
|
||||
href="http://www.sgi.com/tech/stl/EqualityComparable.html">EqualityComparable</a>
|
||||
and <a
|
||||
href="http://www.sgi.com/Technology/STL/DefaultConstructible.html">DefaultConstructible</a>
|
||||
href="http://www.sgi.com/tech/stl/DefaultConstructible.html">DefaultConstructible</a>
|
||||
|
||||
|
||||
<h3>Notation</h3>
|
||||
@@ -62,21 +58,21 @@ href="http://www.sgi.com/Technology/STL/DefaultConstructible.html">DefaultConstr
|
||||
|
||||
<tr>
|
||||
<td>Get Color White </td>
|
||||
<TD><TT>white(cv)</TT></TD>
|
||||
<TD><TT>color_traits<T>::white()</TT></TD>
|
||||
<TD><TT>T</TT></TD>
|
||||
<TD>Returns an object that represents the color white.</TD>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<td>Get Color Gray </td>
|
||||
<TD><TT>gray(cv)</TT></TD>
|
||||
<TD><TT>color_traits<T>::gray()</TT></TD>
|
||||
<TD><TT>T</TT></TD>
|
||||
<TD>Returns an object that represents the color gray.</TD>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<td>Get Color Black </td>
|
||||
<TD><TT>black(cv)</TT></TD>
|
||||
<TD><TT>color_traits<T>::black()</TT></TD>
|
||||
<TD><TT>T</TT></TD>
|
||||
<TD>Returns an object that represents the color black.</TD>
|
||||
</TR>
|
||||
@@ -98,14 +94,14 @@ href="http://www.sgi.com/Technology/STL/DefaultConstructible.html">DefaultConstr
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,42 +2,38 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. We make no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>DFSVisitor</Title>
|
||||
<Title>DFS Visitor</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1>DFSVisitor Concept</H1>
|
||||
<H1><img src="figs/python.gif" alt="(Python)"/>DFS Visitor Concept</H1>
|
||||
|
||||
This concept defines the visitor interface for <a
|
||||
href="./depth_first_search.html"><tt>depth_first_search()</tt></a>.
|
||||
Users can define a class with the DFSVisitor interface and pass and
|
||||
Users can define a class with the DFS Visitor interface and pass an
|
||||
object of the class to <tt>depth_first_search()</tt>, thereby
|
||||
augmenting the actions taken during the graph search.
|
||||
|
||||
<h3>Refinement of</h3>
|
||||
|
||||
none
|
||||
<p>
|
||||
<a href="../../utility/CopyConstructible.html">Copy Constructible</a>
|
||||
(copying a visitor should be a lightweight operation).
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<TR>
|
||||
<TD><tt>V</tt></TD>
|
||||
<TD>A type that is a model of DFSVisitor.</TD>
|
||||
<TD>A type that is a model of DFS Visitor.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
@@ -132,7 +128,14 @@ form the search tree.</td>
|
||||
<td><tt>vis.back_edge(e, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on the back edges in the graph.
|
||||
This is invoked on the back edges in the graph. For an undirected
|
||||
graph there is some ambiguity between tree edges and back edges since
|
||||
the edge <i>(u,v)</i> and <i>(v,u)</i> are the same edge, but both the
|
||||
<tt>tree_edge()</tt> and <tt>back_edge()</tt> functions will be
|
||||
invoked. One way to resolve this ambiguity is to record the tree
|
||||
edges, and then disregard the back-edges that are already marked as
|
||||
tree edges. An easy way to record tree edges is to record
|
||||
predecessors at the <tt>tree_edge</tt> event point.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -151,9 +154,11 @@ undirected graph this method is never called.
|
||||
<td><tt>vis.finish_vertex(u, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This invoked on a vertex after all of its out edges have been added to the
|
||||
search tree and all of the adjacent vertices have been discovered
|
||||
(but before their out-edges have been examined).
|
||||
This is invoked on vertex <tt>u</tt> after <tt>finish_vertex</tt> has
|
||||
been called for all the vertices in the DFS-tree rooted at vertex
|
||||
<tt>u</tt>. If vertex <tt>u</tt> is a leaf in the DFS-tree, then
|
||||
the <tt>finish_vertex</tt> function is call on <tt>u</tt> after
|
||||
all the out-edges of <tt>u</tt> have been examined.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -165,19 +170,42 @@ search tree and all of the adjacent vertices have been discovered
|
||||
<li><a href="./dfs_visitor.html"><tt>dfs_visitor</tt></a>
|
||||
</ul>
|
||||
|
||||
<a name="python"></a>
|
||||
<h3>Python</h3>
|
||||
|
||||
To implement a model of the <tt>DFSVisitor</tt> concept in Python,
|
||||
create a new class that derives from the <tt>DFSVisitor</tt> type of
|
||||
the graph, which will be
|
||||
named <tt><i>GraphType</i>.DFSVisitor</tt>. The events and syntax are
|
||||
the same as with visitors in C++. Here is an example for the
|
||||
Python <tt>bgl.Graph</tt> graph type:
|
||||
|
||||
<pre>
|
||||
class count_tree_edges_dfs_visitor(bgl.Graph.DFSVisitor):
|
||||
def __init__(self, name_map):
|
||||
bgl.Graph.DFSVisitor.__init__(self)
|
||||
self.name_map = name_map
|
||||
|
||||
def tree_edge(self, e, g):
|
||||
(u, v) = (g.source(e), g.target(e))
|
||||
print "Tree edge ",
|
||||
print self.name_map[u],
|
||||
print " -> ",
|
||||
print self.name_map[v]
|
||||
</pre>
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,43 +2,40 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. We make no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: UniformCostVisitor</Title>
|
||||
<Title>Boost Graph Library: Dijkstra Visitor</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1>UniformCostVisitor Concept</H1>
|
||||
<H1><img src="figs/python.gif" alt="(Python)"/>Dijkstra Visitor Concept</H1>
|
||||
|
||||
This concept defines the visitor interface for <a
|
||||
href="./uniform_cost_search.html"><tt>uniform_cost_search()</tt></a>
|
||||
href="./dijkstra_shortest_paths.html"><tt>dijkstra_shortest_paths()</tt></a>
|
||||
and related algorithms. The user can create a class that matches this
|
||||
interface, and then pass objects of the class into
|
||||
<tt>uniform_cost_search()</tt> to augment the actions taken during the
|
||||
search.
|
||||
<tt>dijkstra_shortest_paths()</tt> to augment the actions taken during
|
||||
the search.
|
||||
|
||||
<h3>Refinement of</h3>
|
||||
|
||||
none
|
||||
<p>
|
||||
<a href="../../utility/CopyConstructible.html">Copy Constructible</a>
|
||||
(copying a visitor should be a lightweight operation).
|
||||
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<TR>
|
||||
<TD><tt>V</tt></TD>
|
||||
<TD>A type that is a model of UniformCostVisitor.</TD>
|
||||
<TD>A type that is a model of Dijkstra Visitor.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
@@ -68,7 +65,7 @@ none
|
||||
|
||||
<TR>
|
||||
<TD><tt>DistanceMap</tt></TD>
|
||||
<TD>A type that is a model of <a href="../../property_map/ReadWritePropertyMap.html">ReadWritePropertyMap</a>.</TD>
|
||||
<TD>A type that is a model of <a href="../../property_map/ReadWritePropertyMap.html">Read/Write Property Map</a>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
@@ -78,7 +75,7 @@ none
|
||||
|
||||
<TR>
|
||||
<TD><tt>WeightMap</tt></TD>
|
||||
<TD>A type that is a model of <a href="../../property_map/ReadWritePropertyMap.html">ReadablePropertyMap</a>.</TD>
|
||||
<TD>A type that is a model of <a href="../../property_map/ReadWritePropertyMap.html">Readable Property Map</a>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
@@ -110,20 +107,13 @@ This is invoked one each vertex of the graph when it is initialized.
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Start Vertex</td>
|
||||
<td><tt>vis.start_vertex(u, g)</tt></td>
|
||||
<td>Examine Vertex</td>
|
||||
<td><tt>vis.examine_vertex(u, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on the source vertex at the beginning of the algorithm.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Discover Vertex</td>
|
||||
<td><tt>vis.discover_vertex(u, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked when a vertex is encountered for the first time.
|
||||
This is invoked on a vertex as it is popped from the queue. This
|
||||
happens immediately before <tt>examine_edge()</tt> is invoked
|
||||
on each of the out-edges of vertex <tt>u</tt>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -136,6 +126,15 @@ This is invoked on every out-edge of each vertex after it is discovered.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Discover Vertex</td>
|
||||
<td><tt>vis.discover_vertex(u, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked when a vertex is encountered for the first time.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Edge Relaxed</td>
|
||||
<td><tt>vis.edge_relaxed(e, g)</tt></td>
|
||||
@@ -178,21 +177,45 @@ search tree and all of the adjacent vertices have been discovered
|
||||
<h3>Models</h3>
|
||||
|
||||
<ul>
|
||||
<li><a href="./ucs_visitor.html"><tt>ucs_visitor</tt></a>
|
||||
<li><a href="./dijkstra_visitor.html"><tt>dijkstra_visitor</tt></a>
|
||||
</ul>
|
||||
|
||||
<a name="python"></a>
|
||||
<h3>Python</h3>
|
||||
|
||||
To implement a model of the <tt>DijkstraVisitor</tt> concept in Python,
|
||||
create a new class that derives from the <tt>DijkstraVisitor</tt> type of
|
||||
the graph, which will be
|
||||
named <tt><i>GraphType</i>.DijkstraVisitor</tt>. The events and syntax are
|
||||
the same as with visitors in C++. Here is an example for the
|
||||
Python <tt>bgl.Graph</tt> graph type:
|
||||
|
||||
<pre>
|
||||
class count_tree_edges_dijkstra_visitor(bgl.Graph.DijkstraVisitor):
|
||||
def __init__(self, name_map):
|
||||
bgl.Graph.DijkstraVisitor.__init__(self)
|
||||
self.name_map = name_map
|
||||
|
||||
def edge_relaxed(self, e, g):
|
||||
(u, v) = (g.source(e), g.target(e))
|
||||
print "Relaxed edge ",
|
||||
print self.name_map[u],
|
||||
print " -> ",
|
||||
print self.name_map[v]
|
||||
</pre>
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>EdgeListGraph</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -58,6 +54,12 @@ edges in the graph.
|
||||
|
||||
<table border>
|
||||
|
||||
<tr>
|
||||
<td><tt>boost::graph_traits<G>::traversal_category</tt><br><br>
|
||||
This tag type must be convertible to <tt>edge_list_graph_tag</tt>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><pre>boost::graph_traits<G>::edge_iterator</pre>
|
||||
An edge iterator (obtained via <TT>edges(g)</TT>) provides access to
|
||||
@@ -174,8 +176,8 @@ must all return in constant time.
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2001
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Edge Mutable Graph</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
|
||||
<H2><A NAME="concept:EdgeMutableGraph">
|
||||
Edge Mutable Graph
|
||||
</H2>
|
||||
|
||||
The <I>Edge Mutable Graph</I> concept defines the interface for a
|
||||
graph that supports the addition and removal of edges.
|
||||
|
||||
<H3>Refinement of</H3>
|
||||
|
||||
<a href="./Graph.html">Graph</a>
|
||||
|
||||
<H3>Associated Types</H3>
|
||||
|
||||
No additional associated types.
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
<ul>
|
||||
|
||||
<li><a name="sec:add_edge"><TT>add_edge(u, v, g)</TT></a>
|
||||
<b>returns</b> <TT>std::pair<edge_descriptor, bool></TT>
|
||||
<br><br>
|
||||
|
||||
<b>Semantics:</b> Try to insert the edge <i>(u,v)</i> into the graph,
|
||||
returning the inserted edge or a parallel edge and a flag that
|
||||
specifies whether an edge was inserted. This operation must not
|
||||
invalidate vertex descriptors or vertex iterators of the graph, though
|
||||
it may invalidate edge descriptors or edge iterators.<br>
|
||||
|
||||
<b>Preconditions:</b> <i>u</i> and <i>v</i> are vertices in the
|
||||
graph. <br>
|
||||
|
||||
<b>Postconditions:</b> <i>(u,v)</i> is in the edge set of
|
||||
the graph. The returned edge descriptor will have <i>u</i> in the
|
||||
source position and <i>v</i> in the target position. If the graph
|
||||
allows parallel edges, then the returned flag is always
|
||||
<tt>true</tt>. If the graph does not allow parallel edges, if
|
||||
<i>(u,v)</i> was already in the graph then the returned flag is
|
||||
<tt>false</tt>. If <i>(u,v)</i> was not in the graph then the returned
|
||||
flag is <tt>true</tt>.<br>
|
||||
</li><br>
|
||||
|
||||
<li><a name="sec:remove_edge_by_pair"><tt>remove_edge(u, v, g)</tt></a>
|
||||
<b>returns</b> <tt>void</tt><br><br>
|
||||
<b>Semantics:</b> Remove the edge <i>(u,v)</i> from the graph. If the
|
||||
graph allows parallel edges this removes all occurrences of <i>(u,v)</i>. <br>
|
||||
<b>Precondition:</b> <i>(u,v)</i> is in the edge set of the graph. <br>
|
||||
<b>Postcondition:</b> <i>(u,v)</i> is no longer in the edge set of the graph. <br>
|
||||
</li><br>
|
||||
|
||||
<li>
|
||||
<a name="sec:remove_edge"><tt>remove_edge(e, g)</tt></a>
|
||||
<b>returns</b> <tt>void</tt><br><br>
|
||||
<b>Semantics:</b> Remove the edge <i>e</i> from the graph.<br>
|
||||
<b>Precondition:</b> <i>e</i> is an edge in the graph. <br>
|
||||
<b>Postcondition:</b> <i>e</i> is no longer in the edge set for <tt>g</tt>. <br>
|
||||
</li><br>
|
||||
|
||||
<li>
|
||||
<a name="sec:clear_vertex"><tt>clear_vertex(u, g)</tt></a>
|
||||
<b>returns</b> <tt>void</tt><br><br>
|
||||
<b>Semantics:</b> Remove all edges to and from vertex <i>u</i> from the graph. <br>
|
||||
<b>Precondition:</b> <i>u</i> is a valid vertex descriptor of
|
||||
<tt>g</tt>. <br> <b>Postconditions:</b> <i>u</i> does not appear as a
|
||||
source or target of any edge in <tt>g</tt>.
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
<H3>Complexity guarantees</H3>
|
||||
|
||||
<P>
|
||||
UNDER CONSTRUCTION
|
||||
|
||||
<H3>See Also</H3>
|
||||
|
||||
<a href="./graph_concepts.html">Graph concepts</a>
|
||||
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. We make no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: EventVisitor</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -60,8 +56,8 @@ namespace boost {
|
||||
|
||||
<h3>Refinement of</h3>
|
||||
|
||||
none
|
||||
<p>
|
||||
<a href="../../utility/CopyConstructible.html">Copy Constructible</a>
|
||||
(copying a visitor should be a lightweight operation).
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
@@ -151,14 +147,14 @@ either a vertex or edge descriptor of the graph.
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. We make no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: EventVisitorList</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -117,14 +113,14 @@ std::make_pair(<i>visitor1</i>,
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Graph</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -26,10 +22,9 @@ Graph
|
||||
<P>
|
||||
The Graph concept contains a few requirements that are common to all
|
||||
the graph concepts. These include some associated types for
|
||||
<tt>vertex_descriptor</tt>, <tt>edge_descriptor</tt>, etc., and the
|
||||
<tt>num_vertices()</tt> and <tt>num_edges()</tt> functions. One should
|
||||
<tt>vertex_descriptor</tt>, <tt>edge_descriptor</tt>, etc. One should
|
||||
note that a model of Graph is <B>not</B> required to be a model of <a
|
||||
href="http://www.sgi.com/Technology/STL/Assignable.html">Assignable</a>,
|
||||
href="http://www.sgi.com/tech/stl/Assignable.html">Assignable</a>,
|
||||
so algorithms should pass graph objects by reference.
|
||||
|
||||
<P>
|
||||
@@ -56,9 +51,9 @@ so algorithms should pass graph objects by reference.
|
||||
A vertex descriptor corresponds to a unique vertex in an abstract
|
||||
graph instance. A vertex descriptor must be
|
||||
<a
|
||||
href="http://www.sgi.com/Technology/STL/DefaultConstructible.html">DefaultConstructible</a>,
|
||||
<a href="http://www.sgi.com/Technology/STL/Assignable.html">Assignable</a>, and
|
||||
<a href="http://www.sgi.com/Technology/STL/EqualityComparable.html">EqualityComparable</a>.
|
||||
href="http://www.sgi.com/tech/stl/DefaultConstructible.html">Default Constructible</a>,
|
||||
<a href="http://www.sgi.com/tech/stl/Assignable.html">Assignable</a>, and
|
||||
<a href="http://www.sgi.com/tech/stl/EqualityComparable.html">Equality Comparable</a>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -66,16 +61,16 @@ href="http://www.sgi.com/Technology/STL/DefaultConstructible.html">DefaultConstr
|
||||
<td><pre>boost::graph_traits<G>::edge_descriptor</pre>
|
||||
An edge descriptor corresponds to a unique edge <i>(u,v)</i> in a
|
||||
graph. An edge descriptor must be <a
|
||||
href="http://www.sgi.com/Technology/STL/DefaultConstructible.html">DefaultConstructible</I>,
|
||||
href="http://www.sgi.com/tech/stl/DefaultConstructible.html">Default Constructible</I>,
|
||||
<a
|
||||
href="http://www.sgi.com/Technology/STL/Assignable.html">Assignable</a>,
|
||||
and <a href="http://www.sgi.com/Technology/STL/EqualityComparable.html">EqualityComparable</a>.
|
||||
href="http://www.sgi.com/tech/stl/Assignable.html">Assignable</a>,
|
||||
and <a href="http://www.sgi.com/tech/stl/EqualityComparable.html">Equality Comparable</a>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><pre>boost::graph_traits<G>::directed_category</pre>
|
||||
The choices are <TT>directed_tag</TT> and <TT>undirected_tag</TT>.
|
||||
This type shall be convertible to <TT>directed_tag</TT> or <TT>undirected_tag</TT>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -87,12 +82,32 @@ are <TT>allow_parallel_edge_tag</TT> and <TT>disallow_parallel_edge_tag</TT>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><pre>boost::graph_traits<G>::traversal_category</pre>
|
||||
This describes the ways in which the vertices and edges of the
|
||||
graph can be visited. The choices are <TT>incidence_graph_tag</TT>,
|
||||
<TT>adjacency_graph_tag</TT>, <TT>bidirectional_graph_tag</TT>,
|
||||
<TT>vertex_list_graph_tag</TT>, <TT>edge_list_graph_tag</TT>, and
|
||||
<TT>adjacency_matrix_tag</TT>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<H3>Valid Expressions</H3>
|
||||
|
||||
None required.
|
||||
<table border>
|
||||
|
||||
<tr>
|
||||
<td><pre>boost::graph_traits<G>::null_vertex()</pre></td></TD>
|
||||
<td>
|
||||
Returns a special <tt>boost::graph_traits<G>::vertex_descriptor</tt> object which does not refer to
|
||||
any vertex of graph object which type is <tt>G</tt>.
|
||||
<td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
<H3>Concept Checking Class</H3>
|
||||
|
||||
@@ -104,6 +119,7 @@ None required.
|
||||
typedef typename boost::graph_traits<G>::edge_descriptor edge_descriptor;
|
||||
typedef typename boost::graph_traits<G>::directed_category directed_category;
|
||||
typedef typename boost::graph_traits<G>::edge_parallel_category edge_parallel_category;
|
||||
typedef typename boost::graph_traits<G>::traversal_category traversal_category;
|
||||
|
||||
void constraints() {
|
||||
function_requires< DefaultConstructibleConcept<vertex_descriptor> >();
|
||||
@@ -125,8 +141,8 @@ None required.
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. We make no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>IncidenceGraph</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -50,8 +46,8 @@ efficient access to the out-edges of each vertex in the graph.
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>v</tt></TD>
|
||||
<TD>An object of type <tt>boost::graph_traits<G>::vertex_descriptor</tt>.</TD>
|
||||
<TD><tt>u, v</tt></TD>
|
||||
<TD>Are objects of type <tt>boost::graph_traits<G>::vertex_descriptor</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
@@ -60,6 +56,13 @@ efficient access to the out-edges of each vertex in the graph.
|
||||
|
||||
<Table border>
|
||||
|
||||
<tr>
|
||||
<td><tt>boost::graph_traits<G>::traversal_category</tt><br><br>
|
||||
This tag type must be convertible to <tt>incidence_graph_tag</tt>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
<TR>
|
||||
<TD>
|
||||
<pre>boost::graph_traits<G>::out_edge_iterator</pre>
|
||||
@@ -85,7 +88,7 @@ out-edges or incident edges of a vertex.
|
||||
<Table border>
|
||||
|
||||
<tr>
|
||||
<td><a name="sec:source"><TT>source(e, g)</TT></a></TD>
|
||||
<td><a name="sec:source"><TT>source(e, g)</TT></a></TD>
|
||||
<TD>Returns the vertex descriptor for <i>u</i> of the edge <i>(u,v)</i> represented by <TT>e</TT>.<br>
|
||||
Return type: <TT>vertex_descriptor</TT>
|
||||
</TD>
|
||||
@@ -93,24 +96,29 @@ Return type: <TT>vertex_descriptor</TT>
|
||||
|
||||
|
||||
<tr>
|
||||
<td><a name="sec:target"><TT>target(e, g)</TT></a></TD>
|
||||
<td><a name="sec:target"><TT>target(e, g)</TT></a></TD>
|
||||
<TD>Returns the vertex descriptor for <i>v</i> of the edge <i>(u,v)</i> represented by <TT>e</TT>.<br>
|
||||
Return type: <TT>vertex_descriptor</TT>
|
||||
</td></tr>
|
||||
|
||||
<tr>
|
||||
<td><a name="sec:out-edges"><TT>out_edges(v, g)</TT></a></TD>
|
||||
<TD>Returns an iterator-range providing access to the
|
||||
out-edges (for directed graphs) or incident edges (for
|
||||
undirected graphs) of vertex <TT>v</TT> in graph <TT>g</TT>.<br>
|
||||
<td><a name="sec:out-edges"><TT>out_edges(u, g)</TT></a></TD>
|
||||
<TD>Returns an iterator-range providing access to the out-edges (for
|
||||
directed graphs) or incident edges (for undirected graphs) of vertex
|
||||
<TT>u</TT> in graph <TT>g</TT>. The source vertex of an edge obtained
|
||||
via an out edge iterator is guaranteed (for both directed and
|
||||
undirected graphs) to be the vertex <tt>u</tt> used in the call to
|
||||
<tt>out_edges(u, g)</tt> and the target vertex must the a vertex
|
||||
adjacent to <tt>u</tt>.<a href="#1">[1]</a>
|
||||
<br>
|
||||
Return type: <TT>std::pair<out_edge_iterator, out_edge_iterator></TT>
|
||||
</TD>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<TD><TT>out_degree(v, g)</TT></TD>
|
||||
<TD><TT>out_degree(u, g)</TT></TD>
|
||||
<TD>Returns the number of out-edges (for directed graphs) or the
|
||||
number of incident edges (for undirected graphs) of vertex <TT>v</TT>
|
||||
number of incident edges (for undirected graphs) of vertex <TT>u</TT>
|
||||
in graph <TT>g</TT>.<br>
|
||||
Return type: <TT>degree_size_type</TT>
|
||||
</TD>
|
||||
@@ -133,6 +141,19 @@ function must be linear in the number of out-edges.
|
||||
|
||||
<a href="./graph_concepts.html">Graph concepts</a>
|
||||
|
||||
<H3>Notes</H3>
|
||||
|
||||
<a name="1">[1]</a> For undirected graphs, the edge <tt>(u,v)</tt> is
|
||||
the same as edge <tt>(v,u)</tt>, so without some extra guarantee an
|
||||
implementation would be free use any ordering for the pair of vertices
|
||||
in an out-edge. For example, if you call <tt>out_edges(u, g)</tt>, and
|
||||
<tt>v</tt> is one of the vertices adjacent to <tt>u</tt>, then the
|
||||
implementation would be free to return <tt>(v,u)</tt> as an out-edge
|
||||
which would be non-intuitive and cause trouble for algorithms.
|
||||
Therefore, the extra requirement is added that the out-edge connecting
|
||||
<tt>u</tt> and <tt>v</tt> must be given as <tt>(u,v)</tt> and not
|
||||
<tt>(v,u)</tt>.
|
||||
|
||||
<H3>Concept Checking Class</H3>
|
||||
|
||||
<PRE>
|
||||
@@ -144,13 +165,13 @@ function must be linear in the number of out-edges.
|
||||
function_requires< GraphConcept<G> >();
|
||||
function_requires< MultiPassInputIteratorConcept<out_edge_iterator> >();
|
||||
|
||||
p = out_edges(v, g);
|
||||
p = out_edges(u, g);
|
||||
e = *p.first;
|
||||
u = source(e, g);
|
||||
v = target(e, g);
|
||||
}
|
||||
void const_constraints(const G& g) {
|
||||
p = out_edges(v, g);
|
||||
p = out_edges(u, g);
|
||||
e = *p.first;
|
||||
u = source(e, g);
|
||||
v = target(e, g);
|
||||
@@ -167,14 +188,14 @@ function must be linear in the number of out-edges.
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -0,0 +1,161 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>IteratorConstructibleGraph</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1><A NAME="concept:IteratorConstructibleGraph"></A>
|
||||
IteratorConstructibleGraph
|
||||
</H1>
|
||||
|
||||
The IteratorConstructibleGraph concept describes the interface for
|
||||
graph types that can be constructed using a kind of edge iterator. The
|
||||
edge iterator can be any <a
|
||||
href="http://www.sgi.com/tech/stl/InputIterator.html">InputIterator</a>
|
||||
that dereferences to a pair of integers <i>(i,j)</i>, which represent
|
||||
an edge that should be in the graph. The two integers <i>i</i> and
|
||||
<i>j</i> represent vertices where <i>0 <= i < |V|</i> and <i>0 <= j <
|
||||
|V|</i>. The edge iterator's value type should be
|
||||
<tt>std::pair<T,T></tt> (or at least be a structure that has
|
||||
members <tt>first</tt> and <tt>second</tt>) and the value type
|
||||
<tt>T</tt> of the pair must be convertible to the
|
||||
<tt>vertices_size_type</tt> of the graph (an integer).
|
||||
|
||||
There are two valid expressions required by this concept, both of
|
||||
which are constructors. The first creates a graph object from a
|
||||
first/last iterator range. The second constructor also takes a
|
||||
first/last iterator range and in addition requires the number of
|
||||
vertices and number of edges. For some graph and edge iterator types
|
||||
the second constructor can be more efficient than the first.
|
||||
|
||||
<h3>Example</h3>
|
||||
|
||||
The following exampe creates two graph objects from an array of edges
|
||||
(vertex pairs). The type <tt>Edge*</tt> satisfies the requirements for
|
||||
an <a
|
||||
href="http://www.sgi.com/tech/stl/InputIterator.html">InputIterator</a>
|
||||
and can therefore be used to construct a graph.
|
||||
|
||||
<pre>
|
||||
typedef ... IteratorConstructibleGraph;
|
||||
typedef boost::graph_traits<IteratorConstructibleGraph> Traits;
|
||||
|
||||
typedef std::pair<Traits::vertices_size_type,
|
||||
Traits::vertices_size_type> Edge;
|
||||
Edge edge_array[] =
|
||||
{ Edge(0,1), Edge(0,2), Edge(0,3), Edge(0,4), Edge(0,5),
|
||||
Edge(1, 2), Edge(1,5), Edge(1,3),
|
||||
Edge(2, 4), Edge(2,5),
|
||||
Edge(3, 2),
|
||||
Edge(4, 3), Edge(4,1),
|
||||
Edge(5, 4) };
|
||||
Edge* first = edge_array,
|
||||
last = edge_array + sizeof(edge_array)/sizeof(Edge);
|
||||
|
||||
IteratorConstructibleGraph G1(first, last);
|
||||
// do something with G1 ...
|
||||
|
||||
Traits::vertices_size_type size_V = 6;
|
||||
Traits::edges_size_type size_E = sizeof(edge_array)/sizeof(Edge);
|
||||
IteratorConstructibleGraph G2(first, last, size_V, size_E);
|
||||
// do something with G2 ...
|
||||
</pre>
|
||||
|
||||
<h3>Refinement of</h3>
|
||||
|
||||
<a href="Graph.html">Graph</a>
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<tr>
|
||||
<td><tt>G</tt></td>
|
||||
<td>is a graph type that models IteratorConstructibleGraph.</td>
|
||||
<tr>
|
||||
|
||||
<tr>
|
||||
<td><tt>g</tt></td>
|
||||
<td>is an object of type <tt>G</tt>.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><tt>first, last</tt></td>
|
||||
<td>are edge iterators (see above).</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><tt>Tr</tt></td>
|
||||
<td>is an object of type <tt>graph_traits<G></tt>.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><tt>n_vertices</tt></td>
|
||||
<td>is an object of type <tt>Tr::vertices_size_type</tt>.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><tt>n_edges</tt></td>
|
||||
<td>is an object of type <tt>Tr::edges_size_type</tt>.</td>
|
||||
</tr>
|
||||
|
||||
</Table>
|
||||
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
<Table border>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<pre>G g(first, last);</pre>
|
||||
Construct graph object <tt>g</tt> given an edge range <tt>[first,last)</tt>.
|
||||
</td>
|
||||
<tr>
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<pre>G g(first, last, n_vertices, n_edges);</pre>
|
||||
Construct graph object <tt>g</tt> given an edge range
|
||||
<tt>[first,last)</tt>, the number of vertices, and the number of
|
||||
edges. Sometimes this constructor is more efficient than the
|
||||
constructor lacking the graph size information.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</Table>
|
||||
|
||||
|
||||
<!--
|
||||
<H3>Concept Checking Class</H3>
|
||||
|
||||
<PRE>
|
||||
</PRE>
|
||||
-->
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -0,0 +1,101 @@
|
||||
# Copyright (c) 2002 Trustees of Indiana University
|
||||
#
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
DVIPS = dvips
|
||||
|
||||
LATEX = latex
|
||||
LATEXOUT = dvi
|
||||
RESULT = ps
|
||||
|
||||
LATEX = pdflatex
|
||||
LATEXOUT = pdf
|
||||
RESULT = pdf
|
||||
|
||||
.SUFFIXES: .tex .dvi .ps .pdf .c .lg .eps .fig .gif .dot .w .cpp .o .exe
|
||||
|
||||
.tex.$(LATEXOUT):
|
||||
@ if test ! -f $*.ind; then echo "" > $*.ind; fi
|
||||
@ $(LATEX) $*
|
||||
@ if ( grep 'LaTeX Warning: Label(s) may' $*.log > /dev/null ); \
|
||||
then $(LATEX) $* ; fi
|
||||
@ if ( grep 'LaTeX Warning: Citation' $*.log > /dev/null ); \
|
||||
then bibtex $* ; $(LATEX) $* ; fi
|
||||
@ if ( grep 'LaTeX Warning: Label(s) may' $*.log > /dev/null ); \
|
||||
then $(LATEX) $* ; fi
|
||||
@ if ( grep 'LaTeX Warning: Label(s) may' $*.log > /dev/null ); \
|
||||
then $(LATEX) $* ; fi
|
||||
@ if ( grep 'Writing index file' $*.log > /dev/null ); \
|
||||
then makeindex $* ; $(LATEX) $* ; fi
|
||||
@ if ( grep 'LaTeX Warning: Label(s) may' $*.log > /dev/null ); \
|
||||
then $(LATEX) $* ; fi
|
||||
@ if ( grep 'LaTeX Warning: Label(s) may' $*.log > /dev/null ); \
|
||||
then $(LATEX) $* ; fi
|
||||
|
||||
.dvi.ps:
|
||||
$(DVIPS) -t letter -o $*.ps $*
|
||||
|
||||
.eps.pdf:
|
||||
epstopdf $*.eps
|
||||
|
||||
.dot.eps:
|
||||
dot -Tps -o $*.eps $*.dot
|
||||
|
||||
.w.tex: /afs/nd.edu/user11/jsiek/.jweb
|
||||
jweb -np $*.w
|
||||
|
||||
BOOST = $(HOME)/boost
|
||||
BOOST_ALGO = $(HOME)/boost.algorithm
|
||||
CXX = c++
|
||||
INCLUDES = -I$(BOOST) -I$(BOOST_ALGO)
|
||||
#OPT = +K2 --display_error_number --diag_suppress=186
|
||||
OPT = -Wall -Wno-long-double -ftemplate-depth-30
|
||||
CXXFLAGS = $(OPT) $(INCLUDES)
|
||||
|
||||
.cpp.o:
|
||||
$(CXX) $(CXXFLAGS) $< -c
|
||||
|
||||
|
||||
JWEB = isomorphism-impl.w isomorphism-impl-v3.w
|
||||
DOT = out.dot in.dot iso-eg.dot iso-eg2.dot
|
||||
EPS_GEN = $(DOT:.dot=.eps)
|
||||
WEBTEX = $(JWEB:.w=.tex)
|
||||
PDFPICT = $(EPS_GEN:.eps=.pdf)
|
||||
|
||||
default: isomorphism-impl-v3.$(RESULT)
|
||||
|
||||
final: isomorphism-impl-v3.$(RESULT)
|
||||
$(LATEX) isomorphism-impl-v3
|
||||
csh ./mungeaux.csh *.aux
|
||||
$(LATEX) isomorphism-impl-v3
|
||||
|
||||
#isomorphism-impl.dvi: $(EPS_GEN) $(WEBTEX)
|
||||
#isomorphism-impl.ps: isomorphism-impl.dvi
|
||||
#isomorphism-impl.pdf: $(EPS_GEN) $(PDFPICT) $(WEBTEX)
|
||||
#isomorphism.hpp: isomorphism-impl.w isomorphism-impl.tex
|
||||
|
||||
isomorphism-impl-v3.dvi: $(DOT) $(EPS_GEN) $(WEBTEX)
|
||||
isomorphism-impl-v3.ps: isomorphism-impl-v3.dvi
|
||||
isomorphism-impl-v3.pdf: $(EPS_GEN) $(PDFPICT) $(WEBTEX)
|
||||
|
||||
isomorphism-v3.hpp: isomorphism-impl-v3.w isomorphism-impl-v3.tex
|
||||
|
||||
out.dot: isomorphism-impl.tex
|
||||
in.dot: isomorphism-impl.tex
|
||||
|
||||
isomorphism.o: isomorphism-v3.hpp isomorphism-impl-v3.w
|
||||
|
||||
isomorphism: isomorphism.o
|
||||
$(CXX) $(CXXFLAGS) $< -o $@ $(LIBS)
|
||||
|
||||
isomorphism-v3.hpp: isomorphism-impl-v3.tex isomorphism-impl-v3.w
|
||||
eg1-iso.o: isomorphism-impl-v3.tex isomorphism-impl-v3.w
|
||||
|
||||
eg1-iso: eg1-iso.o
|
||||
$(CXX) $(CXXFLAGS) $< -o $@ $(LIBS)
|
||||
|
||||
|
||||
clean:
|
||||
rm *.aux *.dvi $(EPS_GEN) $(PDFPICT)
|
||||
@@ -0,0 +1,122 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2001
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Monoid</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1><A NAME="concept:Monoid"></A>
|
||||
Monoid
|
||||
</H1>
|
||||
|
||||
A <i>Monoid</i> is a concept that describes a simple kind of algebraic
|
||||
system. A <b>monoid</b> consists of a set of elements <i>S</i>, a
|
||||
binary operation, and an identity element. The C++ representation of a
|
||||
monoid consists of a function object that implements the binary
|
||||
operation, a set of objects that represent the elements of <i>S</i>,
|
||||
and an object that represents the identity element.
|
||||
|
||||
|
||||
<H3>Refinement of</H3>
|
||||
|
||||
The element type must be a model of <a
|
||||
href="../../utility/Assignable.html">Assignable</a> and <a
|
||||
href="../../utility/CopyConstructible.html">CopyConstructible</a>.
|
||||
The function object type must be a model of <a
|
||||
href="http://www.sgi.com/tech/stl/BinaryFunction.html">BinaryFunction</a>.
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<TR>
|
||||
<TD><tt>X</tt></TD>
|
||||
<TD>Is the element type of the Monoid.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>a, b</tt></TD>
|
||||
<TD>are objects of type <tt>X</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>op</tt></TD>
|
||||
<TD>Is the function object implementing the Monoid operation.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>i</tt></TD>
|
||||
<TD>is an object of type <tt>X</tt> and is the identity element
|
||||
for the Monoid.</TD>
|
||||
</TR>
|
||||
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
<Table border>
|
||||
|
||||
<tr>
|
||||
<td><a name="sec:source"><TT>op(a, b)</TT></a></TD>
|
||||
<TD>See below for semantics.<br>
|
||||
Return type: <TT>X</TT>
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<TD><TT>a == b</TT></TD>
|
||||
<TD>Returns true if <tt>a</tt> and <tt>b</tt> represent
|
||||
the same element of <i>S</i>.<br>
|
||||
Return type: <TT>bool</TT>
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<TD><TT>a != b</TT></TD>
|
||||
<TD>Returns true if <tt>a</tt> and <tt>b</tt> represent
|
||||
different elements of <i>S</i>.<br>
|
||||
Return type: <TT>bool</TT>
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
</TABLE>
|
||||
|
||||
<P>
|
||||
|
||||
<H3>Invariants</H3>
|
||||
|
||||
<UL>
|
||||
<li>Closure<br>
|
||||
The result of <tt>op(a, b)</tt> is also an element of <i>S</i>.
|
||||
<li>Associativity<br>
|
||||
<tt>op(op(a, b), c) == op(a, op(b, c))</tt>
|
||||
<li>Definition of Identity Element<br>
|
||||
<tt>op(a, i) == a</tt>
|
||||
</UL>
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>MutableGraph</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -62,7 +58,7 @@ edges and vertices.
|
||||
<TR>
|
||||
<TD><tt>p</tt></TD>
|
||||
<TD>is an object of a type that models <a
|
||||
href="http://www.sgi.com/Technology/STL/Predicate.html">Predicate</a>
|
||||
href="http://www.sgi.com/tech/stl/Predicate.html">Predicate</a>
|
||||
and whose argument type matches the <tt>edge_descriptor</tt> type.
|
||||
</TR>
|
||||
|
||||
@@ -75,7 +71,18 @@ and whose argument type matches the <tt>edge_descriptor</tt> type.
|
||||
<tr>
|
||||
<TD><a name="sec:add-edge"><TT>add_edge(u, v, g)</TT></a></TD>
|
||||
<TD>
|
||||
Inserts the edge <i>(u,v)</i> into the graph.<br>
|
||||
Inserts the edge <i>(u,v)</i> into the graph, and returns an edge
|
||||
descriptor pointing to the new edge. If the graph disallows parallel
|
||||
edges, and the edge <i>(u,v)</i> is already in the graph, then the
|
||||
<tt>bool</tt> flag returned is <tt>false</tt> and the returned edge
|
||||
descriptor points to the already existing edge. Note that for
|
||||
undirected graphs, <i>(u,v)</i> is the same edge as <i>(v,u)</i>, so
|
||||
after a call to the function <tt>add_edge()</tt>, this implies that
|
||||
edge <i>(u,v)</i> will appear in the out-edges of <i>u</i> and
|
||||
<i>(u,v)</i> (or equivalently <i>(v,u)</i>) will appear in the
|
||||
out-edges of <i>v</i>. Put another way, <i>v</i> will be adjacent to
|
||||
<i>u</i> and <i>u</i> will be adjacent to <i>v</i>.
|
||||
<br>
|
||||
Return type: <TT>std::pair<edge_descriptor, bool></TT>
|
||||
</TD>
|
||||
</tr>
|
||||
@@ -84,7 +91,7 @@ Return type: <TT>std::pair<edge_descriptor, bool></TT>
|
||||
<TD><a name="sec:remove_edge"><TT>remove_edge(u, v, g)</TT></a></TD>
|
||||
<TD>
|
||||
Remove the edge <i>(u,v)</i> from the graph. If the
|
||||
graph allows parallel edges this remove all occurances of
|
||||
graph allows parallel edges this remove all occurrences of
|
||||
<i>(u,v)</i>.<br>
|
||||
Return type: <TT>void</TT><br>
|
||||
Precondition: <i>u</i> and <i>v</i> are vertices in the graph.<br>
|
||||
@@ -284,8 +291,8 @@ is no longer a valid vertex descriptor.
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>MutablePropertyGraph</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -95,16 +91,16 @@ the value of the properties can be given.
|
||||
<table border>
|
||||
|
||||
<tr>
|
||||
<TD><TT>add_edge(g, u, v, ep)</TT></TD>
|
||||
<TD><TT>add_edge(u, v, ep, g)</TT></TD>
|
||||
<TD>Inserts the edge <i>(u,v)</i> into the graph, and
|
||||
copies object <TT>ep</TT> into the property property for that edge.<br>
|
||||
copies object <TT>ep</TT> into the property for that edge.<br>
|
||||
Return type: <TT>std::pair<edge_descriptor, bool></TT></TD>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<TD><TT>add_vertex(g, vp)</TT></TD>
|
||||
<TD><TT>add_vertex(vp, g)</TT></TD>
|
||||
<TD>
|
||||
Add a new vertex to the graph and copy <TT>vp</TT> into the property
|
||||
Add a new vertex to the graph and copy <TT>vp</TT> into the
|
||||
property for the new vertex. The <TT>vertex_descriptor</TT> for the new
|
||||
vertex is returned.<br>
|
||||
Return type: <TT>vertex_descriptor</TT>
|
||||
@@ -130,8 +126,8 @@ Return type: <TT>vertex_descriptor</TT>
|
||||
typedef typename boost::graph_traits<G>::edge_descriptor edge_descriptor;
|
||||
void constraints() {
|
||||
function_requires< MutableGraphConcept<G> >();
|
||||
v = add_vertex(g, vp);
|
||||
p = add_edge(g, u, v, ep);
|
||||
v = add_vertex(vp, g);
|
||||
p = add_edge(u, v, ep, g);
|
||||
}
|
||||
G g;
|
||||
std::pair<edge_descriptor, bool> p;
|
||||
@@ -146,8 +142,8 @@ Return type: <TT>vertex_descriptor</TT>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -0,0 +1,178 @@
|
||||
<html><head><!-- Copyright 2007 Aaron Windsor
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
--
|
||||
-->
|
||||
<title>Planar Embedding Concept</title>
|
||||
</head>
|
||||
<body alink="#ff0000"
|
||||
bgcolor="#ffffff"
|
||||
link="#0000ee"
|
||||
text="#000000"
|
||||
vlink="#551a8b">
|
||||
<img src="../../../boost.png" alt="C++ Boost" height="86" width="277">
|
||||
|
||||
<br clear="">
|
||||
|
||||
<h1>Planar Embedding Concept</h1>
|
||||
|
||||
|
||||
A planar embedding is an important intermediate representation of a drawing
|
||||
of a planar graph. Instead of specifying the absolute positions of the vertices
|
||||
and edges in the plane, a planar embedding specifies their positions relative
|
||||
to one another. A planar embedding consists of a sequence, for each vertex in
|
||||
the graph, of all of the edges incident on that vertex in the order in which
|
||||
they are to be drawn around that vertex.
|
||||
<p>
|
||||
A planar embedding is a refinement of
|
||||
<a href="../../property_map/LvaluePropertyMap.html">LValuePropertyMap</a> that
|
||||
places additional restrictions the <tt>value_type</tt> used in the property
|
||||
map.
|
||||
|
||||
</p><h3>Notation</h3>
|
||||
|
||||
<table>
|
||||
<tbody>
|
||||
|
||||
<tr>
|
||||
<td> <tt>Embedding</tt> </td>
|
||||
<td> is a type that models the Planar Embedding concept.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td> <tt>embedding</tt> </td>
|
||||
<td> is an object of type <tt>Embedding</tt>. </td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td> <tt>Graph</tt> </td>
|
||||
<td> is the type of the underlying graph.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td> <tt>e</tt> </td>
|
||||
<td> is an object of type <tt>graph_traits<Graph>::edge_descriptor</tt>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td> <tt>v</tt> </td>
|
||||
<td> is an object of type <tt>graph_traits<Graph>::vertex_descriptor
|
||||
</tt>.</td>
|
||||
|
||||
</tr><tr>
|
||||
<td>
|
||||
|
||||
</td></tr></tbody></table>
|
||||
|
||||
|
||||
<h3>Associated Types</h3>
|
||||
|
||||
<table border="1">
|
||||
|
||||
<tbody><tr>
|
||||
<td> Const Iterator </td>
|
||||
<td> <tt>boost::property_traits<Embedding>::value_type::const_iterator
|
||||
</tt>
|
||||
</td>
|
||||
<td> The iterator type used to iterate over the ordering of the edges in the
|
||||
planar embedding of a particular vertex
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</tbody></table>
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
<p>
|
||||
|
||||
<table border="1">
|
||||
|
||||
<tbody><tr><th>Expression</th><th>Return Type</th><th>Description</th>
|
||||
|
||||
</tr><tr>
|
||||
<td> <tt>embedding[v].begin()</tt> </td>
|
||||
<td> <tt>boost::property_traits<Embedding>::value_type::const_iterator
|
||||
</tt></td>
|
||||
<td> Returns an iterator to the beginning of the range of edges in the
|
||||
embedding around vertex v</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td> <tt>embedding[v].end()</tt> </td>
|
||||
<td> <tt>boost::property_traits<Embedding>::value_type::const_iterator
|
||||
</tt></td>
|
||||
<td> Returns an iterator to the end of the range of edges in the
|
||||
embedding around vertex v</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td> <tt>embedding[v].clear()</tt> </td>
|
||||
<td> <tt>void</tt></td>
|
||||
<td> Clears all edges in the embedding around a vertex <tt>v</tt></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td> <tt>embedding[v].push_back(e)</tt> </td>
|
||||
<td> <tt>void</tt></td>
|
||||
<td> Adds an edge <tt>e</tt> to the end of the sequence of embedded edges
|
||||
around the vertex <tt>v</tt> </td>
|
||||
</tr>
|
||||
|
||||
</tbody></table>
|
||||
|
||||
</p><h3>Complexity Guarantees</h3>
|
||||
|
||||
Starting with an empty embedding, any mixed sequence of <i>n</i> calls to a
|
||||
particular vertex's <tt>push_back</tt> and <tt>clear</tt> should take
|
||||
<i>O(n)</i> time.
|
||||
|
||||
<h3>Models</h3>
|
||||
|
||||
Any LValue property map that maps vertices to a <tt>std::vector</tt>,
|
||||
<tt>std::list</tt>, or <tt>std::deque</tt> models this
|
||||
concept. Below is an example of using this approach to create a model of
|
||||
PlanarEmbedding:
|
||||
|
||||
<pre>
|
||||
#include <boost/property_map.hpp>
|
||||
#include <vector>
|
||||
|
||||
...
|
||||
|
||||
// Assume a graph type "Graph" defined somewhere above and
|
||||
// an instance of Graph in a variable g.
|
||||
|
||||
// A typedef for the storage - a vector of vectors of edge descriptors
|
||||
typedef
|
||||
std::vector< std::vector< graph_traits<Graph>::edge_descriptor > >
|
||||
planar_embedding_storage_t;
|
||||
|
||||
// A typedef for the iterator property map, assuming the graph has
|
||||
// an interior vertex index map
|
||||
typedef
|
||||
boost::iterator_property_map< planar_embedding_storage_t::iterator,
|
||||
property_map<Graph, vertex_index_t>::type
|
||||
>
|
||||
planar_embedding_t;
|
||||
|
||||
// Create an instance of the storage and the property map
|
||||
planar_embedding_storage_t planar_embedding_storage(num_vertices(g));
|
||||
planar_embedding_t planar_embedding(planar_embedding_storage.begin(),
|
||||
get(vertex_index, g)
|
||||
);
|
||||
|
||||
// planar_embedding can now be passed to any function expecting a model
|
||||
// of PlanarEmbedding.
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
|
||||
<br>
|
||||
</p><hr>
|
||||
Copyright © 2007 Aaron Windsor (<a href="mailto:aaron.windsor@gmail.com">
|
||||
aaron.windsor@gmail.com</a>)
|
||||
|
||||
</body></html>
|
||||
@@ -0,0 +1,148 @@
|
||||
<HTML>
|
||||
<!-- Copyright 2007 Aaron Windsor
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
--
|
||||
-->
|
||||
<HEAD>
|
||||
<TITLE>Planar Face Visitor Concept</TITLE>
|
||||
</HEAD>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1>Planar Face Visitor Concept</H1>
|
||||
|
||||
This concept defines the visitor interface for
|
||||
<a href="./planar_face_traversal.html"><tt>planar_face_traversal</tt></a>.
|
||||
Users can define a class with the Planar Face Visitor interface and pass an
|
||||
object of the class to <tt>planar_face_traversal</tt>, thereby augmenting the
|
||||
actions taken during the traversal. Note that objects passed to
|
||||
<tt>planar_face_traversal</tt> are passed by reference.
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<table>
|
||||
<tbody><tr>
|
||||
<td><tt>V</tt></td>
|
||||
<td>A type that is a model of Planar Face Visitor.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><tt>vis</tt></td>
|
||||
<td>An object of type <tt>V</tt>.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><tt>G</tt></td>
|
||||
<td>A type that is a model of Graph.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><tt>e</tt></td>
|
||||
<td>An object of type <tt>boost::graph_traits<G>::edge_descriptor</tt>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><tt>v</tt></td>
|
||||
<td>An object of type <tt>boost::graph_traits<G>::vertex_descriptor</tt>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</tbody></table>
|
||||
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
<table border="1">
|
||||
<tbody><tr>
|
||||
<th>Name</th><th>Expression</th><th>Return Type</th><th>Description</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Begin Traversal</td>
|
||||
<td><tt>vis.begin_traversal()</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked once per traversal, before the traversal begins.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Begin Face</td>
|
||||
<td><tt>vis.begin_face()</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked once for each face, before any vertices or edges on the face
|
||||
are visited.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Next Vertex</td>
|
||||
<td><tt>vis.next_vertex(v)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked when a vertex is encountered while traversing a face.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
<tr>
|
||||
<td>Next Edge</td>
|
||||
<td><tt>vis.next_edge(e)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked when an edge is encountered while traversing a face.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>End Face</td>
|
||||
<td><tt>vis.end_face()</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked once for each face, after all vertices and edges on the face
|
||||
are visited.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
<tr>
|
||||
<td>End Traversal</td>
|
||||
<td><tt>vis.end_traversal()</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked once per traversal, after the traversal ends.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</tbody></table>
|
||||
|
||||
<h3>Models</h3>
|
||||
|
||||
<ul>
|
||||
<li> The file <a href="../../../boost/graph/planar_face_traversal.hpp">
|
||||
<tt>planar_face_traversal.hpp</tt></a> contains a class
|
||||
<tt>planar_face_traversal_visitor</tt> that implements empty actions for
|
||||
all event points of a Planar Face Visitor. In the case where only a few of the
|
||||
event points of Planar Face Visitor need to be implemented, one can derive from
|
||||
<tt>planar_face_traversal_visitor</tt> and only implement the necessary event
|
||||
points. <li> The implementation of <a href="./make_maximal_planar.html">
|
||||
<tt>make_maximal_planar</tt></a> uses a <tt>triangulation_visitor</tt> that is
|
||||
a model of Planar Face Visitor.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
Copyright © 2007 Aaron Windsor (<a href="mailto:aaron.windsor@gmail.com">
|
||||
aaron.windsor@gmail.com</a>)
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>PropertyGraph</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -70,13 +66,13 @@ function which returns a property map object.
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>Property</tt></TD>
|
||||
<TD>A type that models the <a href="./Property.html">Property</a> concept.</TD>
|
||||
<TD><tt>PropertyTag</tt></TD>
|
||||
<TD>A type that models the <a href="./PropertyTag.html">PropertyTag</a> concept.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>p</tt></TD>
|
||||
<TD>An object of type <tt>Property</tt>.</td>
|
||||
<TD>An object of type <tt>PropertyTag</tt>.</td>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
@@ -91,17 +87,18 @@ function which returns a property map object.
|
||||
<table border>
|
||||
|
||||
<tr>
|
||||
<td><pre>boost::property_map<G, Property>::type</pre>
|
||||
<td><pre>boost::property_map<G, PropertyTag>::type</pre>
|
||||
The type of the property map for the property specified by
|
||||
<TT>Property</TT>. This type must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">ReadWritePropertyMap</a> with a key type the same as the graph's vertex or descriptor type.
|
||||
<TT>PropertyTag</TT>. This type must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">ReadWritePropertyMap</a>
|
||||
with a key type the same as the graph's vertex or edge descriptor type.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><pre>boost::property_map<G, Property>::const_type</pre>
|
||||
<td><pre>boost::property_map<G, PropertyTag>::const_type</pre>
|
||||
The type of the const property map for the property specified by
|
||||
<TT>Property</TT>. This type must be a model of <a
|
||||
<TT>PropertyTag</TT>. This type must be a model of <a
|
||||
href="../../property_map/ReadablePropertyMap.html">ReadablePropertyMap</a>
|
||||
with a key type the same as the graph's vertex or edge descriptor type.
|
||||
</td>
|
||||
@@ -117,16 +114,16 @@ with a key type the same as the graph's vertex or edge descriptor type.
|
||||
<td> <TT>get(p, g)</TT> </td>
|
||||
<td>
|
||||
Returns the property map for the property specified by the
|
||||
<tt>Property</tt> type. The object <tt>p</tt> is only used to
|
||||
<tt>PropertyTag</tt> type. The object <tt>p</tt> is only used to
|
||||
carry the type.<br>
|
||||
Return type: <TT>boost::property_map<G, Property>::type</TT> if <TT>g</TT> is mutable and <br><TT>boost::property_map<G, Property>::const_type</TT> otherwise.
|
||||
Return type: <TT>boost::property_map<G, PropertyTag>::type</TT> if <TT>g</TT> is mutable and <br><TT>boost::property_map<G, PropertyTag>::const_type</TT> otherwise.
|
||||
</td>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<td> <TT>get(p, g, x)</TT> </td>
|
||||
<td>
|
||||
Returns the property value (specified by the <tt>Property</tt> type)
|
||||
Returns the property value (specified by the <tt>PropertyTag</tt> type)
|
||||
associated with object <tt>x</tt> (a vertex or edge).
|
||||
The object <tt>p</tt> is only used to carry the type.
|
||||
This function is equivalent to:<br>
|
||||
@@ -138,7 +135,7 @@ Return type: <tt>boost::property_traits<Map>::value_type</tt>
|
||||
<tr>
|
||||
<td> <TT>put(p, g, x, v)</TT> </td>
|
||||
<td>
|
||||
Set the property (specified by the <tt>Property</tt> type)
|
||||
Set the property (specified by the <tt>PropertyTag</tt> type)
|
||||
associated with object <tt>x</tt> (a vertex or edge) to
|
||||
the value <tt>v</tt>. The object <tt>p</tt> is only used to carry the type.
|
||||
This function is equivalent to:<br>
|
||||
@@ -162,32 +159,32 @@ The <tt>get()</tt> property map function must be constant time.
|
||||
|
||||
|
||||
<UL>
|
||||
<LI><tt>adjacency_list</tt> with <tt>VertexProperty=property<vertex_distance_t,int,property<vertex_in_degree_t,int> ></tt> and <tt>Property=vertex_distance_t</tt>.</li>
|
||||
<li><tt>adjacency_list</tt> with <tt>VertexProperty=property<vertex_distance_t,int,property<vertex_in_degree_t,int> ></TT> and <tt>Property=vertex_in_degree_t</tt>.</li>
|
||||
<LI><tt>adjacency_list</tt> with <tt>VertexProperty=property<vertex_distance_t,int,property<vertex_in_degree_t,int> ></tt> and <tt>PropertyTag=vertex_distance_t</tt>.</li>
|
||||
<li><tt>adjacency_list</tt> with <tt>VertexPropertyTag=property<vertex_distance_t,int,property<vertex_in_degree_t,int> ></TT> and <tt>PropertyTag=vertex_in_degree_t</tt>.</li>
|
||||
</UL>
|
||||
|
||||
|
||||
<H3>Concept Checking Class</H3>
|
||||
|
||||
<PRE>
|
||||
template <class Graph, class X, class Property>
|
||||
template <class Graph, class X, class PropertyTag>
|
||||
struct PropertyGraphConcept
|
||||
{
|
||||
typedef typename property_map<G, Property>::type Map;
|
||||
typedef typename property_map<G, Property>::const_type const_Map;
|
||||
typedef typename property_map<G, PropertyTag>::type Map;
|
||||
typedef typename property_map<G, PropertyTag>::const_type const_Map;
|
||||
void constraints() {
|
||||
function_requires< GraphConcept<G> >();
|
||||
function_requires< ReadWritePropertyMapConcept<Map, X> >();
|
||||
function_requires< ReadablePropertyMapConcept<const_Map, X> >();
|
||||
|
||||
Map pmap = get(Property(), g);
|
||||
pval = get(Property(), g, x);
|
||||
put(Property(), g, x, pval);
|
||||
Map pmap = get(PropertyTag(), g);
|
||||
pval = get(PropertyTag(), g, x);
|
||||
put(PropertyTag(), g, x, pval);
|
||||
ignore_unused_variable_warning(pmap);
|
||||
}
|
||||
void const_constraints(const G& g) {
|
||||
const_Map pmap = get(Property(), g);
|
||||
pval = get(Property(), g, x);
|
||||
const_Map pmap = get(PropertyTag(), g);
|
||||
pval = get(PropertyTag(), g, x);
|
||||
ignore_unused_variable_warning(pmap);
|
||||
}
|
||||
G g;
|
||||
@@ -205,8 +202,8 @@ The <tt>get()</tt> property map function must be constant time.
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,32 +2,32 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Property</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H2><A NAME="concept:Property"></A>
|
||||
Property
|
||||
<H2><A NAME="concept:PropertyTag"></A>
|
||||
PropertyTag
|
||||
</H2>
|
||||
|
||||
A Property type is a type used to name or identify properties that are
|
||||
A Property Tag is a type used to name or identify properties that are
|
||||
attached to the vertices and edges of a graph. A Property type is not
|
||||
the type of the actual property values. Objects of the Property type
|
||||
are not used except to carry the type information which specifies the
|
||||
property.
|
||||
property. See the section about <A
|
||||
href="using_adjacency_list.html#sec:custom-edge-properties"> Custom
|
||||
Edge Properties</a> for a description of how to define your own
|
||||
property tags.
|
||||
|
||||
|
||||
<h3>Associated Types</h3>
|
||||
|
||||
@@ -35,32 +35,44 @@ property.
|
||||
|
||||
<tr>
|
||||
<td>Property Kind </td>
|
||||
<td><TT>property_kind<Property>::type</TT> </td>
|
||||
<td><TT>property_kind<PropertyTag>::type</TT> </td>
|
||||
<td>
|
||||
|
||||
This specifies whether the property is a <a
|
||||
name="VertexProperty">VertexProperty</a>
|
||||
name="VertexPropertyTag"><b>Vertex Property Tag</b></a>
|
||||
(<tt>vertex_property_tag</tt>), an <a
|
||||
name="EdgeProperty">EdgeProperty</a> (<tt>edge_property_tag</tt>), or
|
||||
a <a name="GraphProperty">GraphProperty</a> which is attached to the
|
||||
name="EdgePropertyTag"><b>Edge Property Tag</b></a> (<tt>edge_property_tag</tt>), or
|
||||
a <a name="GraphPropertyTag"><b>Graph Property Tag</b></a> which is attached to the
|
||||
graph object itself (<tt>graph_property_tag</tt>). The tags are
|
||||
defined in <a
|
||||
href="../../../boost/graph/properties.hpp"><tt>boost/graph/properties.hpp</tt></a>
|
||||
href="../../../boost/graph/properties.hpp"><tt>boost/graph/properties.hpp</tt></a>. The <tt>property_kind</tt> traits class is defined in <a href="../../../boost/pending/property.hpp"><tt>boost/pending/property.hpp</tt></a>.
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Property ID Number </td>
|
||||
<td><TT>property_num<PropertyTag>::value</TT> </td>
|
||||
<td>
|
||||
This is needed as a workaround when using compilers that do not
|
||||
support partial specialization (and hence prevent us from using
|
||||
<tt>boost::is_same</tt> to detect if two property tags are the same).
|
||||
The <tt>property_num</tt> traits class is defined in <a
|
||||
href="../../../boost/pending/property.hpp"><tt>boost/pending/property.hpp</tt></a>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Refinement of</h3>
|
||||
|
||||
<a
|
||||
href="http://www.sgi.com/Technology/STL/DefaultConstructible.html">DefaultConstructible</a>
|
||||
href="http://www.sgi.com/tech/stl/DefaultConstructible.html">Default Constructible</a>
|
||||
|
||||
|
||||
<h3>Models</h3>
|
||||
|
||||
The following models of the Property concept are defined
|
||||
The following models of the Property Tag concept are defined
|
||||
in <a
|
||||
href="../../../boost/graph/properties.hpp"><tt>boost/graph/properties.hpp</tt></a>.
|
||||
|
||||
@@ -90,15 +102,15 @@ and
|
||||
|
||||
On compilers that do not support partial specialization, each Property
|
||||
type is also required to specialize
|
||||
<tt>property_num<Property></tt> to contain an enum named
|
||||
<tt>property_num<PropertyTag></tt> to contain an enum named
|
||||
<tt>value</tt> which uniquely identifies the property type.
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>VertexAndEdgeListGraph</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -52,7 +48,7 @@ requirements are added.
|
||||
<P>
|
||||
<PRE>
|
||||
template <class G>
|
||||
struct VertexAndEdgeListGraph
|
||||
struct VertexAndEdgeListGraphConcept
|
||||
{
|
||||
void constraints() {
|
||||
function_requires< VertexListGraphConcept<G> >();
|
||||
@@ -66,8 +62,8 @@ requirements are added.
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>VertexListGraph</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -24,18 +20,24 @@
|
||||
VertexListGraph
|
||||
</H2>
|
||||
|
||||
The VertexListGraph</I> concept refines the <a
|
||||
href="./AdjacencyGraph.html">AdjacencyGraph</a> concept, and adds the
|
||||
requirement for efficient traversal of all the vertices in the graph.
|
||||
The <I>VertexListGraph</I> concept refines the <a
|
||||
href="./Graph.html">Graph</a> concept, and adds the requirement for
|
||||
efficient traversal of all the vertices in the graph.
|
||||
|
||||
<H3>Refinement of</H3>
|
||||
|
||||
<a href="./AdjacencyGraph.html">AdjacencyGraph</a>
|
||||
<a href="./Graph.html">Graph</a>
|
||||
|
||||
<H3>Associated Types</H3>
|
||||
|
||||
<Table border>
|
||||
|
||||
<tr>
|
||||
<td><tt>boost::graph_traits<G>::traversal_category</tt><br><br>
|
||||
This tag type must be convertible to <tt>vertex_list_graph_tag</tt>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<TR>
|
||||
<TD><tt>boost::graph_traits<G>::vertex_iterator</tt><br><br>
|
||||
A vertex iterator (obtained via <TT>vertices(g)</TT>) provides access
|
||||
@@ -94,6 +96,21 @@ The <TT>vertices()</TT> function must return in constant time.
|
||||
<a href="./graph_concepts.html">Graph concepts</a>
|
||||
|
||||
|
||||
<H3>Design Rationale</H3>
|
||||
|
||||
One issue in the design of this concept is whether to include the
|
||||
refinement from the <a href="./IncidenceGraph.html">IncidenceGraph</a>
|
||||
and <a href="./AdjacencyGraph.html">AdjacencyGraph</a> concepts. The
|
||||
ability to traverse the vertices of a graph is orthogonal to
|
||||
traversing out-edges, so it would make sense to have a VertexListGraph
|
||||
concept that only includes vertex traversal. However, such a concept
|
||||
would no longer really be a graph, but would just be a set, and the
|
||||
STL already has concepts for dealing with such things. However, there
|
||||
are many BGL algorithms that need to traverse the vertices and
|
||||
out-edges of a graph, so for convenience a concept is needed that
|
||||
groups these requirements together, hence the VertexListGraph concept.
|
||||
|
||||
|
||||
<H3>Concept Checking Class</H3>
|
||||
|
||||
<P>
|
||||
@@ -104,6 +121,7 @@ The <TT>vertices()</TT> function must return in constant time.
|
||||
typedef typename boost::graph_traits<G>::vertex_iterator
|
||||
vertex_iterator;
|
||||
void constraints() {
|
||||
function_requires< IncidenceGraphConcept<G> >();
|
||||
function_requires< AdjacencyGraphConcept<G> >();
|
||||
function_requires< MultiPassInputIteratorConcept<vertex_iterator> >();
|
||||
|
||||
@@ -128,8 +146,8 @@ The <TT>vertices()</TT> function must return in constant time.
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2001
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Vertex Mutable Graph</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H2><A NAME="concept:VertexMutableGraph">
|
||||
Vertex Mutable Graph
|
||||
</H2>
|
||||
|
||||
A vertex mutable graph can be changed by adding or removing
|
||||
vertices. The memory management is the responsibility of the graph
|
||||
implementation. The graph user need only make calls to
|
||||
<TT>add_vertex</TT> and <TT>remove_vertex</TT> and the graph
|
||||
implementation does the rest.
|
||||
|
||||
<H3>Refinement of</H3>
|
||||
|
||||
<a href="./Graph.html">Graph</a> and <a
|
||||
href="http://www.sgi.com/tech/stl/DefaultConstructible.html">DefaultConstructible</a>
|
||||
|
||||
<H3>Associated Types</H3>
|
||||
|
||||
No additional associated types.
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
<ul>
|
||||
<li><a name="sec:add_vertex"><TT>add_vertex(g)</TT></a>
|
||||
<b>returns</b> <TT>vertex_descriptor</TT>
|
||||
<br><br>
|
||||
|
||||
<b>Semantics:</b> Add a new vertex to the graph. The
|
||||
<TT>vertex_descriptor</TT> for the new vertex is returned.<br>
|
||||
</li>
|
||||
|
||||
<li><a name="sec:remove_vertex"><tt>remove_vertex(u, g)</tt></a>
|
||||
<b>returns</b> <tt>void</tt><br><br>
|
||||
|
||||
<b> Semantics:</b> Remove <i>u</i> from the vertex set of the graph.
|
||||
<br>
|
||||
<b> Preconditions:</b> <i>u</i> is a valid vertex descriptor of graph <i>g</i>
|
||||
and there are no edges incident to vertex <i>u</i>. The function
|
||||
<TT>clear_vertex</TT> can be used to remove all incident edges.
|
||||
<br>
|
||||
<b> Postconditions: </b> <TT>num_vertices(g)</TT> is one less; <i>u</i>
|
||||
no longer appears in the vertex set of the graph and it
|
||||
is no longer a valid vertex descriptor.
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
|
||||
<H3>Complexity guarantees</H3>
|
||||
<ul>
|
||||
<li> Vertex insertion is guaranteed to be amortized constant time.
|
||||
|
||||
<li> Vertex removal is at most <TT>O(|E| + |V|)</TT>.
|
||||
</ul>
|
||||
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. We make no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Acknowledgements</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -66,14 +62,14 @@ Science of the U.S. Department of Energy.
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
<html>
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
|
||||
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
|
||||
<meta name="ProgId" content="FrontPage.Editor.Document">
|
||||
<title>Adjacency Iterator Adaptor Documentation</title>
|
||||
</head>
|
||||
|
||||
<body bgcolor="#FFFFFF" text="#000000">
|
||||
|
||||
<img src="../../../boost.png" alt="boost.png (6897 bytes)"
|
||||
align="center" width="277" height="86">
|
||||
|
||||
<h1>Adjacency Iterator Adaptor</h1>
|
||||
|
||||
Defined in header
|
||||
<a href="../../../boost/graph/adjacency_iterator.hpp">boost/graph/adjacency_iterator.hpp</a>
|
||||
|
||||
<p>
|
||||
The adjacency iterator adaptor transforms an
|
||||
<tt>out_edge_iterator</tt> into an adjacency iterator. That is, it
|
||||
takes an iterator that traverses over edges, and creates an iterator
|
||||
that traverses over the <b><i>target</i></b> vertices of those edges.
|
||||
With this adaptor it is trivial to take a graph type that models <a
|
||||
href="IncidenceGraph.html">Incidence Graph</a> and add the
|
||||
capabilities required of <a href="AdjacencyGraph.html">Adjacency
|
||||
Graph</a>.
|
||||
|
||||
|
||||
<h2>Synopsis</h2>
|
||||
|
||||
<pre>
|
||||
namespace boost {
|
||||
template <class Graph, class VertexDescriptor, class OutEdgeIter>
|
||||
class adjacency_iterator_generator {
|
||||
public:
|
||||
typedef <a href="../../iterator/doc/iterator_adaptor.html">iterator_adaptor</a><...> type;
|
||||
};
|
||||
}
|
||||
</pre>
|
||||
|
||||
<hr>
|
||||
|
||||
<h3>Example</h3>
|
||||
|
||||
<p>
|
||||
The following is an example of how to use the
|
||||
<tt>adjacency_iterator_generator</tt> class.
|
||||
|
||||
<p>
|
||||
<PRE>
|
||||
#include <boost/graph/adjacency_iterator.hpp>
|
||||
|
||||
class my_graph {
|
||||
// ...
|
||||
typedef ... out_edge_iterator;
|
||||
typedef ... vertex_descriptor;
|
||||
typedef boost::adjacency_iterator_generator<my_graph, vertex_descriptor, out_edge_iterator>::type adjacency_iterator;
|
||||
// ...
|
||||
};
|
||||
|
||||
</PRE>
|
||||
|
||||
<h3>Template Parameters</h3>
|
||||
|
||||
<Table border>
|
||||
<TR>
|
||||
<TH>Parameter</TH><TH>Description</TH>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>Graph</tt></TD>
|
||||
<TD>The graph type, which must model <a
|
||||
href="./IncidenceGraph.html">Incidence Graph</a>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>VertexDescriptor</tt></TD>
|
||||
<TD>This must be the same type as
|
||||
<tt>graph_traits<Graph>::vertex_descriptor</tt>. The reason why
|
||||
this is a template parameter is that the primary use of
|
||||
<tt>adjacency_iterator_generator</tt> is <b><i>inside</i></b> the
|
||||
definition of the graph class, and in that context we can not use
|
||||
<tt>graph_traits</tt> on the not yet fully defined graph class.<br>
|
||||
<b>Default:</b> <tt>graph_traits<Graph>::vertex_descriptor</tt></TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>OutEdgeIter</tt></TD>
|
||||
<TD>This must be the same type as
|
||||
<tt>graph_traits<Graph>::out_edge_iterator</tt>.<br>
|
||||
<b>Default:</b> <tt>graph_traits<Graph>::out_edge_iterator
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
</Table>
|
||||
|
||||
<h3>Model of</h3>
|
||||
|
||||
The adjacency iterator adaptor (the type
|
||||
<tt>adjacency_iterator_generator<...>::type</tt>) is a model of <a
|
||||
href="../../utility/MultiPassInputIterator.html">Multi-Pass Input Iterator</a>
|
||||
</a>.
|
||||
|
||||
|
||||
<h3>Members</h3>
|
||||
|
||||
The adjacency iterator type implements the member functions and
|
||||
operators required of the <a
|
||||
href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">Random Access Iterator</a>
|
||||
concept, except that the <tt>reference</tt> type is the same as the <tt>value_type</tt>
|
||||
so <tt>operator*()</tt> returns by-value. In addition it has the following constructor:
|
||||
|
||||
<pre>
|
||||
adjacency_iterator_generator::type(const OutEdgeIter& it, const Graph* g)
|
||||
</pre>
|
||||
|
||||
<hr>
|
||||
<p>Revised <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %b %Y" startspan -->19 Aug 2001<!--webbot bot="Timestamp" endspan i-checksum="14767" --></p>
|
||||
<p>© Copyright Jeremy Siek 2000. Permission to copy, use,
|
||||
modify, sell and distribute this document is granted provided this copyright
|
||||
notice appears in all copies. This document is provided "as is"
|
||||
without express or implied warranty, and with no claim as to its suitability for
|
||||
any purpose.</p>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -2,30 +2,24 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Jeremy Siek makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Adjacency List</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
|
||||
|
||||
<H1><A NAME="sec:adjacency-list-class"></A>
|
||||
<pre>
|
||||
adjacency_list<EdgeList, VertexList, Directed,
|
||||
adjacency_list<OutEdgeList, VertexList, Directed,
|
||||
VertexProperties, EdgeProperties,
|
||||
GraphProperties>
|
||||
GraphProperties, EdgeList>
|
||||
</pre>
|
||||
</H1>
|
||||
|
||||
@@ -38,12 +32,25 @@ best meets your needs. An <a
|
||||
href="graph_theory_review.html#sec:adjacency-list-representation">adjacency-list</a>
|
||||
is basically a two-dimensional structure, where each element of the
|
||||
first dimension represents a vertex, and each of the vertices contains
|
||||
a one-dimensional structure that is its edge list. The
|
||||
a one-dimensional structure that is its edge list. <a
|
||||
href="#fig:adj-list-graph">Figure 1</a> shows an adjacency list
|
||||
representation of a directed graph.
|
||||
|
||||
<P></P>
|
||||
<DIV ALIGN="center"><A NAME="fig:adj-list-graph"></A><A NAME="1509"></A>
|
||||
<TABLE>
|
||||
<CAPTION ALIGN="BOTTOM"><STRONG>Figure 1:</STRONG> Adjacency List Representation of a Directed Graph.</CAPTION>
|
||||
<TR><TD><IMG SRC="./figs/adj-matrix-graph2.gif" width="386" height="284"></TD>
|
||||
<TD><IMG SRC="./figs/adj-list2.gif" width="62" height="122"></TD></TR>
|
||||
</TABLE>
|
||||
</DIV><P></P>
|
||||
|
||||
The
|
||||
<TT>VertexList</TT> template parameter of the <TT>adjacency_list</TT>
|
||||
class controls what kind of container is used to represent the outer
|
||||
two-dimensional container. The <TT>EdgeList</TT> template parameter
|
||||
two-dimensional container. The <TT>OutEdgeList</TT> template parameter
|
||||
controls what kind of container is used to represent the edge
|
||||
lists. The choices for <TT>EdgeList</TT> and <TT>VertexList</TT> will
|
||||
lists. The choices for <TT>OutEdgeList</TT> and <TT>VertexList</TT> will
|
||||
determine the space complexity of the graph structure, and will
|
||||
determine the time complexity of the various graph operations. The
|
||||
possible choices and tradeoffs are discussed in Section <A
|
||||
@@ -55,7 +62,18 @@ The <TT>Directed</TT> template parameter controls whether the graph is
|
||||
directed, undirected, or directed with access to both the in-edges and
|
||||
out-edges (which we call bidirectional). The bidirectional graph takes
|
||||
up twice the space (per edge) of a directed graph since each edge will
|
||||
appear in both an out-edge and in-edge list.
|
||||
appear in both an out-edge and in-edge list. <a
|
||||
href="#fig:undir-adj-list-graph">Figure 2</a> shows an adjacency list
|
||||
representation of an undirected graph.
|
||||
|
||||
<P></P>
|
||||
<DIV ALIGN="center"><A NAME="fig:undir-adj-list-graph"></A><A NAME="1509"></A>
|
||||
<TABLE>
|
||||
<CAPTION ALIGN="BOTTOM"><STRONG>Figure 2:</STRONG> Adjacency List Representation of an Undirected Graph.</CAPTION>
|
||||
<TR><TD><IMG SRC="./figs/undir-adj-matrix-graph2.gif" width="260" height="240"></TD>
|
||||
<TD><IMG SRC="./figs/undir-adj-list.gif" width="62" height="122"></TD></TR>
|
||||
</TABLE>
|
||||
</DIV><P></P>
|
||||
|
||||
<P>
|
||||
A tutorial on how to use the <TT>adjacency_list</TT> class is in
|
||||
@@ -67,61 +85,9 @@ Section <A HREF="./using_adjacency_list.html">Using
|
||||
<H3>Example</H3>
|
||||
|
||||
<P>
|
||||
A graph used to represent a family tree. The complete source code is
|
||||
in the file <a
|
||||
href="../example/family_tree.cpp"><tt>examples/family_tree.cpp</tt></a>.
|
||||
|
||||
<PRE>
|
||||
enum { Jeanie, Debbie, Rick, John, Amanda,
|
||||
Margaret, Benjamin, N };
|
||||
|
||||
std::vector<std::string> name(N);
|
||||
name[Jeanie] = "Jeanie";
|
||||
name[Debbie] = "Debbie";
|
||||
name[Rick] = "Rick";
|
||||
name[John] = "John";
|
||||
name[Amanda] = "Amanda";
|
||||
name[Margaret] = "Margaret";
|
||||
name[Benjamin] = "Benjamin";
|
||||
|
||||
adjacency_list<> 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< adjacency_list<> >::vertex_iterator i, end;
|
||||
graph_traits< adjacency_list<> >::adjacency_iterator ai, a_end;
|
||||
|
||||
property_map<adjacency_list<>, vertex_index_t>::type
|
||||
id = get(vertex_index, G);
|
||||
|
||||
for(tie(i,end) = vertices(G); i != end; ++i) {
|
||||
cout << name[get(id, *i)];
|
||||
tie(ai, a_end) = adjacent_vertices(*i, G);
|
||||
if (ai == a_end)
|
||||
cout << " has no children";
|
||||
else
|
||||
cout << " is the parent of ";
|
||||
for (; ai != a_end; ++ai)
|
||||
cout << name[get(id, *ai)] << " ";
|
||||
cout << endl;
|
||||
}
|
||||
</PRE>
|
||||
The output is:
|
||||
<PRE>
|
||||
Jeanie is the parent of Debbie Rick John
|
||||
Debbie is the parent of Amanda
|
||||
Rick is the parent of Margaret
|
||||
John is the parent of Benjamin
|
||||
Amanda has no children
|
||||
Margaret has no children
|
||||
Benjamin has no children
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
The example in <a
|
||||
href="../example/family-tree-eg.cpp"><tt>examples/family-tree-eg.cpp</tt></a>
|
||||
shows how to represent a family tree with a graph.
|
||||
|
||||
<H3>Template Parameters</H3>
|
||||
|
||||
@@ -131,7 +97,7 @@ The output is:
|
||||
<th>Parameter</th><th>Description</th><th>Default</th>
|
||||
</tr>
|
||||
|
||||
<TR><TD><TT>EdgeList</TT></TD>
|
||||
<TR><TD><TT>OutEdgeList</TT></TD>
|
||||
<TD>The selector for the container used to represent the
|
||||
edge-list for each of the vertices.</TD>
|
||||
<TD><TT>vecS</TT></TD>
|
||||
@@ -168,6 +134,12 @@ The output is:
|
||||
<TD><TT>no_property</TT></TD>
|
||||
</TR>
|
||||
|
||||
<TR><TD><TT>EdgeList</TT></TD>
|
||||
<TD>The selector for the container used to represent the
|
||||
edge-list for the graph.</TD>
|
||||
<TD><TT>listS</TT></TD>
|
||||
</TR>
|
||||
|
||||
</TABLE>
|
||||
<P>
|
||||
|
||||
@@ -175,15 +147,20 @@ The output is:
|
||||
|
||||
<P>
|
||||
<a href="./VertexAndEdgeListGraph.html">VertexAndEdgeListGraph</a>,
|
||||
<a href="./MutablePropertyGraph.html">MutablePropertyGraph</a>
|
||||
<a href="./MutablePropertyGraph.html">MutablePropertyGraph</a>,
|
||||
<a href="../../utility/CopyConstructible.html">CopyConstructible</a>,
|
||||
<a href="../../utility/Assignable.html">Assignable</a>,
|
||||
and <a href="../../serialization/doc/index.html">Serializable</a>.
|
||||
|
||||
|
||||
<P>
|
||||
|
||||
<H3>Where Defined</H3>
|
||||
|
||||
<P>
|
||||
<a href="../../../boost/graph/adjacency_list.hpp"><TT>boost/graph/adjacency_list.hpp</TT></a>
|
||||
|
||||
<a href="../../../boost/graph/adjacency_list.hpp"><TT>boost/graph/adjacency_list.hpp</TT></a><br><br>
|
||||
Also, the serialization functionality is in
|
||||
<a href="../../../boost/graph/adj_list_serialize.hpp"><tt>boost/graph/adj_list_serialize.hpp</tt></a>.
|
||||
<P>
|
||||
|
||||
<H2>Vertex and Edge Properties</H2>
|
||||
@@ -199,13 +176,15 @@ HREF="./using_adjacency_list.html#sec:adjacency-list-properties">Internal
|
||||
Properties </A>. The property maps are objects that implement the
|
||||
interface defined in Section <A
|
||||
HREF="../../property_map/property_map.html">Property Map
|
||||
Concepts</A>. The property maps obtained from a const
|
||||
<TT>adjacency_list</TT> graph object are models of the <a
|
||||
href="../../property_map/ReadablePropertyMap.html">ReadablePropertyMap</a>
|
||||
concept. The property maps obtained from a mutable graph object are
|
||||
models of the <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">ReadWritePropertyMap</a>
|
||||
concept.
|
||||
Concepts</A> or may be <a href="bundles.html">bundled properties</a>,
|
||||
which have a more succinct syntax. The types of all property values
|
||||
must be Copy Constructible, Assignable, and Default Constructible.
|
||||
The property maps obtained from the
|
||||
<TT>adjacency_list</TT> class are models of the <a
|
||||
href="../../property_map/LvaluePropertyMap.html">Lvalue Property
|
||||
Map</a> concept. If the <TT>adjacency_list</TT> is const,
|
||||
then the property map is constant, otherwise the property
|
||||
map is mutable.
|
||||
|
||||
<P>
|
||||
If the <TT>VertexList</TT> of the graph is <TT>vecS</TT>, then the
|
||||
@@ -214,7 +193,9 @@ the <TT>vertex_index_t</TT> property. The indices fall in the range
|
||||
<TT>[0, num_vertices(g))</TT> and are contiguous. When a vertex is
|
||||
removed the indices are adjusted so that they retain these
|
||||
properties. Some care must be taken when using these indices to access
|
||||
exterior property storage.
|
||||
exterior property storage. The property map for vertex index is a
|
||||
model of <a href="../../property_map/ReadablePropertyMap.html">Readable
|
||||
Property Map</a>.
|
||||
|
||||
<P>
|
||||
|
||||
@@ -284,7 +265,7 @@ The stability issue also affects vertex and edge descriptors. For
|
||||
example, suppose you use vector of vertex descriptors to keep track of
|
||||
the parents (or predecessors) of vertices in a shortest paths tree
|
||||
(see <a
|
||||
href="../example/dijkstra.cpp"><tt>examples/dijkstra.cpp</tt></a>).
|
||||
href="../example/dijkstra-example.cpp"><tt>examples/dijkstra-example.cpp</tt></a>).
|
||||
You create the parent vector with a call to
|
||||
<tt>dijkstra_shortest_paths()</tt>, and then remove a vertex from the
|
||||
graph. Subsequently you try to use the parent vector, but since all
|
||||
@@ -294,8 +275,8 @@ vertex descriptors have become invalid, the result is incorrect.
|
||||
std::vector<Vertex> parent(num_vertices(G));
|
||||
std::vector<Vertex> distance(num_vertices(G));
|
||||
|
||||
dijkstra_shortest_paths(G, s, &distance[0],
|
||||
make_ucs_visitor(record_predecessors(&parent[0], on_edge_relaxed())));
|
||||
dijkstra_shortest_paths(G, s, distance_map(&distance[0]).
|
||||
predecessor_map(&parent[0]));
|
||||
|
||||
remove_vertex(s, G); <b>// Bad idea! Invalidates vertex descriptors in parent vector.</b>
|
||||
|
||||
@@ -319,16 +300,16 @@ iterators that point to other edges (not <i>(u,v)</i>).
|
||||
<p>
|
||||
In general, if you want your vertex and edge descriptors to be stable
|
||||
(never invalidated) then use <tt>listS</tt> or <tt>setS</tt> for the
|
||||
<tt>VertexList</tt> and <tt>EdgeList</tt> template parameters of
|
||||
<tt>VertexList</tt> and <tt>OutEdgeList</tt> template parameters of
|
||||
<tt>adjacency_list</tt>. If you are not as concerned about descriptor
|
||||
and iterator stability, and are more concerned about memory
|
||||
consumption and graph traversal speed, use <tt>vecS</tt> for the
|
||||
<tt>VertexList</tt> and/or <tt>EdgeList</tt> template parameters.
|
||||
<tt>VertexList</tt> and/or <tt>OutEdgeList</tt> template parameters.
|
||||
|
||||
<p>
|
||||
The following table summarizes which operations cause descriptors and
|
||||
iterators to become invalid. In the table, <tt>EL</tt> is an
|
||||
abbreviation for <tt>EdgeList</tt> and <tt>VL</tt> means
|
||||
abbreviation for <tt>OutEdgeList</tt> and <tt>VL</tt> means
|
||||
<tt>VertexList</tt>. The <b>Adj Iter</b> category includes the
|
||||
<tt>out_edge_iterator</tt>, <tt>in_edge_iterator</tt>, and
|
||||
<tt>adjacency_iterator</tt> types. A more detailed description of
|
||||
@@ -373,7 +354,7 @@ align=center><tt>OK</tt></td><td align=center><tt>OK</tt></td>
|
||||
<br>
|
||||
and
|
||||
<br>
|
||||
<tt>adjacency_list_traits<EdgeList, VertexList, Directed>::vertex_descriptor</tt>
|
||||
<tt>adjacency_list_traits<OutEdgeList, VertexList, Directed, EdgeList>::vertex_descriptor</tt>
|
||||
<br><br>
|
||||
The type for the vertex descriptors associated with the
|
||||
<TT>adjacency_list</TT>.
|
||||
@@ -382,7 +363,7 @@ The type for the vertex descriptors associated with the
|
||||
|
||||
<tt>graph_traits<adjacency_list>::edge_descriptor</tt><br>
|
||||
and<br>
|
||||
<tt>adjacency_list_traits<EdgeList, VertexList, Directed>::edge_descriptor</tt>
|
||||
<tt>adjacency_list_traits<OutEdgeList, VertexList, Directed, EdgeList>::edge_descriptor</tt>
|
||||
<br><br>
|
||||
The type for the edge descriptors associated with the
|
||||
<TT>adjacency_list</TT>.
|
||||
@@ -395,9 +376,9 @@ The type for the iterators returned by <TT>vertices()</TT>.
|
||||
|
||||
When <tt>VertexList=vecS</tt> then the <tt>vertex_iterator</tt> models
|
||||
<a
|
||||
href="http://www.sgi.com/Technology/STL/RandomAccessIterator.html">RandomAccessIterator</a>. Otherwise
|
||||
href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">RandomAccessIterator</a>. Otherwise
|
||||
the <tt>vertex_iterator</tt> models <a
|
||||
href="http://www.sgi.com/Technology/STL/BidirectionalIterator.html">BidirectionalIterator</a>.
|
||||
href="http://www.sgi.com/tech/stl/BidirectionalIterator.html">BidirectionalIterator</a>.
|
||||
|
||||
<hr>
|
||||
|
||||
@@ -405,7 +386,7 @@ href="http://www.sgi.com/Technology/STL/BidirectionalIterator.html">Bidirectiona
|
||||
<br><br>
|
||||
The type for the iterators returned by <TT>edges()</TT>.
|
||||
The <tt>edge_iterator</tt> models <a
|
||||
href="http://www.sgi.com/Technology/STL/BidirectionalIterator.html">BidirectionalIterator</a>.
|
||||
href="http://www.sgi.com/tech/stl/BidirectionalIterator.html">BidirectionalIterator</a>.
|
||||
|
||||
|
||||
<hr>
|
||||
@@ -415,14 +396,14 @@ href="http://www.sgi.com/Technology/STL/BidirectionalIterator.html">Bidirectiona
|
||||
<br><br>
|
||||
|
||||
The type for the iterators returned by <TT>out_edges()</TT>.
|
||||
When <tt>EdgeList=vecS</tt> then the <tt>out_edge_iterator</tt> models
|
||||
<a href="http://www.sgi.com/Technology/STL/RandomAccessIterator.html">
|
||||
RandomAccessIterator</a>. When <tt>EdgeList=slistS</tt> then the
|
||||
When <tt>OutEdgeList=vecS</tt> then the <tt>out_edge_iterator</tt> models
|
||||
<a href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">
|
||||
RandomAccessIterator</a>. When <tt>OutEdgeList=slistS</tt> then the
|
||||
<tt>out_edge_iterator</tt> models <a
|
||||
href="http://www.sgi.com/Technology/STL/ForwardIterator.html">
|
||||
href="http://www.sgi.com/tech/stl/ForwardIterator.html">
|
||||
ForwardIterator</a>. Otherwise the <tt>out_edge_iterator</tt> models
|
||||
<a
|
||||
href="http://www.sgi.com/Technology/STL/BidirectionalIterator.html">
|
||||
href="http://www.sgi.com/tech/stl/BidirectionalIterator.html">
|
||||
BidirectionalIterator</a>.
|
||||
|
||||
<hr>
|
||||
@@ -434,9 +415,16 @@ The <tt>adjacency_iterator</tt> models the same iterator concept
|
||||
as <tt>out_edge_iterator</tt>.
|
||||
<hr>
|
||||
|
||||
<tt>adjacency_list::inv_adjacency_iterator</tt>
|
||||
<br><br>
|
||||
The type for the iterators returned by <TT>inv_adjacent_vertices()</TT>.
|
||||
The <tt>inv_adjacency_iterator</tt> models the same iterator concept
|
||||
as <tt>out_edge_iterator</tt>.
|
||||
<hr>
|
||||
|
||||
<tt>graph_traits<adjacency_list>::directed_category</tt><br>
|
||||
and<br>
|
||||
<tt>adjacency_list_traits<EdgeList, VertexList, Directed>::directed_category</tt>
|
||||
<tt>adjacency_list_traits<OutEdgeList, VertexList, Directed, EdgeList>::directed_category</tt>
|
||||
<br><br>
|
||||
Provides information about whether the graph is
|
||||
directed (<TT>directed_tag</TT>) or undirected
|
||||
@@ -446,7 +434,7 @@ directed (<TT>directed_tag</TT>) or undirected
|
||||
|
||||
<tt>graph_traits<adjacency_list>::edge_parallel_category</tt><br>
|
||||
and<br>
|
||||
<tt>adjacency_list_traits<EdgeList, VertexList, Directed>::edge_parallel_category</tt>
|
||||
<tt>adjacency_list_traits<OutEdgeList, VertexList, Directed, EdgeList>::edge_parallel_category</tt>
|
||||
<br><br>
|
||||
This describes whether the graph class allows the insertion of
|
||||
parallel edges (edges with the same source and target). The two tags
|
||||
@@ -457,13 +445,17 @@ parallel edges while the others allow parallel edges.
|
||||
|
||||
<hr>
|
||||
|
||||
<tt>graph_traits<adjacency_list>::vertices_size_type</tt>
|
||||
<tt>graph_traits<adjacency_list>::vertices_size_type</tt><br>
|
||||
and<br>
|
||||
<tt>adjacency_list_traits<OutEdgeList, VertexList, Directed_list, EdgeList>::vertices_size_type</tt><br>
|
||||
<br><br>
|
||||
The type used for dealing with the number of vertices in the graph.
|
||||
|
||||
<hr>
|
||||
|
||||
<tt>graph_traits<adjacency_list>::edge_size_type</tt>
|
||||
<tt>graph_traits<adjacency_list>::edge_size_type</tt><br>
|
||||
and<br>
|
||||
<tt>adjacency_list_traits<OutEdgeList, VertexList, Directed_list, EdgeList>::edge_size_type</tt><br>
|
||||
<br><br>
|
||||
The type used for dealing with the number of edges in the graph.
|
||||
|
||||
@@ -483,10 +475,40 @@ and<br>
|
||||
The property map type for vertex or edge properties in the graph. The
|
||||
specific property is specified by the <TT>Property</TT> template argument,
|
||||
and must match one of the properties specified in the
|
||||
<TT>VertexProperty</TT> or <TT>EdgeProperty</TT> for the graph.
|
||||
<TT>VertexProperties</TT> or <TT>EdgeProperties</TT> for the graph.
|
||||
|
||||
<hr>
|
||||
|
||||
<tt>graph_property<adjacency_list, Property>::type</tt>
|
||||
<br><br>
|
||||
The property value type for the graph property specified by the
|
||||
<tt>Property</tt> tag.
|
||||
|
||||
<hr>
|
||||
|
||||
<tt>adjacency_list::out_edge_list_selector</tt>
|
||||
<br><br>
|
||||
The type <tt>OutEdgeListS</tt>.
|
||||
|
||||
<hr>
|
||||
|
||||
<tt>adjacency_list::vertex_list_selector</tt>
|
||||
<br><br>
|
||||
The type <tt>VertexListS</tt>.
|
||||
|
||||
<hr>
|
||||
|
||||
<tt>adjacency_list::directed_selector</tt>
|
||||
<br><br>
|
||||
The type <tt>DirectedS</tt>.
|
||||
|
||||
<hr>
|
||||
|
||||
<tt>adjacency_list::edge_list_selector</tt>
|
||||
<br><br>
|
||||
The type <tt>EdgeListS</tt>.
|
||||
|
||||
<hr>
|
||||
|
||||
<H2>Member Functions</H2>
|
||||
|
||||
@@ -527,14 +549,15 @@ Creates a graph object with <TT>n</TT> vertices and zero edges.
|
||||
<a name="sec:iterator-constructor">
|
||||
<pre>
|
||||
template <class EdgeIterator>
|
||||
adjacency_list(vertices_size_type n,
|
||||
EdgeIterator first, EdgeIterator last,
|
||||
adjacency_list(EdgeIterator first, EdgeIterator last,
|
||||
vertices_size_type n,
|
||||
edges_size_type m = 0,
|
||||
const GraphProperty& p = GraphProperty())
|
||||
</pre>
|
||||
Creates a graph object with <TT>n</TT> vertices and with the edges
|
||||
specified in the edge list given by the range <TT>[first, last)</TT>.
|
||||
The <tt>EdgeIterator</tt> must be a model of <a
|
||||
href="http://www.sgi.com/Technology/STL/InputIterator.html">InputIterator</a>.
|
||||
href="http://www.sgi.com/tech/stl/InputIterator.html">InputIterator</a>.
|
||||
The value type of the <TT>EdgeIterator</TT> must be a
|
||||
<TT>std::pair</TT>, where the type in the pair is an integer type. The
|
||||
integers will correspond to vertices, and they must all fall in the
|
||||
@@ -545,21 +568,22 @@ range of <TT>[0, n)</TT>.
|
||||
|
||||
<pre>
|
||||
template <class EdgeIterator, class EdgePropertyIterator>
|
||||
adjacency_list(vertices_size_type num_vertices,
|
||||
EdgeIterator first, EdgeIterator last,
|
||||
adjacency_list(EdgeIterator first, EdgeIterator last,
|
||||
EdgePropertyIterator ep_iter,
|
||||
vertices_size_type n,
|
||||
vertices_size_type m = 0,
|
||||
const GraphProperty& p = GraphProperty())
|
||||
</pre>
|
||||
Creates a graph object with <TT>n</TT> vertices and with the edges
|
||||
specified in the edge list given by the range <TT>[first, last)</TT>.
|
||||
The <tt>EdgeIterator</tt> and <tt>EdgePropertyIterator</tt> must be a
|
||||
model of <a
|
||||
href="http://www.sgi.com/Technology/STL/InputIterator.html">InputIterator</a>.
|
||||
href="http://www.sgi.com/tech/stl/InputIterator.html">InputIterator</a>.
|
||||
The value type of the <TT>EdgeIterator</TT> must be a
|
||||
<TT>std::pair</TT>, where the type in the pair is an integer type. The
|
||||
integers will correspond to vertices, and they must all fall in the
|
||||
range of <TT>[0, n)</TT>. The <TT>value_type</TT> of the
|
||||
<TT>ep_iter</TT> should be <TT>EdgeProperty</TT>.
|
||||
<TT>ep_iter</TT> should be <TT>EdgeProperties</TT>.
|
||||
|
||||
<hr>
|
||||
|
||||
@@ -606,22 +630,38 @@ Returns an iterator-range providing access to the edge set of graph
|
||||
|
||||
<pre>
|
||||
std::pair<adjacency_iterator, adjacency_iterator>
|
||||
adjacent_vertices(vertex_descriptor v, const adjacency_list& g)
|
||||
adjacent_vertices(vertex_descriptor u, const adjacency_list& g)
|
||||
</pre>
|
||||
Returns an iterator-range providing access to the vertices adjacent to
|
||||
vertex <tt>v</tt> in graph <tt>g</tt>.
|
||||
vertex <tt>u</tt> in graph <tt>g</tt>. For example, if <tt>u -> v</tt>
|
||||
is an edge in the graph, then <tt>v</tt> will be in this iterator-range.
|
||||
|
||||
<hr>
|
||||
|
||||
<pre>
|
||||
std::pair<inv_adjacency_iterator, inv_adjacency_iterator>
|
||||
inv_adjacent_vertices(vertex_descriptor u, const adjacency_list& g)
|
||||
</pre>
|
||||
|
||||
Returns an iterator-range providing access to the vertices in graph
|
||||
<tt>g</tt> to which <tt>u</tt> is adjacent. (<tt>inv</tt> is for
|
||||
inverse.) For example, if <tt>v -> u</tt> is an edge in the graph,
|
||||
then <tt>v</tt> will be in this iterator range. This function is only
|
||||
available for bidirectional and undirected <tt>adjacency_list</tt>'s.
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
<pre>
|
||||
std::pair<out_edge_iterator, out_edge_iterator>
|
||||
out_edges(vertex_descriptor v, const adjacency_list& g)
|
||||
out_edges(vertex_descriptor u, const adjacency_list& g)
|
||||
</pre>
|
||||
Returns an iterator-range providing access to the out-edges of vertex
|
||||
<tt>v</tt> in graph <tt>g</tt>. If the graph is undirected, this
|
||||
iterator-range provides access to all edge incident on vertex
|
||||
<tt>v</tt>.
|
||||
<tt>u</tt> in graph <tt>g</tt>. If the graph is undirected, this
|
||||
iterator-range provides access to all edges incident on vertex
|
||||
<tt>u</tt>. For both directed and undirected graphs, for an out-edge
|
||||
<tt>e</tt>, <tt>source(e, g) == u</tt> and <tt>target(e, g) == v</tt>
|
||||
where <tt>v</tt> is a vertex adjacent to <tt>u</tt>.
|
||||
|
||||
<hr>
|
||||
|
||||
@@ -632,7 +672,9 @@ in_edges(vertex_descriptor v, const adjacency_list& g)
|
||||
Returns an iterator-range providing access to the in-edges of vertex
|
||||
<tt>v</tt> in graph <tt>g</tt>. This operation is only available if
|
||||
<TT>bidirectionalS</TT> was specified for the <TT>Directed</TT>
|
||||
template parameter.
|
||||
template parameter. For an in-edge <tt>e</tt>, <tt>target(e, g) == v</tt>
|
||||
and <tt>source(e, g) == u</tt> for some vertex <tt>u</tt> that is
|
||||
adjacent to <tt>v</tt>, whether the graph is directed or undirected.
|
||||
|
||||
<hr>
|
||||
|
||||
@@ -700,7 +742,7 @@ std::pair<edge_descriptor, bool>
|
||||
edge(vertex_descriptor u, vertex_descriptor v,
|
||||
const adjacency_list& g)
|
||||
</pre>
|
||||
Returns the edge connecting vertex <tt>u</tt> to vertex <tt>v</tt> in
|
||||
Returns an edge connecting vertex <tt>u</tt> to vertex <tt>v</tt> in
|
||||
graph <tt>g</tt>.
|
||||
|
||||
<hr>
|
||||
@@ -712,7 +754,7 @@ edge_range(vertex_descriptor u, vertex_descriptor v,
|
||||
</pre>
|
||||
Returns a pair of out-edge iterators that give the range for
|
||||
all the parallel edges from <tt>u</tt> to <tt>v</tt>. This
|
||||
function only works when the <tt>EdgeList</tt> for the
|
||||
function only works when the <tt>OutEdgeList</tt> for the
|
||||
<tt>adjacency_list</tt> is a container that sorts the
|
||||
out edges according to target vertex, and allows for
|
||||
parallel edges. The <tt>multisetS</tt> selector chooses
|
||||
@@ -732,16 +774,14 @@ add_edge(vertex_descriptor u, vertex_descriptor v,
|
||||
Adds edge <i>(u,v)</i> to the graph and returns the edge descriptor
|
||||
for the new edge. For graphs that do not allow parallel edges, if the
|
||||
edge is already in the graph then a duplicate will not be added and
|
||||
the <TT>bool</TT> flag will be <TT>false</TT>. Also, if <i>u</i> and
|
||||
<i>v</i> are descriptors for the same vertex (creating a self loop)
|
||||
and the graph is undirected, then the edge will not be added and the
|
||||
flag will be <TT>false</TT>. When the flag is <TT>false</TT>, the
|
||||
edge descriptor is invalid and any use of it is undefined.
|
||||
the <TT>bool</TT> flag will be <TT>false</TT>. When the flag is
|
||||
<TT>false</TT>, the
|
||||
returned edge descriptor points to the already existing edge.
|
||||
|
||||
<p>
|
||||
The placement of the new edge in the out-edge list is in general
|
||||
unspecified, though ordering of the out-edge list can be accomplished
|
||||
through the choice of <tt>EdgeList</tt>.
|
||||
through the choice of <tt>OutEdgeList</tt>.
|
||||
|
||||
If the <tt>VertexList</tt> selector is
|
||||
<tt>vecS</tt>, and if either vertex descriptor <tt>u</tt> or
|
||||
@@ -750,9 +790,9 @@ number of vertices in the graph, the graph is enlarged so that the
|
||||
number of vertices is <tt>std::max(u,v) + 1</tt>.
|
||||
|
||||
<p>
|
||||
If the <TT>EdgeList</TT> selector is <TT>vecS</TT> then this operation
|
||||
If the <TT>OutEdgeList</TT> selector is <TT>vecS</TT> then this operation
|
||||
will invalidate any <tt>out_edge_iterator</tt> for vertex
|
||||
<i>u</i>. This also applies if the <TT>EdgeList</TT> is a user-defined
|
||||
<i>u</i>. This also applies if the <TT>OutEdgeList</TT> is a user-defined
|
||||
container that invalidates its iterators when <TT>push(container,
|
||||
x)</TT> is invoked (see Section <A
|
||||
HREF="./using_adjacency_list.html#sec:custom-storage">Customizing the
|
||||
@@ -768,7 +808,7 @@ then <tt>add_edge()</tt> also invalidates any <tt>edge_iterator</tt>.
|
||||
<pre>
|
||||
std::pair<edge_descriptor, bool>
|
||||
add_edge(vertex_descriptor u, vertex_descriptor v,
|
||||
const EdgeProperty& p,
|
||||
const EdgeProperties& p,
|
||||
adjacency_list& g)
|
||||
</pre>
|
||||
Adds edge <i>(u,v)</i> to the graph and attaches <TT>p</TT> as the
|
||||
@@ -785,7 +825,7 @@ Removes the edge <i>(u,v)</i> from the graph.
|
||||
<p>
|
||||
This operation causes any outstanding edge descriptors or iterators
|
||||
that point to edge <i>(u,v)</i> to become invalid. In addition, if
|
||||
the <TT>EdgeList</TT> selector is <TT>vecS</TT> then this operation
|
||||
the <TT>OutEdgeList</TT> selector is <TT>vecS</TT> then this operation
|
||||
will invalidate any iterators that point into the edge-list for vertex
|
||||
<i>u</i> and also for vertex <i>v</i> in the undirected and
|
||||
bidirectional case. Also, for directed graphs this invalidates any
|
||||
@@ -821,7 +861,7 @@ has time complexity <i>O(E/V)</i>.
|
||||
<hr>
|
||||
|
||||
<pre>
|
||||
template <class <a href="http://www.sgi.com/Technology/STL/Predicate.html">Predicate</a>>
|
||||
template <class <a href="http://www.sgi.com/tech/stl/Predicate.html">Predicate</a>>
|
||||
void remove_out_edge_if(vertex_descriptor u, Predicate predicate,
|
||||
adjacency_list& g)
|
||||
</pre>
|
||||
@@ -836,7 +876,7 @@ invoking <tt>remove_edge()</tt> on each of the removed edges.
|
||||
|
||||
<pre>
|
||||
template <class <a
|
||||
href="http://www.sgi.com/Technology/STL/Predicate.html">Predicate</a>>
|
||||
href="http://www.sgi.com/tech/stl/Predicate.html">Predicate</a>>
|
||||
void remove_in_edge_if(vertex_descriptor v, Predicate predicate,
|
||||
adjacency_list& g)
|
||||
</pre>
|
||||
@@ -854,7 +894,7 @@ This operation is available for undirected and bidirectional
|
||||
<hr>
|
||||
|
||||
<pre>
|
||||
template <class <a href="http://www.sgi.com/Technology/STL/Predicate.html">Predicate</a>>
|
||||
template <class <a href="http://www.sgi.com/tech/stl/Predicate.html">Predicate</a>>
|
||||
void remove_edge_if(Predicate predicate, adjacency_list& g)
|
||||
</pre>
|
||||
Removes all edges from the graph that satisfy
|
||||
@@ -877,6 +917,17 @@ new vertex.
|
||||
|
||||
<hr>
|
||||
|
||||
<pre>
|
||||
vertex_descriptor
|
||||
add_vertex(const VertexProperties& p,
|
||||
adjacency_list& g)
|
||||
</pre>
|
||||
Adds a vertex to the graph with the specified properties. Returns the
|
||||
vertex descriptor for the new vertex.
|
||||
</a>
|
||||
|
||||
<hr>
|
||||
|
||||
<pre>
|
||||
void clear_vertex(vertex_descriptor u, adjacency_list& g)
|
||||
</pre>
|
||||
@@ -889,6 +940,35 @@ the edges that have <tt>u</tt> as the source or target.
|
||||
|
||||
<hr>
|
||||
|
||||
<pre>
|
||||
void clear_out_edges(vertex_descriptor u, adjacency_list& g)
|
||||
</pre>
|
||||
Removes all out-edges from vertex <i>u</i>. The vertex still appears
|
||||
in the vertex set of the graph.
|
||||
<p>
|
||||
The affect on descriptor and iterator stability is the
|
||||
same as that of invoking <tt>remove_edge()</tt> for all of
|
||||
the edges that have <tt>u</tt> as the source.
|
||||
<p>
|
||||
This operation is not applicable to undirected graphs
|
||||
(use <tt>clear_vertex()</tt> instead).
|
||||
|
||||
<hr>
|
||||
|
||||
<pre>
|
||||
void clear_in_edges(vertex_descriptor u, adjacency_list& g)
|
||||
</pre>
|
||||
Removes all in-edges from vertex <i>u</i>. The vertex still appears
|
||||
in the vertex set of the graph.
|
||||
<p>
|
||||
The affect on descriptor and iterator stability is the
|
||||
same as that of invoking <tt>remove_edge()</tt> for all of
|
||||
the edges that have <tt>u</tt> as the target.
|
||||
<p>
|
||||
This operation is only applicable to bidirectional graphs.
|
||||
|
||||
<hr>
|
||||
|
||||
<pre>
|
||||
void remove_vertex(vertex_descriptor u, adjacency_list& g)
|
||||
</pre>
|
||||
@@ -913,73 +993,99 @@ much better choice for the <TT>VertexList</TT> template parameter.
|
||||
|
||||
<hr>
|
||||
|
||||
<h4>Property Map Access</h4>
|
||||
<h4><a name="property-map-accessors">Property Map Accessors</a></h4>
|
||||
|
||||
<hr>
|
||||
|
||||
<pre>
|
||||
template <class <a href="./Property.html">Property</a>>
|
||||
property_map<adjacency_list, Property>::type
|
||||
get(Property, adjacency_list& g)
|
||||
template <class <a href="./PropertyTag.html">PropertyTag</a>>
|
||||
property_map<adjacency_list, PropertyTag>::type
|
||||
get(PropertyTag, adjacency_list& g)
|
||||
|
||||
template <class <a href="./Property.html">Property</a>>
|
||||
template <class <a href="./PropertyTag.html">PropertyTag</a>>
|
||||
property_map<adjacency_list, Tag>::const_type
|
||||
get(Property, const adjacency_list& g)
|
||||
get(PropertyTag, const adjacency_list& g)
|
||||
</pre>
|
||||
Returns the property map object for the vertex property specified by
|
||||
<TT>Property</TT>. The <TT>Property</TT> must match one of the
|
||||
<TT>PropertyTag</TT>. The <TT>PropertyTag</TT> must match one of the
|
||||
properties specified in the graph's <TT>VertexProperty</TT> template
|
||||
argument.
|
||||
|
||||
<hr>
|
||||
|
||||
<pre>
|
||||
template <class <a href="./Property.html">Property</a>, class X>
|
||||
typename property_traits<property_map<adjacency_list, Property>::const_type>::value_type
|
||||
get(Property, const adjacency_list& g, X x)
|
||||
template <class <a href="./PropertyTag.html">PropertyTag</a>, class X>
|
||||
typename property_traits<property_map<adjacency_list, PropertyTag>::const_type>::value_type
|
||||
get(PropertyTag, const adjacency_list& g, X x)
|
||||
</pre>
|
||||
This returns the property value for <tt>x</tt>, where <tt>x</tt> is either
|
||||
a vertex or edge descriptor.
|
||||
<hr>
|
||||
|
||||
<pre>
|
||||
template <class <a href="./Property.html">Property</a>, class X, class Value>
|
||||
template <class <a href="./PropertyTag.html">PropertyTag</a>, class X, class Value>
|
||||
void
|
||||
put(Property, const adjacency_list& g, X x, const Value& value)
|
||||
put(PropertyTag, const adjacency_list& g, X x, const Value& value)
|
||||
</pre>
|
||||
This sets the property value for <tt>x</tt> to
|
||||
<tt>value</tt>. <tt>x</tt> is either a vertex or edge descriptor.
|
||||
<tt>Value</tt> must be convertible to
|
||||
<tt>typename property_traits<property_map<adjacency_list, Property>::type>::value_type</tt>
|
||||
<tt>typename property_traits<property_map<adjacency_list, PropertyTag>::type>::value_type</tt>
|
||||
|
||||
<hr>
|
||||
|
||||
<pre>
|
||||
template <class GraphProperties, class <a href="./Property.html#GraphProperty">GraphProperty</a>>
|
||||
typename property_value<GraphProperties, GraphProperty>::type&
|
||||
get_property(adjacency_list& g, GraphProperty);
|
||||
template <class GraphProperties, class <a href="./PropertyTag.html#GraphPropertyTag">GraphPropertyTag</a>>
|
||||
typename graph_property<adjacency_list, GraphPropertyTag>::type&
|
||||
get_property(adjacency_list& g, GraphPropertyTag);
|
||||
</pre>
|
||||
Return the property specified by <tt>GraphProperty</tt> that is
|
||||
attached to the graph object <tt>g</tt>. The <tt>property_value</tt>
|
||||
Return the property specified by <tt>GraphPropertyTag</tt> that is
|
||||
attached to the graph object <tt>g</tt>. The <tt>graph_property</tt>
|
||||
traits class is defined in <a
|
||||
href="../../../boost/pending/property.hpp"><tt>boost/pending/property.hpp</tt></a>.
|
||||
href="../../../boost/graph/adjacency_list.hpp"><tt>boost/graph/adjacency_list.hpp</tt></a>.
|
||||
|
||||
<hr>
|
||||
|
||||
<pre>
|
||||
template <class GraphProperties, class <a href="./Property.html#GraphProperty">GraphProperty</a>>
|
||||
const typename property_value<GraphProperties, GraphProperty>::type&
|
||||
get_property(const adjacency_list& g, GraphProperty);
|
||||
template <class GraphProperties, class <a href="./PropertyTag.html#GraphPropertyTag">GraphPropertyTag</a>>
|
||||
const typename graph_property<adjacency_list, GraphPropertyTag>::type&
|
||||
get_property(const adjacency_list& g, GraphPropertyTag);
|
||||
</pre>
|
||||
Return the property specified by <tt>GraphProperty</tt> that is
|
||||
attached to the graph object <tt>g</tt>. The <tt>property_value</tt>
|
||||
Return the property specified by <tt>GraphPropertyTag</tt> that is
|
||||
attached to the graph object <tt>g</tt>. The <tt>graph_property</tt>
|
||||
traits class is defined in <a
|
||||
href="../../../boost/pending/property.hpp"><tt>boost/pending/property.hpp</tt></a>.
|
||||
|
||||
<hr>
|
||||
href="../../../boost/graph/adjacency_list.hpp"><tt>boost/graph/adjacency_list.hpp</tt></a>.
|
||||
|
||||
<!-- add the shortcut property functions -->
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
|
||||
<h4><a name="serialization">Serialization</a></h4>
|
||||
|
||||
<hr>
|
||||
|
||||
<pre>
|
||||
template<class <a href="../../serialization/doc/archives.html#saving_interface">SavingArchive</a>>
|
||||
SavingArchive& operator<<(SavingArchive& ar, const adjacency_list& graph);
|
||||
</pre>
|
||||
Serializes the graph into the archive. Requires the vertex and edge properties of the
|
||||
graph to be <a href="../../serialization/doc/index.html">Serializable</a>.
|
||||
<br>
|
||||
Include <a href="../../../boost/graph/adj_list_serialize.hpp"><tt>boost/graph/adj_list_serialize.hpp</tt></a>.
|
||||
<hr>
|
||||
|
||||
<pre>
|
||||
template<class <a href="../../serialization/doc/archives.html#loading_interface">LoadingArchive</a>>
|
||||
LoadingArchive& operator>>(LoadingArchive& ar, const adjacency_list& graph);
|
||||
</pre>
|
||||
Reads the graph from the archive. Requires the vertex and edge properties of the
|
||||
graph to be <a href="../../serialization/doc/index.html">Serializable</a>.
|
||||
<br>
|
||||
Include <a href="../../../boost/graph/adj_list_serialize.hpp"><tt>boost/graph/adj_list_serialize.hpp</tt></a>.
|
||||
<hr>
|
||||
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
@@ -993,21 +1099,21 @@ href="../../../boost/pending/property.hpp"><tt>boost/pending/property.hpp</tt></
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
<!-- LocalWords: gif ALT EdgeList VertexList html VertexProperty EdgeProperty
|
||||
<!-- LocalWords: gif ALT OutEdgeList EdgeList VertexList html VertexProperties EdgeProperties
|
||||
-->
|
||||
<!-- LocalWords: GraphProperty cpp enum ai cout endl VertexAndEdgeListGraph
|
||||
<!-- LocalWords: GraphPropertyTag cpp enum ai cout endl VertexAndEdgeListGraph
|
||||
-->
|
||||
<!-- LocalWords: MutablePropertyGraph hpp const ReadablePropertyMap listS num
|
||||
-->
|
||||
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. We make no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Graph Traits</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -83,8 +79,8 @@ The selector type whether the graph is directed or undirected.
|
||||
<h3>Model of</h3>
|
||||
|
||||
<a
|
||||
href="http://www.sgi.com/Technology/STL/DefaultConstructible.html">DefaultConstructible</a> and
|
||||
<a href="http://www.sgi.com/Technology/STL/Assignable.html">Assignable</a>
|
||||
href="http://www.sgi.com/tech/stl/DefaultConstructible.html">DefaultConstructible</a> and
|
||||
<a href="http://www.sgi.com/tech/stl/Assignable.html">Assignable</a>
|
||||
|
||||
<h3>Type Requirements</h3>
|
||||
|
||||
@@ -148,14 +144,14 @@ parallel edges (<tt>disallow_parallel_edge_tag</tt>).
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -0,0 +1,584 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Adjacency Matrix</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1><A NAME="sec:adjacency-matrix-class"></A>
|
||||
<pre>
|
||||
adjacency_matrix<Directed, VertexProperty,
|
||||
EdgeProperty, GraphProperty,
|
||||
Allocator>
|
||||
</pre>
|
||||
</H1>
|
||||
|
||||
The <tt>adjacency_matrix</tt> class implements the BGL graph interface
|
||||
using the traditional adjacency matrix storage format. For a graph
|
||||
with <i>V</i> vertices, a <i>V x V</i> matrix is used, where each
|
||||
element <i>a<sub>ij</sub></i> is a boolean flag that says whether
|
||||
there is an edge from vertex <i>i</i> to vertex <i>j</i>. <a
|
||||
href="#fig:adj-matrix-graph">Figure 1</a> shows the adjacency matrix
|
||||
representation of a graph.
|
||||
|
||||
<P></P>
|
||||
<DIV ALIGN="center"><A NAME="fig:adj-matrix-graph"></A><A NAME="1509"></A>
|
||||
<TABLE>
|
||||
<CAPTION ALIGN="BOTTOM"><STRONG>Figure 1:</STRONG> Adjacency Matrix Representation of a Directed Graph.</CAPTION>
|
||||
<TR><TD><IMG SRC="./figs/adj-matrix-graph3.gif" width="386" height="284"></TD>
|
||||
<TD><IMG SRC="./figs/adj-matrix.gif" width="135" height="136"></TD></TR>
|
||||
</TABLE>
|
||||
</DIV><P></P>
|
||||
|
||||
The advantage of this matrix format over the adjacency list is that
|
||||
edge insertion and removal is constant time. There are several
|
||||
disadvantages. The first is that the amount of memory used is
|
||||
<i>O(V<sup>2</sup>)</i> instead of <i>O(V + E)</i> (where <i>E</i> is
|
||||
the number of edges). The second is that operations that traverse all
|
||||
the out-edges of each vertex (such as breadth-first search) run in
|
||||
<i>O(V<sup>2</sup>)</i> time instead of <i>O(V + E)</i> time for the
|
||||
adjacency list. In short, it is better to use the
|
||||
<tt>adjacency_matrix</tt> for dense graphs (where <i>E</i> is close to
|
||||
<i>V<sup>2</sup></i>) and it is better to use <a
|
||||
href="adjacency_list.html"><tt>adjacency_list</tt></a> for sparse
|
||||
graphs (where <i>E</i> is much smaller than <i>V<sup>2</sup></i>).
|
||||
|
||||
The <tt>adjacency_matrix</tt> class extends the traditional
|
||||
data-structure by allowing objects to be attached to vertices and
|
||||
edges using the same property template parameters supported by <a
|
||||
href="adjacency_list.html"><tt>adjacency_list</tt></a>. These may be
|
||||
<a href="bundles.html">bundled properties</a> or standard (backward-compatible)
|
||||
<a
|
||||
href="using_adjacency_list.html#sec:adjacency-list-properties">interior
|
||||
properties</a>. The types of all property values must be
|
||||
Copy Constructible, Assignable and Default Constructible.
|
||||
|
||||
In the case of an undirected graph, the
|
||||
<tt>adjacency_matrix</tt>. class does not use a full <i>V x V</i>
|
||||
matrix but instead uses a lower triangle (the diagonal and below)
|
||||
since the matrix for an undirected graph is symmetric. This reduces
|
||||
the storage to <i>(V<sup>2</sup>)/2</i>. <a
|
||||
href="#fig:undir-adj-matrix-graph">Figure 2</a> shows an adjacency
|
||||
matrix representation of an undirected graph.
|
||||
|
||||
<P></P>
|
||||
<DIV ALIGN="center"><A NAME="fig:undir-adj-matrix-graph"></A><A NAME="1509"></A>
|
||||
<TABLE>
|
||||
<CAPTION ALIGN="BOTTOM"><STRONG>Figure 1:</STRONG> Adjacency Matrix Representation of an Undirected Graph.</CAPTION>
|
||||
<TR><TD><IMG SRC="./figs/undir-adj-matrix-graph3.gif" width="260" height="240"></TD>
|
||||
<TD><IMG SRC="./figs/undir-adj-matrix2.gif" width="135" height="136"></TD></TR>
|
||||
</TABLE>
|
||||
</DIV><P></P>
|
||||
|
||||
|
||||
<h3>Example</h3>
|
||||
|
||||
Creating the graph of <a href="#fig:adj-matrix-graph">Figure 1</a>.
|
||||
<pre>
|
||||
enum { A, B, C, D, E, F, N };
|
||||
const char* name = "ABCDEF";
|
||||
|
||||
typedef boost::adjacency_matrix<boost::directedS> Graph;
|
||||
Graph g(N);
|
||||
add_edge(B, C, g);
|
||||
add_edge(B, F, g);
|
||||
add_edge(C, A, g);
|
||||
add_edge(C, C, g);
|
||||
add_edge(D, E, g);
|
||||
add_edge(E, D, g);
|
||||
add_edge(F, A, g);
|
||||
|
||||
std::cout << "vertex set: ";
|
||||
boost::print_vertices(g, name);
|
||||
std::cout << std::endl;
|
||||
|
||||
std::cout << "edge set: ";
|
||||
boost::print_edges(g, name);
|
||||
std::cout << std::endl;
|
||||
|
||||
std::cout << "out-edges: " << std::endl;
|
||||
boost::print_graph(g, name);
|
||||
std::cout << std::endl;
|
||||
</pre>
|
||||
The output is:
|
||||
<pre>
|
||||
vertex set: A B C D E F
|
||||
|
||||
edge set: (B,C) (B,F) (C,A) (C,C) (D,E) (E,D) (F,A)
|
||||
|
||||
out-edges:
|
||||
A -->
|
||||
B --> C F
|
||||
C --> A C
|
||||
D --> E
|
||||
E --> D
|
||||
F --> A
|
||||
</pre>
|
||||
|
||||
Creating the graph of <a href="#fig:undir-adj-matrix-graph">Figure 2</a>.
|
||||
<pre>
|
||||
enum { A, B, C, D, E, F, N };
|
||||
const char* name = "ABCDEF";
|
||||
|
||||
typedef boost::adjacency_matrix<boost::undirectedS> UGraph;
|
||||
UGraph ug(N);
|
||||
add_edge(B, C, ug);
|
||||
add_edge(B, F, ug);
|
||||
add_edge(C, A, ug);
|
||||
add_edge(D, E, ug);
|
||||
add_edge(F, A, ug);
|
||||
|
||||
std::cout << "vertex set: ";
|
||||
boost::print_vertices(ug, name);
|
||||
std::cout << std::endl;
|
||||
|
||||
std::cout << "edge set: ";
|
||||
boost::print_edges(ug, name);
|
||||
std::cout << std::endl;
|
||||
|
||||
std::cout << "incident edges: " << std::endl;
|
||||
boost::print_graph(ug, name);
|
||||
std::cout << std::endl;
|
||||
</pre>
|
||||
The output is:
|
||||
<pre>
|
||||
vertex set: A B C D E F
|
||||
|
||||
edge set: (C,A) (C,B) (E,D) (F,A) (F,B)
|
||||
|
||||
incident edges:
|
||||
A <--> C F
|
||||
B <--> C F
|
||||
C <--> A B
|
||||
D <--> E
|
||||
E <--> D
|
||||
F <--> A B
|
||||
</pre>
|
||||
|
||||
|
||||
<h3>Where Defined</h3>
|
||||
|
||||
<a href="../../../boost/graph/adjacency_matrix.hpp"><tt>boost/graph/adjacency_matrix.hpp</tt></a>
|
||||
|
||||
|
||||
<h3>Template Parameters</h3>
|
||||
|
||||
<p>
|
||||
<table border>
|
||||
|
||||
<TR>
|
||||
<th>Parameter</th><th>Description</th><th>Default</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><tt>Directed</tt></td>
|
||||
<td>A selector to choose whether the graph is directed or undirected. The options are <tt>directedS</tt> and <tt>undirectedS</tt>.</td>
|
||||
<td><tt>directedS</tt></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><tt>VertexProperty</tt></td>
|
||||
<td>for specifying internal property storage.</td>
|
||||
<td><tt>no_property</tt></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><tt>EdgeProperty</tt></td>
|
||||
<td>for specifying internal property storage.</td>
|
||||
<td><tt>no_property</tt></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><tt>GraphProperty</tt></td>
|
||||
<td>for specifying property storage for the graph object.</td>
|
||||
<td><tt>no_property</tt></td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Model Of</h3>
|
||||
|
||||
<a href="./VertexAndEdgeListGraph.html">VertexAndEdgeListGraph</a>,
|
||||
<a href="./IncidenceGraph.html">Incidence Graph</a>,
|
||||
<a href="./BidirectionalGraph.html">Bidirectional Graph</a>,
|
||||
<a
|
||||
href="./AdjacencyMatrix.html">AdjacencyMatrix</a>, <a
|
||||
href="./MutablePropertyGraph.html">MutablePropertyGraph</a>,
|
||||
<a href="../../utility/CopyConstructible.html">CopyConstructible</a>,
|
||||
and <a href="../../utility/Assignable.html">Assignable</a>.
|
||||
|
||||
|
||||
<h3>Associates Types</h3>
|
||||
|
||||
<hr>
|
||||
|
||||
<tt>graph_traits<adjacency_matrix>::vertex_descriptor</tt>
|
||||
<br><br>
|
||||
The type for the vertex descriptors associated with the
|
||||
<tt>adjacency_matrix</tt>.<br>
|
||||
(Required by <a href="./Graph.html">Graph</a>.)
|
||||
|
||||
<hr>
|
||||
|
||||
<tt>graph_traits<adjacency_matrix>::edge_descriptor</tt>
|
||||
<br><br>
|
||||
The type for the edge descriptors associated with the
|
||||
<tt>adjacency_matrix</tt>.<br>
|
||||
(Required by <a href="Graph.html">Graph</a>.)
|
||||
|
||||
<hr>
|
||||
<tt>graph_traits<adjacency_matrix>::vertex_iterator</tt>
|
||||
<br><br>
|
||||
The type for the iterators returned by <tt>vertices()</tt>.
|
||||
The vertex iterator models <a href="http://www.sgi.com/tech/stl/RandomAccessIterator.html">RandomAccessIterator</a>. <br>
|
||||
(Required by <a href="VertexListGraph.html">VertexListGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<tt>graph_traits<adjacency_matrix>::edge_iterator</tt>
|
||||
<br><br>
|
||||
The type for the iterators returned by <tt>edges()</tt>. This
|
||||
iterator models <a href="../../utility/MultiPassInputIterator.html">MultiPassInputIterator</a>.<br>
|
||||
(Required by <a href="EdgeListGraph.html">EdgeListGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<tt>graph_traits<adjacency_matrix>::out_edge_iterator</tt>
|
||||
<br><br>
|
||||
The type for the iterators returned by <tt>out_edges()</tt>. This
|
||||
iterator models <a href="../../utility/MultiPassInputIterator.html">MultiPassInputIterator</a>. <br>
|
||||
(Required by <a href="IncidenceGraph.html">IncidenceGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<tt>graph_traits<adjacency_matrix>::in_edge_iterator</tt>
|
||||
<br><br>
|
||||
The type for the iterators returned by <tt>in_edges()</tt>. This
|
||||
iterator models <a href="../../utility/MultiPassInputIterator.html">MultiPassInputIterator</a>. <br>
|
||||
(Required by <a href="BidirectionalGraph.html">BidirectionalGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<tt>graph_traits<adjacency_matrix>::adjacency_iterator</tt>
|
||||
<br><br>
|
||||
The type for the iterators returned by <tt>adjacent_vertices()</tt>. This
|
||||
iterator models the same concept as the out-edge iterator.<br>
|
||||
(Required by <a href="AdjacencyGraph.html">AdjacencyGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<tt>graph_traits<adjacency_matrix>::directed_category</tt>
|
||||
<br><br>
|
||||
Provides information about whether the graph is directed
|
||||
(<tt>directed_tag</tt>) or undirected (<tt>undirected_tag</tt>).<br>
|
||||
(Required by <a href="Graph.html">Graph</a>.)
|
||||
|
||||
<hr>
|
||||
<tt>graph_traits<adjacency_matrix>::edge_parallel_category</tt>
|
||||
<br><br>
|
||||
An adjacency matrix does not allow the insertion of
|
||||
parallel edges, so this type is always
|
||||
<tt>disallow_parallel_edge_tag</tt>. <br>
|
||||
(Required by <a href="Graph.html">Graph</a>.)
|
||||
|
||||
<hr>
|
||||
<tt>graph_traits<adjacency_matrix>::vertices_size_type</tt>
|
||||
<br><br>
|
||||
The type used for dealing with the number of vertices in
|
||||
the graph.<br>
|
||||
(Required by <a href="VertexListGraph.html">VertexListGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<tt>graph_traits<adjacency_matrix>::edges_size_type</tt>
|
||||
<br><br>
|
||||
The type used for dealing with the number of edges in the graph.<br>
|
||||
(Required by <a href="EdgeListGraph.html">EdgeListGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<tt>graph_traits<adjacency_matrix>::degree_size_type</tt>
|
||||
<br><br>
|
||||
The type used for dealing with the number of out-edges of a vertex.<br>
|
||||
(Required by <a href="IncidenceGraph.html">IncidenceGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<tt>property_map<adjacency_matrix, PropertyTag>::type</tt><br>
|
||||
<tt>property_map<adjacency_matrix, PropertyTag>::const_type</tt>
|
||||
<br><br>
|
||||
The map type for vertex or edge properties in the graph. The
|
||||
specific property is specified by the <tt>PropertyTag</tt> template
|
||||
argument, and must match one of the properties specified in the
|
||||
<tt>VertexProperty</tt> or <tt>EdgeProperty</tt> for the graph.<br>
|
||||
(Required by <a href="PropertyGraph.html">PropertyGraph</a>.)
|
||||
|
||||
<hr>
|
||||
|
||||
<h3>Member Functions</h3>
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
adjacency_matrix(vertices_size_type n,
|
||||
const GraphProperty& p = GraphProperty())
|
||||
</pre>
|
||||
Creates a graph object with <tt>n</tt> vertices and zero edges.<br>
|
||||
(Required by <a href="MutableGraph.html">MutableGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
template <typename EdgeIterator>
|
||||
adjacency_matrix(EdgeIterator first,
|
||||
EdgeIterator last,
|
||||
vertices_size_type n,
|
||||
const GraphProperty& p = GraphProperty())
|
||||
</pre>
|
||||
Creates a graph object with <tt>n</tt> vertices with the edges
|
||||
specified in the edge list given by the range <tt>[first, last)</tt>.
|
||||
The value type of the <tt>EdgeIterator</tt> must be a
|
||||
<tt>std::pair</tt>, where the type in the pair is an integer type. The
|
||||
integers will correspond to vertices, and they must all fall in the
|
||||
range of
|
||||
<tt>[0, n)</tt>. <br>
|
||||
(Required by <a href="IteratorConstructibleGraph.html">IteratorConstructibleGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
template <typename EdgeIterator, typename EdgePropertyIterator>
|
||||
adjacency_matrix(EdgeIterator first, EdgeIterator last,
|
||||
EdgePropertyIterator ep_iter,
|
||||
vertices_size_type n,
|
||||
const GraphProperty& p = GraphProperty())
|
||||
</pre>
|
||||
Creates a graph object with <tt>n</tt> vertices, with the edges
|
||||
specified in the edge list given by the range <tt>[first, last)</tt>.
|
||||
The value type of the <tt>EdgeIterator</tt> must be a
|
||||
<tt>std::pair</tt>, where the type in the pair is an integer type. The
|
||||
integers will correspond to vertices, and they must all fall in the
|
||||
range of <tt>[0, n)</tt>. The <tt>value_type</tt> of the
|
||||
<tt>ep_iter</tt> should be <tt>EdgeProperty</tt>.
|
||||
|
||||
<hr>
|
||||
|
||||
|
||||
<h3>Non-Member Functions</h3>
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
std::pair<vertex_iterator, vertex_iterator>
|
||||
vertices(const adjacency_matrix& g)
|
||||
</pre>
|
||||
Returns an iterator-range providing access to the vertex set of graph <tt>g</tt>.<br>
|
||||
(Required by <a href="VertexListGraph.html">VertexListGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
std::pair<edge_iterator, edge_iterator>
|
||||
edges(const adjacency_matrix& g);
|
||||
</pre>
|
||||
Returns an iterator-range providing access to the edge set of graph <tt>g</tt>.<br>
|
||||
(Required by <a href="EdgeListGraph.html">EdgeListGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
std::pair<adjacency_iterator, adjacency_iterator>
|
||||
adjacent_vertices(vertex_descriptor v, const adjacency_matrix& g)
|
||||
</pre>
|
||||
Returns an iterator-range providing access to the vertices adjacent to
|
||||
vertex <tt>v</tt> in graph <tt>g</tt>.<br>
|
||||
(Required by <a href="AdjacencyGraph.html">AdjacencyGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
std::pair<out_edge_iterator, out_edge_iterator>
|
||||
out_edges(vertex_descriptor v, const adjacency_matrix& g)
|
||||
</pre>
|
||||
Returns an iterator-range providing access to the out-edges of
|
||||
vertex <tt>v</tt> in graph <tt>g</tt>. If the graph is undirected,
|
||||
this iterator-range provides access to all edges incident on
|
||||
vertex <tt>v</tt>. <br>
|
||||
(Required by <a href="IncidenceGraph.html">IncidenceGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
vertex_descriptor
|
||||
source(edge_descriptor e, const adjacency_matrix& g)
|
||||
</pre>
|
||||
Returns the source vertex of edge <tt>e</tt>.<br>
|
||||
(Required by <a href="IncidenceGraph.html">IncidenceGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
vertex_descriptor
|
||||
target(edge_descriptor e, const adjacency_matrix& g)
|
||||
</pre>
|
||||
Returns the target vertex of edge <tt>e</tt>.<br>
|
||||
(Required by <a href="IncidenceGraph.html">IncidenceGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
degree_size_type
|
||||
out_degree(vertex_descriptor u, const adjacency_matrix& g)
|
||||
</pre>
|
||||
Returns the number of edges leaving vertex <tt>u</tt>.<br>
|
||||
(Required by <a href="IncidenceGraph.html">IncidenceGraph</a>.)
|
||||
<hr>
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
std::pair<in_edge_iterator, in_edge_iterator>
|
||||
in_edges(vertex_descriptor v, const adjacency_matrix& g)
|
||||
</pre>
|
||||
Returns an iterator-range providing access to the in-edges of
|
||||
vertex <tt>v</tt> in graph <tt>g</tt>. If the graph is undirected,
|
||||
this iterator-range provides access to all edges incident on
|
||||
vertex <tt>v</tt>. <br>
|
||||
(Required by <a href="BidirectionalGraph.html">BidirectionalGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
degree_size_type
|
||||
in_degree(vertex_descriptor u, const adjacency_matrix& g)
|
||||
</pre>
|
||||
Returns the number of edges entering vertex <tt>u</tt>.<br>
|
||||
(Required by <a href="BidirectionalGraph.html">BidirectionalGraph</a>.)
|
||||
<hr>
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
vertices_size_type num_vertices(const adjacency_matrix& g)
|
||||
</pre>
|
||||
Returns the number of vertices in the graph <tt>g</tt>.<br>
|
||||
(Required by <a href="VertexListGraph.html">VertexListGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
edges_size_type num_edges(const adjacency_matrix& g)
|
||||
</pre>
|
||||
Returns the number of edges in the graph <tt>g</tt>.<br>
|
||||
(Required by <a href="EdgeListGraph.html">EdgeListGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
vertex_descriptor vertex(vertices_size_type n, const adjacency_matrix& g)
|
||||
</pre>
|
||||
Returns the nth vertex in the graph's vertex list.
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
std::pair<edge_descriptor, bool>
|
||||
edge(vertex_descriptor u, vertex_descriptor v,
|
||||
const adjacency_matrix& g)
|
||||
</pre>
|
||||
Returns the edge connecting vertex <tt>u</tt> to vertex <tt>v</tt> in graph <tt>g</tt>.<br>
|
||||
(Required by <a href="AdjacencyMatrix.html">AdjacencyMatrix</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
std::pair<edge_descriptor, bool>
|
||||
add_edge(vertex_descriptor u, vertex_descriptor v,
|
||||
adjacency_matrix& g)
|
||||
</pre>
|
||||
Adds edge <tt>(u,v)</tt> to the graph and returns the edge descriptor for
|
||||
the new edge. If the edge is already in the graph then a duplicate
|
||||
will not be added and the <tt>bool</tt> flag will be <tt>false</tt>.
|
||||
This operation does not invalidate any of the graph's iterators
|
||||
or descriptors.<br>
|
||||
(Required by <a href="MutableGraph.html">MutableGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
std::pair<edge_descriptor, bool>
|
||||
add_edge(vertex_descriptor u, vertex_descriptor v,
|
||||
const EdgeProperty& p,
|
||||
adjacency_matrix& g)
|
||||
</pre>
|
||||
Adds edge <tt>(u,v)</tt> to the graph and attaches <tt>p</tt> as the
|
||||
value of the edge's internal property storage. Also see the previous
|
||||
<tt>add_edge()</tt> member function for more details.
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
void remove_edge(vertex_descriptor u, vertex_descriptor v,
|
||||
adjacency_matrix& g)
|
||||
</pre>
|
||||
Removes the edge <tt>(u,v)</tt> from the graph. <br>
|
||||
(Required by <a href="MutableGraph.html">MutableGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
void remove_edge(edge_descriptor e, adjacency_matrix& g)
|
||||
</pre>
|
||||
Removes the edge <tt>e</tt> from the graph. This is equivalent
|
||||
to calling <tt>remove_edge(source(e, g), target(e, g), g)</tt>.<br>
|
||||
(Required by <a href="MutableGraph.html">MutableGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
void clear_vertex(vertex_descriptor u, adjacency_matrix& g)
|
||||
</pre>
|
||||
Removes all edges to and from vertex <tt>u</tt>. The vertex still appears
|
||||
in the vertex set of the graph.<br>
|
||||
(Required by <a href="MutableGraph.html">MutableGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
template <typename Property>
|
||||
property_map<adjacency_matrix, Property>::type
|
||||
get(Property, adjacency_matrix& g)
|
||||
|
||||
template <typename Property>
|
||||
property_map<adjacency_matrix, Property>::const_type
|
||||
get(Property, const adjacency_matrix& g)
|
||||
</pre>
|
||||
Returns the property map object for the vertex property specified by
|
||||
<tt>Property</tt>. The <tt>Property</tt> must match one of the
|
||||
properties specified in the graph's <tt>VertexProperty</tt> template
|
||||
argument.<br>
|
||||
(Required by <a href="PropertyGraph.html">PropertyGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
template <typename Property, typename X>
|
||||
typename property_traits<
|
||||
typename property_map<adjacency_matrix, Property>::const_type
|
||||
>::value_type
|
||||
get(Property, const adjacency_matrix& g, X x)
|
||||
</pre>
|
||||
This returns the property value for <tt>x</tt>, which is either
|
||||
a vertex or edge descriptor.<br>
|
||||
(Required by <a href="PropertyGraph.html">PropertyGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
template <typename Property, typename X, typename Value>
|
||||
void
|
||||
put(Property, const adjacency_matrix& g, X x, const Value& value)
|
||||
</pre>
|
||||
This sets the property value for <tt>x</tt> to
|
||||
<tt>value</tt>. <tt>x</tt> is either a vertex or edge descriptor.
|
||||
<tt>Value</tt> must be convertible to
|
||||
<tt>typename property_traits<property_map<adjacency_matrix, Property>::type>::value_type</tt>.<br>
|
||||
(Required by <a href="PropertyGraph.html">PropertyGraph</a>.)
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
template <typename GraphProperty, typename GraphProperty>
|
||||
typename property_value<GraphProperty, GraphProperty>::type&
|
||||
get_property(adjacency_matrix& g, GraphProperty)
|
||||
</pre>
|
||||
Return the property specified by <tt>GraphProperty</tt> that is attached
|
||||
to the graph object <tt>g</tt>. The <tt>property_value</tt> traits class
|
||||
is defined in <tt>boost/pending/property.hpp</tt>.
|
||||
|
||||
<hr>
|
||||
<pre>
|
||||
template <typename GraphProperty, typename GraphProperty>
|
||||
const typename property_value<GraphProperty, GraphProperty>::type&
|
||||
get_property(const adjacency_matrix& g, GraphProperty)
|
||||
</pre>
|
||||
Return the property specified by <tt>GraphProperty</tt> that is
|
||||
attached to the graph object <tt>g</tt>. The <tt>property_value</tt>
|
||||
traits class is defined in <tt>boost/pending/property.hpp</tt>.
|
||||
|
||||
|
||||
<hr>
|
||||
@@ -0,0 +1,96 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) 2004 Kris Beevers
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: astar_heuristic</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1>
|
||||
<pre>
|
||||
astar_heuristic<Graph, CostType>
|
||||
</pre>
|
||||
</H1>
|
||||
|
||||
This class is a default implementation of the <a
|
||||
href="./AStarHeuristic.html">AStarHeuristic</a> concept. It
|
||||
implements a "zero" heuristic -- a heuristic function that returns a
|
||||
cost of zero regardless of the vertex it is passed.
|
||||
|
||||
<h3>Model of</h3>
|
||||
|
||||
<a href="./AStarHeuristic.html">AStarHeuristic</a>
|
||||
|
||||
<H3>Template Parameters</H3>
|
||||
|
||||
<P>
|
||||
<TABLE border>
|
||||
<TR>
|
||||
<th>Parameter</th><th>Description</th><th>Default</th>
|
||||
</tr>
|
||||
|
||||
<TR><TD><TT>Graph</TT></TD>
|
||||
<TD>
|
||||
The type of the graph being searched.
|
||||
</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
|
||||
<TR><TD><TT>CostType</TT></TD>
|
||||
<TD>
|
||||
A type that can be used with the <tt>compare</tt> and
|
||||
<tt>combine</tt> functions passed to A*. Typically an integer or
|
||||
floating point type.
|
||||
</TD>
|
||||
<TD></TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<H3>Where Defined</H3>
|
||||
|
||||
<P>
|
||||
<a href="../../../boost/graph/astar_search.hpp">
|
||||
<TT>boost/graph/astar_search.hpp</TT></a>
|
||||
|
||||
<h3>Member Functions</h3>
|
||||
|
||||
This class implements the single member function required by <a
|
||||
href="./AStarHeuristic.html">AStarHeuristic</a>:
|
||||
|
||||
<table border>
|
||||
<tr>
|
||||
<th>Function</th><th>Description</th>
|
||||
</tr>
|
||||
|
||||
<tr><td><tt>
|
||||
CostType operator()(graph_traits<Graph>::vertex_descriptor u);
|
||||
</tt></td><td>
|
||||
Called for the target of every out edge of a vertex being examined.
|
||||
Returns the cost, estimated by the heuristic, from vertex <tt>u</tt>
|
||||
to a goal.
|
||||
</td></tr>
|
||||
|
||||
</table>
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2004</TD><TD>
|
||||
<A HREF="http://www.cs.rpi.edu/~beevek/">Kristopher Beevers</A>,
|
||||
Rensselaer Polytechnic Institute (<A
|
||||
HREF="mailto:beevek@cs.rpi.edu">beevek@cs.rpi.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -0,0 +1,477 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) 2004 Kris Beevers
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: A* Heuristic Search</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1><A NAME="sec:astar"></A>
|
||||
<TT>astar_search</TT>
|
||||
</H1>
|
||||
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
<i>// Named parameter interface</i>
|
||||
template <typename VertexListGraph,
|
||||
typename AStarHeuristic,
|
||||
typename P, typename T, typename R>
|
||||
void
|
||||
astar_search
|
||||
(VertexListGraph &g,
|
||||
typename graph_traits<VertexListGraph>::vertex_descriptor s,
|
||||
<a href="AStarHeuristic.html">AStarHeuristic</a> h, const bgl_named_params<P, T, R>& params);
|
||||
|
||||
<i>// Non-named parameter interface</i>
|
||||
template <typename VertexListGraph, typename AStarHeuristic,
|
||||
typename <a href="AStarVisitor.html">AStarVisitor</a>, typename PredecessorMap,
|
||||
typename CostMap, typename DistanceMap,
|
||||
typename WeightMap, typename VertexIndexMap,
|
||||
typename ColorMap,
|
||||
typename <a href="http://www.sgi.com/tech/stl/BinaryPredicate.html">CompareFunction</a>, typename <a href="http://www.sgi.com/tech/stl/BinaryFunction.html">CombineFunction</a>,
|
||||
typename CostInf, typename CostZero>
|
||||
inline void
|
||||
astar_search
|
||||
(VertexListGraph &g,
|
||||
typename graph_traits<VertexListGraph>::vertex_descriptor s,
|
||||
AStarHeuristic h, AStarVisitor vis,
|
||||
PredecessorMap predecessor, CostMap cost,
|
||||
DistanceMap distance, WeightMap weight,
|
||||
VertexIndexMap index_map, ColorMap color,
|
||||
CompareFunction compare, CombineFunction combine,
|
||||
CostInf inf, CostZero zero);
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
This algorithm implements a heuristic search on a weighted, directed
|
||||
or undirected graph for the case where all edge weights are
|
||||
non-negative.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
The A* algorithm is a <i>heuristic graph search algorithm</i>: an A*
|
||||
search is "guided" by a <i>heuristic function</i>. A heuristic
|
||||
function <i>h(v)</i> is one which estimates the cost from a non-goal
|
||||
state (<i>v</i>) in the graph to some goal state, <i>g</i>.
|
||||
Intuitively, A* follows paths (through the graph) to the goal that are
|
||||
estimated by the heuristic function to be the best paths. Unlike
|
||||
best-first search, A* takes into account the known cost from the start
|
||||
of the search to <i>v</i>; the paths A* takes are guided by a function
|
||||
<i>f(v) = g(v) + h(v)</i>, where <i>h(v)</i> is the heuristic
|
||||
function, and <i>g(v)</i> (sometimes denoted <i>c(s, v)</i>) is the
|
||||
known cost from the start to <i>v</i>. Clearly, the efficiency of A*
|
||||
is highly dependent on the heuristic function with which it is used.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
The A* algorithm is very similar to Dijkstra's Shortest Paths
|
||||
algorithm. This implementation finds all the shortest paths from the
|
||||
start vertex to every other vertex by creating a search tree,
|
||||
examining vertices according to their remaining cost to some goal, as
|
||||
estimated by a heuristic function. Most commonly, A* is used to find
|
||||
some specific goal vertex or vertices in a graph, after which the
|
||||
search is terminated.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
A* is particularly useful for searching <i>implicit</i> graphs.
|
||||
Implicit graphs are graphs that are not completely known at the
|
||||
beginning of the search. Upon visiting a vertex, its neighbors are
|
||||
"generated" and added to the search. Implicit graphs are particularly
|
||||
useful for searching large state spaces -- in gameplaying scenarios
|
||||
(e.g. chess), for example -- in which it may not be possible to store
|
||||
the entire graph. Implicit searches can be performed with this
|
||||
implementation of A* by creating special visitors that generate
|
||||
neighbors of newly-expanded vertices.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
This implementation of A* is based on an OPEN/CLOSED list formulation
|
||||
of the algorithm. Vertices on the OPEN list have been ``discovered''
|
||||
by the algorithm, but not ``expanded'' (we have not discovered their
|
||||
adjacent vertices). Vertices on the CLOSED list have been completely
|
||||
examined by our search (we have expanded them and added their children
|
||||
to the OPEN list). Vertices that are on neither list have not been
|
||||
encountered in any context so far in our search. A major advantage of
|
||||
this formulation of the A* algorithm over other approaches is that it
|
||||
avoids ``cycles'' in the state space; the search will not become
|
||||
trapped by loops in the graph. The OPEN/CLOSED lists are implemented
|
||||
using BGL's vertex coloring mechanisms. Vertices in OPEN are colored
|
||||
gray, vertices in CLOSED are colored black, and undiscovered vertices
|
||||
are colored white.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
The criteria for expanding a vertex on the OPEN list is that it has
|
||||
the lowest <i>f(v) = g(v) + h(v)</i> value of all vertices on OPEN.
|
||||
Cost information about vertices is stored in a property map.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
The following is the pseudocode for the A* heuristic search algorithm.
|
||||
In the pseudocode, <i>h</i> is the heuristic function, <i>w</i> is the
|
||||
edge weight, <i>d</i> is the distance of a vertex from <i>s</i>, and
|
||||
<i>Q</i> is a priority queue, sorted by <i>f</i>, the estimated cost
|
||||
to the goal of the path through a vertex. <i>p</i> is a predecessor
|
||||
map. The visitor event points for the algorithm are indicated by the
|
||||
labels on the right.
|
||||
</P>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>
|
||||
A*(<i>G</i>, <i>s</i>, <i>h</i>)
|
||||
<b>for</b> each vertex <i>u in V</i>
|
||||
<i>d[u] := f[u] := infinity</i>
|
||||
<i>color[u] :=</i> WHITE
|
||||
<i>p[u] := u</i>
|
||||
<b>end for</b>
|
||||
<i>color[s] :=</i> GRAY
|
||||
<i>d[s] := 0</i>
|
||||
<i>f[s] := h(s)</i>
|
||||
INSERT(<i>Q, s</i>)
|
||||
<b>while</b> (<i>Q != Ø</i>)
|
||||
<i>u :=</i> EXTRACT-MIN(<i>Q</i>)
|
||||
<b>for</b> each vertex <i>v in Adj[u]</i>
|
||||
<b>if</b> (<i>w(u,v) + d[u] < d[v]</i>)
|
||||
<i>d[v] := w(u,v) + d[u]</i>
|
||||
<i>f[v] := d[v] + h(v)</i>
|
||||
<i>p[v] := u</i>
|
||||
<b>if</b> (<i>color[v] =</i> WHITE)
|
||||
<i>color[v] :=</i> GRAY
|
||||
INSERT(<i>Q, v</i>)
|
||||
<b>else if</b> (<i>color[v] =</i> BLACK)
|
||||
<i>color[v] :=</i> GRAY
|
||||
INSERT(<i>Q, v</i>)
|
||||
<b>end if</b>
|
||||
<b>else</b>
|
||||
<i>...</i>
|
||||
<b>end for</b>
|
||||
<i>color[u] :=</i> BLACK
|
||||
<b>end while</b>
|
||||
</pre>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<pre>
|
||||
|
||||
initialize vertex <i>u</i>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
discover vertex <i>s</i>
|
||||
|
||||
examine vertex <i>u</i>
|
||||
examine edge <i>(u,v)</i>
|
||||
|
||||
edge <i>(u,v)</i> relaxed
|
||||
|
||||
|
||||
|
||||
|
||||
discover vertex <i>v</i>
|
||||
|
||||
|
||||
reopen vertex <i>v</i>
|
||||
|
||||
|
||||
edge <i>(u,v)</i> not relaxed
|
||||
|
||||
finish vertex <i>u</i>
|
||||
</pre>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3>Where Defined</h3>
|
||||
|
||||
<a href="../../../boost/graph/astar_search.hpp"><tt>boost/graph/astar_search.hpp</tt></a>
|
||||
|
||||
<h3>Parameters</h3>
|
||||
|
||||
IN: <tt>VertexListGraph& g</tt>
|
||||
<blockquote>
|
||||
The graph object on which the algorithm will be applied. The type
|
||||
<tt>VertexListGraph</tt> must be a model of the <a
|
||||
href="VertexListGraph.html">
|
||||
Vertex List Graph</a> concept.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>vertex_descriptor s</tt>
|
||||
<blockquote>
|
||||
The start vertex for the search. All distances will be calculated
|
||||
from this vertex, and the shortest paths tree (recorded in the
|
||||
predecessor map) will be rooted at this vertex.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>AStarHeuristic h</tt>
|
||||
<blockquote>
|
||||
The heuristic function that guides the search. The type
|
||||
<tt>AStarHeuristic</tt> must be a model of the <a href="AStarHeuristic.html">AStarHeuristic</a>
|
||||
concept.
|
||||
</blockquote>
|
||||
|
||||
<h3>Named Parameters</h3>
|
||||
|
||||
IN: <tt>weight_map(WeightMap w_map)</tt>
|
||||
<blockquote>
|
||||
The weight or ``length'' of each edge in the graph. The weights
|
||||
must all be non-negative; the algorithm will throw a <a
|
||||
href="./exception.html#negative_edge"><tt>negative_edge</tt></a>
|
||||
exception if one of the edges is negative. The type
|
||||
<tt>WeightMap</tt> must be a model of <a
|
||||
href="../../property_map/ReadablePropertyMap.html"><tt>Readable
|
||||
Property Map</tt></a>. The edge descriptor type of the graph needs
|
||||
to be usable as the key type for the weight map. The value type
|
||||
for this map must be the same as the value type of the distance
|
||||
map.<br>
|
||||
<b>Default:</b> <tt>get(edge\_weight, g)</tt>
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>vertex_index_map(VertexIndexMap i_map)</tt>
|
||||
<blockquote>
|
||||
This maps each vertex to an integer in the range <tt>[0,
|
||||
num_vertices(g))</tt>. This is necessary for efficient updates of
|
||||
the heap data structure when an edge is relaxed. The type
|
||||
<tt>VertexIndexMap</tt> must be a model of <a
|
||||
href="../../property_map/ReadablePropertyMap.html"><tt>Readable
|
||||
Property Map</tt></a>. The value type of the map must be an integer
|
||||
type. The vertex descriptor type of the graph needs to be usable as
|
||||
the key type of the map.<br>
|
||||
|
||||
<b>Default:</b> <tt>get(vertex_index, g)</tt>.
|
||||
Note: if you use this default, make sure your graph has
|
||||
an internal <tt>vertex_index</tt> property. For example,
|
||||
<tt>adjacenty_list</tt> with <tt>VertexList=listS</tt> does
|
||||
not have an internal <tt>vertex_index</tt> property.
|
||||
</blockquote>
|
||||
|
||||
OUT: <tt>predecessor_map(PredecessorMap p_map)</tt>
|
||||
<blockquote>
|
||||
|
||||
The predecessor map records the edges in the minimum spanning tree.
|
||||
Upon completion of the algorithm, the edges <tt>(p[u],u)</tt> for
|
||||
all <tt>u</tt> in <tt>V</tt> are in the minimum spanning tree. If
|
||||
<tt>p[u] = u</tt> then <tt>u</tt> is either the start vertex or a
|
||||
vertex that is not reachable from the start. The
|
||||
<tt>PredecessorMap</tt> type must be a <a
|
||||
href="../../property_map/ReadWritePropertyMap.html"><tt>Read/Write
|
||||
Property Map</tt></a> with key and vertex types the same as the
|
||||
vertex descriptor type of the graph.<br>
|
||||
|
||||
<b>Default:</b> <tt>dummy_property_map</tt>
|
||||
</blockquote>
|
||||
|
||||
UTIL/OUT: <tt>distance_map(DistanceMap d_map)</tt>
|
||||
<blockquote>
|
||||
|
||||
The shortest path weight from the start vertex <tt>s</tt> to each
|
||||
vertex in the graph <tt>g</tt> is recorded in this property map.
|
||||
The shortest path weight is the sum of the edge weights along the
|
||||
shortest path. The type <tt>DistanceMap</tt> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html"><tt>Read/Write
|
||||
Property Map</tt></a>. The vertex descriptor type of the graph
|
||||
needs to be usable as the key type of the distance map. The value
|
||||
type of the distance map is the element type of a <a
|
||||
href="./Monoid.html"><tt>Monoid</tt></a> formed with the
|
||||
<tt>combine</tt> function object and the zero object for the
|
||||
identity element. Also the distance value type must have a <a
|
||||
href="http://www.sgi.com/tech/stl/StrictWeakOrdering.html"><tt>StrictWeakOrdering</tt></a>
|
||||
provided by the <tt>compare</tt> function object.<br>
|
||||
|
||||
<b>Default:</b> <tt>iterator_property_map</tt> created from a
|
||||
<tt>std::vector</tt> with the same value type as the
|
||||
<tt>WeightMap</tt>, and of size <tt>num_vertices(g)</tt>, and using
|
||||
the <tt>i_map</tt> for the index map.
|
||||
</blockquote>
|
||||
|
||||
UTIL/OUT: <tt>rank_map(CostMap c_map)</tt>
|
||||
<blockquote>
|
||||
|
||||
The <i>f</i>-value for each vertex. The <i>f</i>-value is defined
|
||||
as the sum of the cost to get to a vertex from the start vertex, and
|
||||
the estimated cost (as returned by the heuristic function
|
||||
<tt>h</tt>) from the vertex to a goal. The type <tt>CostMap</tt>
|
||||
must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html"><tt>Read/Write
|
||||
Property Map</tt></a>. The vertex descriptor type of the graph
|
||||
needs to be usable as the key type of the distance map. The value
|
||||
type of the distance map is the element type of a <a
|
||||
href="./Monoid.html"><tt>Monoid</tt></a> formed with the
|
||||
<tt>combine</tt> function object and the zero object for the
|
||||
identity element. Also the distance value type must have a <a
|
||||
href="http://www.sgi.com/tech/stl/StrictWeakOrdering.html"><tt>StrictWeakOrdering</tt></a>
|
||||
provided by the <tt>compare</tt> function object. The value type
|
||||
for this map must be the same as the value type for the distance
|
||||
map.<br>
|
||||
|
||||
<b>Default:</b> <tt>iterator_property_map</tt> created from a
|
||||
<tt>std::vector</tt> with the same value type as the
|
||||
<tt>WeightMap</tt>, and of size <tt>num_vertices(g)</tt>, and using
|
||||
the <tt>i_map</tt> for the index map.
|
||||
</blockquote>
|
||||
|
||||
UTIL/OUT: <tt>color_map(ColorMap c_map)</tt>
|
||||
<blockquote>
|
||||
|
||||
This is used during the execution of the algorithm to mark the
|
||||
vertices, indicating whether they are on the OPEN or CLOSED lists.
|
||||
The vertices start out white and become gray when they are inserted
|
||||
into the OPEN list. They then turn black when they are examined and
|
||||
placed on the CLOSED list. At the end of the algorithm, vertices
|
||||
reachable from the source vertex will have been colored black. All
|
||||
other vertices will still be white. The type <tt>ColorMap</tt> must
|
||||
be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html"><tt>Read/Write
|
||||
Property Map</tt></a>. A vertex descriptor must be usable as the
|
||||
key type of the map, and the value type of the map must be a model
|
||||
of <a href="./ColorValue.html"><tt>Color Value</tt></a>.<br>
|
||||
|
||||
<b>Default:</b> <tt>iterator_property_map</tt> created from a
|
||||
<tt>std::vector</tt> of value type <tt>default_color_type</tt>, with
|
||||
size <tt>num_vertices(g)</tt>, and using the <tt>i_map</tt> for the
|
||||
index map.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>distance_compare(CompareFunction cmp)</tt>
|
||||
<blockquote>
|
||||
|
||||
This function is use to compare distances to determine which vertex
|
||||
is closer to the start vertex, and to compare <i>f</i>-values to
|
||||
determine which vertex on the OPEN list to examine next. The
|
||||
<tt>CompareFunction</tt> type must be a model of <a
|
||||
href="http://www.sgi.com/tech/stl/BinaryPredicate.html"><tt>Binary
|
||||
Predicate</tt></a> and have argument types that match the value type
|
||||
of the <tt>DistanceMap</tt> property map.<br>
|
||||
|
||||
<b>Default:</b> <tt>std::less<D></tt> with <tt>D = typename
|
||||
property_traits<DistanceMap>::value_type</tt>.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>distance_combine(CombineFunction cmb)</tt>
|
||||
<blockquote>
|
||||
|
||||
This function is used to combine distances to compute the distance
|
||||
of a path, and to combine distance and heuristic values to compute
|
||||
the <i>f</i>-value of a vertex. The <tt>CombineFunction</tt> type
|
||||
must be a model of <a
|
||||
href="http://www.sgi.com/tech/stl/BinaryFunction.html"><tt>Binary
|
||||
Function</tt></a>. Both argument types of the binary function must
|
||||
match the value type of the <tt>DistanceMap</tt> property map (which
|
||||
is the same as that of the <tt>WeightMap</tt> and <tt>CostMap</tt>
|
||||
property maps). The result type must be the same type as the
|
||||
distance value type.<br>
|
||||
|
||||
<b>Default:</b> <tt>std::plus<D></tt> with <tt>D = typename
|
||||
property_traits<DistanceMap>::value_type</tt>.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>distance_inf(D inf)</tt>
|
||||
<blockquote>
|
||||
|
||||
The <tt>inf</tt> object must be the greatest value of any <tt>D</tt>
|
||||
object. That is, <tt>compare(d, inf) == true</tt> for any <tt>d !=
|
||||
inf</tt>. The type <tt>D</tt> is the value type of the
|
||||
<tt>DistanceMap</tt>.<br>
|
||||
|
||||
<b>Default:</b> <tt>std::numeric_limits<D>::max()</tt>
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>distance_zero(D zero)</tt>
|
||||
<blockquote>
|
||||
|
||||
The <tt>zero</tt> value must be the identity element for the <a
|
||||
href="./Monoid.html"><tt>Monoid</tt></a> formed by the distance
|
||||
values and the <tt>combine</tt> function object. The type
|
||||
<tt>D</tt> is the value type of the <tt>DistanceMap</tt>.<br>
|
||||
|
||||
<b>Default</b>: <tt>D()</tt> with <tt>D = typename
|
||||
property_traits<DistanceMap>::value_type</tt>.
|
||||
</blockquote>
|
||||
|
||||
OUT: <tt>visitor(AStarVisitor v)</tt>
|
||||
<blockquote>
|
||||
|
||||
Use this to specify actions that you would like to happen during
|
||||
certain event points within the algorithm. The type
|
||||
<tt>AStarVisitor</tt> must be a model of the <a
|
||||
href="AStarVisitor.html"><tt>AStarVisitor</tt></a> concept. The
|
||||
visitor object is passed by value <a href="#1">[1]</a>.<br>
|
||||
|
||||
<b>Default:</b> <tt>astar_visitor<null_visitor></tt>
|
||||
</blockquote>
|
||||
|
||||
<H3>Complexity</H3>
|
||||
|
||||
<P>
|
||||
The time complexity is <i>O((E + V) log V)</i>.
|
||||
|
||||
<h3>Visitor Event Points</h3>
|
||||
|
||||
<ul>
|
||||
<li><b><tt>vis.initialize_vertex(u, g)</tt></b>
|
||||
is invoked on each vertex in the graph before the start of the
|
||||
algorithm.
|
||||
<li><b><tt>vis.discover_vertex(v, g)</tt></b>
|
||||
is invoked when a vertex is first discovered and is added to the
|
||||
OPEN list.
|
||||
<li><b><tt>vis.examine_vertex(u, g)</tt></b>
|
||||
is invoked when a vertex is popped from
|
||||
the queue (i.e., it has the lowest cost on the OPEN list).
|
||||
<li><b><tt>vis.examine_edge(e, g)</tt></b>
|
||||
is invoked on each out-edge of a vertex immediately after it is
|
||||
examined.
|
||||
<li><b><tt>vis.edge_relaxed(e, g)</tt></b>
|
||||
is invoked on edge <i>(u,v)</i> if <i>d[u] + w(u,v) < d[v]</i>.
|
||||
<li><b><tt>vis.edge_not_relaxed(e, g)</tt></b>
|
||||
is invoked if the edge is not relaxed (see above).
|
||||
<li><b><tt>vis.black_target(e, g)</tt></b>
|
||||
is invoked when a vertex that is on the CLOSED list is
|
||||
"rediscovered" via a more efficient path, and is re-added to the
|
||||
OPEN list.
|
||||
<li><b><tt>vis.finish_vertex(u, g)</tt></b>
|
||||
is invoked on a vertex when it is added to the CLOSED list, which
|
||||
happens after all of its out edges have been examined.
|
||||
</ul>
|
||||
|
||||
<H3>Example</H3>
|
||||
|
||||
<P>
|
||||
See <a href="../example/astar-cities.cpp">
|
||||
<TT>example/astar-cities.cpp</TT></a> for an example of
|
||||
using A* search.
|
||||
|
||||
<H3>Notes</H3>
|
||||
|
||||
<a name="1">[1]</a> Since the visitor parameter is passed by value, if
|
||||
your visitor contains state then any changes to the state during the
|
||||
algorithm will be made to a copy of the visitor object, not the
|
||||
visitor object passed in. Therefore you may want the visitor to hold
|
||||
this state by pointer or reference.
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2004</TD><TD>
|
||||
<A HREF="http://www.cs.rpi.edu/~beevek/">Kristopher Beevers</A>,
|
||||
Rensselaer Polytechnic Institute (<A
|
||||
HREF="mailto:beevek@cs.rpi.edu">beevek@cs.rpi.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -0,0 +1,108 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) 2004 Kris Beevers
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: astar_visitor</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1>
|
||||
<pre>
|
||||
astar_visitor<EventVisitorList>
|
||||
</pre>
|
||||
</H1>
|
||||
|
||||
This class is an adapter that converts a list of <a
|
||||
href="./EventVisitor.html">EventVisitor</a>'s (constructed using
|
||||
<tt>std::pair</tt>) into a <a
|
||||
href="./AStarVisitor.html">AStarVisitor</a>.
|
||||
|
||||
|
||||
<h3>Example</h3>
|
||||
|
||||
See the example for <a href="./EventVisitor.html">EventVisitor</a>.
|
||||
|
||||
<h3>Model of</h3>
|
||||
|
||||
<a href="./AStarVisitor.html">AStarVisitor</a>
|
||||
|
||||
<H3>Template Parameters</H3>
|
||||
|
||||
<P>
|
||||
<TABLE border>
|
||||
<TR>
|
||||
<th>Parameter</th><th>Description</th><th>Default</th>
|
||||
</tr>
|
||||
|
||||
<TR><TD><TT>EventVisitorList</TT></TD>
|
||||
<TD>
|
||||
A list of <a href="./EventVisitor.html">EventVisitor</a>'s created
|
||||
with <tt>std::pair</tt>.
|
||||
</TD>
|
||||
<TD><TT><a href="./null_visitor.html"><tt>null_visitor</tt></a></TT></TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<H3>Where Defined</H3>
|
||||
|
||||
<P>
|
||||
<a href="../../../boost/graph/astar_search.hpp">
|
||||
<TT>boost/graph/astar_search.hpp</TT></a>
|
||||
|
||||
<h3>Member Functions</h3>
|
||||
|
||||
This class implements all of the member functions required by <a
|
||||
href="./AStarVisitor.html">AStarVisitor</a>. In each function the
|
||||
appropriate event is dispatched to the <a
|
||||
href="./EventVisitor.html">EventVisitor</a>'s in the
|
||||
EventVisitorList.
|
||||
|
||||
<h3>Non-Member Functions</h3>
|
||||
|
||||
<table border>
|
||||
<tr>
|
||||
<th>Function</th><th>Description</th>
|
||||
</tr>
|
||||
|
||||
<tr><td><tt>
|
||||
template <class EventVisitorList><br>
|
||||
astar_visitor<EventVisitorList><br>
|
||||
make_astar_visitor(EventVisitorList ev_list);
|
||||
</tt></td><td>
|
||||
Returns the event visitor list adapted to be an A* visitor.
|
||||
</td></tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
<a href="./visitor_concepts.html">Visitor concepts</a>
|
||||
<p>
|
||||
The following are event visitors: <a
|
||||
href="./predecessor_recorder.html"><tt>predecessor_recorder</tt></a>,
|
||||
<a href="./distance_recorder.html"><tt>distance_recorder</tt></a>,
|
||||
<a href="./time_stamper.html"><tt>time_stamper</tt></a>,
|
||||
and <a href="./property_writer.html"><tt>property_writer</tt></a>.
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2004</TD><TD>
|
||||
<A HREF="http://www.cs.rpi.edu/~beevek/">Kristopher Beevers</A>,
|
||||
Rensselaer Polytechnic Institute (<A
|
||||
HREF="mailto:beevek@cs.rpi.edu">beevek@cs.rpi.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -0,0 +1,6 @@
|
||||
\DeclareOption{awpaper}
|
||||
{\setlength\paperheight {9.25in}%
|
||||
\setlength\paperwidth {7.375in}}
|
||||
\DeclareOption*{\PassOptonsToPackage{\CurrentOption}{newsiambook}}
|
||||
\ProcessOptions
|
||||
\ExecuteOptions{awpaper}
|
||||
@@ -0,0 +1,93 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Bandwidth</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1><A NAME="sec:bandwidth">
|
||||
<TT>bandwidth</TT>
|
||||
</H1>
|
||||
|
||||
<pre>
|
||||
(1)
|
||||
template <typename Graph>
|
||||
typename graph_traits<Graph>::vertices_size_type
|
||||
bandwidth(const Graph& g)
|
||||
|
||||
(2)
|
||||
template <typename Graph, typename VertexIndexMap>
|
||||
typename graph_traits<Graph>::vertices_size_type
|
||||
bandwidth(const Graph& g, VertexIndexMap index_map)
|
||||
</pre>
|
||||
|
||||
The <b><i>bandwidth</i></b> of an undirected graph is the maximum
|
||||
distance between two adjacent vertices, with distance measured on a
|
||||
line upon which the vertices have been placed at unit intervals. To
|
||||
put it another way, if the vertices of an undirected graph
|
||||
<i>G=(V,E)</i> are each assigned an index from zero to <i>|V| - 1</i>
|
||||
given by <i>index[v]</i>, then the bandwidth of <i>G</i> is<br>
|
||||
<br>
|
||||
<i>B(G) = max { |index[u] - index[v]| | (u,v) in E }</i><br>
|
||||
|
||||
|
||||
<h3>Defined in</h3>
|
||||
|
||||
<a href="../../../boost/graph/bandwidth.hpp"><tt>boost/graph/bandwidth.hpp</tt></a>
|
||||
|
||||
|
||||
<hr>
|
||||
|
||||
<H1><A NAME="sec:ith-bandwidth">
|
||||
<TT>ith_bandwidth</TT>
|
||||
</H1>
|
||||
|
||||
<pre>
|
||||
(1)
|
||||
template <typename Graph>
|
||||
typename graph_traits<Graph>::vertices_size_type
|
||||
ith_bandwidth(typename graph_traits<Graph>::vertex_descriptor i,
|
||||
const Graph& g)
|
||||
|
||||
(2)
|
||||
template <typename Graph, typename VertexIndexMap>
|
||||
typename graph_traits<Graph>::vertices_size_type
|
||||
ith_bandwidth(typename graph_traits<Graph>::vertex_descriptor i,
|
||||
const Graph& g,
|
||||
VertexIndexMap index)
|
||||
</pre>
|
||||
|
||||
The <b><i>i-th bandwidth</i></b> a graph is the maximum distance
|
||||
between the <i>i-th</i> vertex and any of its neighbors.<br>
|
||||
<br>
|
||||
<i>B<sub>i</sub>(G) = max { |index[i] - index[j]| | (i,j) in E }</i><br>
|
||||
<br>
|
||||
So the bandwidth <i>B(G)</i> can be expressed as the maximum
|
||||
of the i-th bandwidths <i>B<sub>i</sub>(G)</i>.<br>
|
||||
<br>
|
||||
<i>B(G) = max { B<sub>i</sub>(G) | i=0...|V|-1 }</i><br>
|
||||
|
||||
<h3>Defined in</h3>
|
||||
|
||||
<a href="../../../boost/graph/bandwidth.hpp"><tt>boost/graph/bandwidth.hpp</tt></a>
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -0,0 +1,151 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<!--
|
||||
-- Copyright (c) 2004 Trustees of Indiana University
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<html>
|
||||
<head>
|
||||
<meta name="generator" content=
|
||||
"HTML Tidy for Mac OS X (vers 12 April 2005), see www.w3.org">
|
||||
<meta http-equiv="Content-Type" content=
|
||||
"text/html; charset=us-ascii">
|
||||
<title>Function betweenness_centrality_clustering</title>
|
||||
</head>
|
||||
<body>
|
||||
<div class="titlepage"></div>
|
||||
<div class="refnamediv">
|
||||
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<h1><img src="figs/python.gif" alt="(Python)"/><span class="refentrytitle">Function
|
||||
betweenness_centrality_clustering</span></h1>
|
||||
<p>boost::betweenness_centrality_clustering — Graph
|
||||
clustering based on edge betweenness centrality.</p>
|
||||
</div>
|
||||
<h2 xmlns:rev=
|
||||
"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class=
|
||||
"refsynopsisdiv-title">Synopsis</h2>
|
||||
<div xmlns:rev=
|
||||
"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class=
|
||||
"refsynopsisdiv">
|
||||
<pre class="synopsis">
|
||||
<span class="bold"><b>template</b></span><<span class=
|
||||
"bold"><b>typename</b></span> MutableGraph, <span class=
|
||||
"bold"><b>typename</b></span> Done, <span class=
|
||||
"bold"><b>typename</b></span> EdgeCentralityMap,
|
||||
<span class=
|
||||
"bold"><b>typename</b></span> VertexIndexMap>
|
||||
<span class="type"><span class=
|
||||
"bold"><b>void</b></span></span> betweenness_centrality_clustering(MutableGraph & g, Done done,
|
||||
EdgeCentralityMap edge_centrality,
|
||||
VertexIndexMap vertex_index);
|
||||
<span class="bold"><b>template</b></span><<span class=
|
||||
"bold"><b>typename</b></span> MutableGraph, <span class=
|
||||
"bold"><b>typename</b></span> Done, <span class=
|
||||
"bold"><b>typename</b></span> EdgeCentralityMap>
|
||||
<span class="type"><span class=
|
||||
"bold"><b>void</b></span></span> betweenness_centrality_clustering(MutableGraph & g, Done done,
|
||||
EdgeCentralityMap edge_centrality);
|
||||
<span class="bold"><b>template</b></span><<span class=
|
||||
"bold"><b>typename</b></span> MutableGraph, <span class=
|
||||
"bold"><b>typename</b></span> Done>
|
||||
<span class="type"><span class=
|
||||
"bold"><b>void</b></span></span> betweenness_centrality_clustering(MutableGraph & g, Done done);
|
||||
</pre></div>
|
||||
<div class="refsect1" lang="en"><a name="id822306" id=
|
||||
"id822306"></a>
|
||||
<h2>Description</h2>
|
||||
<p>This algorithm implements graph clustering based on edge
|
||||
betweenness centrality. It is an iterative algorithm, where in each
|
||||
step it compute the edge betweenness centrality (via <a href=
|
||||
"betweenness_centrality.html">brandes_betweenness_centrality</a>) and
|
||||
removes the edge with the maximum betweenness centrality. The
|
||||
<tt class="computeroutput">done</tt> function object determines
|
||||
when the algorithm terminates (the edge found when the algorithm
|
||||
terminates will not be removed).</p>
|
||||
|
||||
<h2>Parameters</h2>
|
||||
IN: <tt>const Graph& g</tt>
|
||||
<blockquote>
|
||||
The graph object on which the algorithm will be applied. The type
|
||||
<tt>Graph</tt> must be a model of <a
|
||||
href="VertexListGraph.html">Vertex List Graph</a> and <a
|
||||
href="IncidenceGraph.html">Incidence Graph</a>. When an edge
|
||||
centrality map is supplied, it must also model <a
|
||||
href="EdgeListGraph.html">Edge List Graph</a> and <a
|
||||
href="MutableGraph.html">MutableGraph</a>.<br>
|
||||
|
||||
<b>Python</b>: The parameter is named <tt>graph</tt>.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>Done done</tt>
|
||||
<blockquote>
|
||||
The function object that indicates termination of the algorithm.
|
||||
It must be a ternary function object thats accepts the maximum
|
||||
centrality, the descriptor of the edge that will be removed, and
|
||||
the graph <tt class="computeroutput">g</tt>.<br>
|
||||
<b>Python</b>: Any callable Python object will suffice.
|
||||
</blockquote>
|
||||
|
||||
OUT/UTIL: <tt>EdgeCentralityMap edge_centrality_map</tt>
|
||||
<blockquote>
|
||||
This property map is used to accumulate the betweenness centrality
|
||||
of each edge, and is a secondary form of output for the
|
||||
algorithm. The type <tt>EdgeCentralityMap</tt> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a>, with the graph's edge descriptor type as its key
|
||||
type. The value type of this property map should be the same as the
|
||||
value type of the <tt>CentralityMap</tt> property map.<br>
|
||||
|
||||
<b>Default:</b> a <tt>dummy_property_map</tt>, which requires no
|
||||
work to compute and returns no answer.<br>
|
||||
<b>Python</b>: The color map must be a <tt>edge_double_map</tt> for
|
||||
the graph.<br>
|
||||
<b>Python default</b>: <tt>graph.get_edge_double_map("centrality")</tt>
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>VertexIndexMap vertex_index</tt>
|
||||
<blockquote>
|
||||
This maps each vertex to an integer in the range <tt>[0,
|
||||
num_vertices(g))</tt>. This is necessary for efficient updates of the
|
||||
heap data structure when an edge is relaxed. The type
|
||||
<tt>VertexIndexMap</tt> must be a model of
|
||||
<a href="../../property_map/ReadablePropertyMap.html">Readable Property Map</a>. The value type of the map must be an
|
||||
integer type. The vertex descriptor type of the graph needs to be
|
||||
usable as the key type of the map.<br>
|
||||
<b>Default:</b> <tt>get(vertex_index, g)</tt>.
|
||||
Note: if you use this default, make sure your graph has
|
||||
an internal <tt>vertex_index</tt> property. For example,
|
||||
<tt>adjacenty_list</tt> with <tt>VertexList=listS</tt> does
|
||||
not have an internal <tt>vertex_index</tt> property.<br>
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
<table xmlns:rev=
|
||||
"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width=
|
||||
"100%">
|
||||
<tr>
|
||||
<td align="left"></td>
|
||||
<td align="right"></td>
|
||||
</tr>
|
||||
</table>
|
||||
<h3>Where Defined</h3>
|
||||
<<a href=
|
||||
"../../../boost/graph/bc_clustering.hpp">boost/graph/bc_clustering.hpp</a>>
|
||||
<hr>
|
||||
<table>
|
||||
<tr valign="top">
|
||||
<td nowrap>Copyright © 2004</td>
|
||||
<td><a href="http://www.boost.org/people/doug_gregor.html">Douglas Gregor</a>,
|
||||
Indiana University (dgregor@cs.indiana.edu)<br>
|
||||
<a href="http://www.osl.iu.edu/~lums">Andrew Lumsdaine</a>, Indiana
|
||||
University (<a href=
|
||||
"mailto:lums@osl.iu.edu">lums@osl.iu.edu</a>)</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
@@ -2,59 +2,43 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Bellman Ford Shortest Paths</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
|
||||
<H1><A NAME="sec:bellman-ford"></A>
|
||||
<H1><A NAME="sec:bellman-ford"></A><img src="figs/python.gif" alt="(Python)"/>
|
||||
<TT>bellman_ford_shortest_paths</TT>
|
||||
</H1>
|
||||
|
||||
<P>
|
||||
<DIV ALIGN="left">
|
||||
<TABLE CELLPADDING=3 border>
|
||||
<TR><TH ALIGN="LEFT"><B>Graphs:</B></TH>
|
||||
<TD ALIGN="LEFT">directed or undirected</TD>
|
||||
</TR>
|
||||
<TR><TH ALIGN="LEFT"><B>Properties:</B></TH>
|
||||
<TD ALIGN="LEFT">distance, weight</TD>
|
||||
</TR>
|
||||
<TR><TH ALIGN="LEFT"><B>Complexity:</B></TH>
|
||||
<TD ALIGN="LEFT"><i>O(V E)</i></TD>
|
||||
</TR>
|
||||
<TR><TH ALIGN="LEFT"><B>Where Defined:</B></TH>
|
||||
<TD ALIGN="LEFT">
|
||||
<a href="../../../boost/graph/bellman_ford_shortest_paths.hpp"><TT>boost/graph/bellman_ford_shortest_paths.hpp</TT></a>
|
||||
</TD>
|
||||
</TR></TABLE>
|
||||
</DIV>
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
(1)
|
||||
template <class <a href="./EdgeListGraph.html">EdgeListGraph</a>, class Size, class WeightMap, class DistanceMap>
|
||||
bool bellman_ford_shortest_paths(EdgeListGraph& g, Size N,
|
||||
WeightMap w, DistanceMap d)
|
||||
<i>// named paramter version</i>
|
||||
template <class <a href="./EdgeListGraph.html">EdgeListGraph</a>, class Size, class P, class T, class R>
|
||||
bool bellman_ford_shortest_paths(const EdgeListGraph& g, Size N,
|
||||
const bgl_named_params<P, T, R>& params = <i>all defaults</i>);
|
||||
|
||||
(2)
|
||||
template <class <a href="./EdgeListGraph.html">EdgeListGraph</a>, class Size, class WeightMap, class DistanceMap,
|
||||
class <a href="./BellmanFordVisitor.html">BellmanFordVisitor</a>>
|
||||
bool bellman_ford_shortest_paths(EdgeListGraph& g, Size N, WeightMap w,
|
||||
DistanceMap d, BellmanFordVisitor visit)
|
||||
template <class <a href="./VertexAndEdgeListGraph.html">VertexAndEdgeListGraph</a>, class P, class T, class R>
|
||||
bool bellman_ford_shortest_paths(const VertexAndEdgeListGraph& g,
|
||||
const bgl_named_params<P, T, R>& params = <i>all defaults</i>);
|
||||
|
||||
<i>// non-named parameter version</i>
|
||||
template <class <a href="./EdgeListGraph.html">EdgeListGraph</a>, class Size, class WeightMap,
|
||||
class PredecessorMap, class DistanceMap,
|
||||
class <a href="http://www.sgi.com/tech/stl/BinaryFunction.html">BinaryFunction</a>, class <a href="http://www.sgi.com/tech/stl/BinaryPredicate.html">BinaryPredicate</a>,
|
||||
class <a href="./BellmanFordVisitor.html">BellmanFordVisitor</a>>
|
||||
bool bellman_ford_shortest_paths(EdgeListGraph& g, Size N,
|
||||
WeightMap weight, PredecessorMap pred, DistanceMap distance,
|
||||
BinaryFunction combine, BinaryPredicate compare, BellmanFordVisitor v)
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
@@ -64,48 +48,250 @@ HREF="bibliography.html#ford62:_flows">11</A>,<A
|
||||
HREF="bibliography.html#lawler76:_comb_opt">20</A>,<A
|
||||
HREF="bibliography.html#clr90">8</A>] solves the single-source
|
||||
shortest paths problem for a graph with both positive and negative
|
||||
edge weights. See Section <A
|
||||
edge weights. For the definition of the shortest paths problem see
|
||||
Section <A
|
||||
HREF="./graph_theory_review.html#sec:shortest-paths-algorithms">Shortest-Paths
|
||||
Algorithms</A> for a description of the single-source shortest paths
|
||||
problem. If a cycle with negative length is detected, the algorithm
|
||||
returns <TT>false</TT>. The argument <TT>N</TT> should be the number
|
||||
of vertices in the graph. The source vertex is indicated by
|
||||
initializing the distance of the source vertex to zero and the
|
||||
distances of the rest of the vertices to
|
||||
<TT>std::numeric_limits<T>::max()</TT>.
|
||||
Algorithms</A>.
|
||||
If you only need to solve the shortest paths problem for positive edge
|
||||
weights, Dijkstra's algorithm provides a more efficient
|
||||
alternative. If all the edge weights are all equal to one then breadth-first
|
||||
search provides an even more efficient alternative.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Before calling the <tt>bellman_ford_shortest_paths()</tt> function,
|
||||
the user must assign the source vertex a distance of zero and all
|
||||
other vertices a distance of infinity <i>unless</i> you are providing
|
||||
a starting vertex. The Bellman-Ford algorithm
|
||||
proceeds by looping through all of the edges in the graph, applying
|
||||
the relaxation operation to each edge. In the following pseudo-code,
|
||||
<i>v</i> is a vertex adjacent to <i>u</i>, <i>w</i> maps edges to
|
||||
their weight, and <i>d</i> is a distance map that records the length
|
||||
of the shortest path to each vertex seen so far. <i>p</i> is a
|
||||
predecessor map which records the parent of each vertex, which will
|
||||
ultimately be the parent in the shortest paths tree
|
||||
</p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>
|
||||
RELAX(<i>u</i>, <i>v</i>, <i>w</i>, <i>d</i>, <i>p</i>)
|
||||
<b>if</b> (<i>w(u,v) + d[u] < d[v]</i>)
|
||||
<i>d[v] := w(u,v) + d[u]</i>
|
||||
<i>p[v] := u</i>
|
||||
<b>else</b>
|
||||
...
|
||||
</pre>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<pre>
|
||||
|
||||
|
||||
relax edge <i>(u,v)</i>
|
||||
|
||||
|
||||
edge <i>(u,v)</i> is not relaxed
|
||||
</pre>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>
|
||||
The algorithm repeats this loop <i>|V|</i> times after which it is
|
||||
guaranteed that the distances to each vertex have been reduced to the
|
||||
minimum possible unless there is a negative cycle in the graph. If
|
||||
there is a negative cycle, then there will be edges in the graph that
|
||||
were not properly minimized. That is, there will be edges <i>(u,v)</i> such
|
||||
that <i>w(u,v) + d[u] < d[v]</i>. The algorithm loops over the edges in
|
||||
the graph one final time to check if all the edges were minimized,
|
||||
returning <tt>true</tt> if they were and returning <tt>false</tt>
|
||||
otherwise.
|
||||
</p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>
|
||||
BELLMAN-FORD(<i>G</i>)
|
||||
<i>// Optional initialization</i>
|
||||
<b>for</b> each vertex <i>u in V</i>
|
||||
<i>d[u] := infinity</i>
|
||||
<i>p[u] := u</i>
|
||||
<b>end for</b>
|
||||
<b>for</b> <i>i := 1</i> <b>to</b> <i>|V|-1</i>
|
||||
<b>for</b> each edge <i>(u,v) in E</i>
|
||||
RELAX(<i>u</i>, <i>v</i>, <i>w</i>, <i>d</i>, <i>p</i>)
|
||||
<b>end for</b>
|
||||
<b>end for</b>
|
||||
<b>for</b> each edge <i>(u,v) in E</i>
|
||||
<b>if</b> (<i>w(u,v) + d[u] < d[v]</i>)
|
||||
<b>return</b> (false, , )
|
||||
<b>else</b>
|
||||
...
|
||||
<b>end for</b>
|
||||
<b>return</b> (true, <i>p</i>, <i>d</i>)
|
||||
</pre>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<pre>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
examine edge <i>(u,v)</i>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
edge <i>(u,v)</i> was not minimized
|
||||
|
||||
edge <i>(u,v)</i> was minimized
|
||||
</pre>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
There are two main options for obtaining output from the
|
||||
<tt>bellman_ford_shortest_paths()</tt> function. If the user provides
|
||||
a distance property map through the <tt>distance_map()</tt> parameter
|
||||
then the shortest distance from the source vertex to every other
|
||||
vertex in the graph will be recorded in the distance map (provided the
|
||||
function returns <tt>true</tt>). The second option is recording the
|
||||
shortest paths tree in the <tt>predecessor_map()</tt>. For each vertex
|
||||
<i>u in V</i>, <i>p[u]</i> will be the predecessor of <i>u</i> in the
|
||||
shortest paths tree (unless <i>p[u] = u</i>, in which case <i>u</i> is
|
||||
either the source vertex or a vertex unreachable from the source). In
|
||||
addition to these two options, the user can provide her own
|
||||
custom-made visitor that can take actions at any of the
|
||||
algorithm's event points.
|
||||
|
||||
<P>
|
||||
|
||||
<H3>Requirements on Types</H3>
|
||||
<h3>Parameters</h3>
|
||||
|
||||
<P>
|
||||
|
||||
<UL>
|
||||
<LI>The type <TT>EdgeListGraph</TT> must be a model of
|
||||
<a href="./EdgeListGraph.html">EdgeListGraph</a>.
|
||||
</LI>
|
||||
<LI>The type <TT>Distance</TT> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">ReadWritePropertyMap</a>. The
|
||||
vertex descriptor type of the graph needs to be usable as the key
|
||||
type of the distance map. The value type of the distance
|
||||
map must be <a
|
||||
href="http://www.sgi.com/Technology/STL/LessThanComparable.html">LessThanComparable</a>.
|
||||
</LI>
|
||||
<LI>The <TT>Weight</TT> type must be a model of
|
||||
<a href="../../property_map/ReadablePropertyMap.html">ReadablePropertyMap</a>.
|
||||
The edge descriptor of the graph needs to be usable as the key
|
||||
type for the weight map. The value type for the
|
||||
weight map must be <I>Addable</I> with the
|
||||
distance map's value type.
|
||||
</LI>
|
||||
<LI>The <TT>Parent</TT> type must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">ReadWritePropertyMap</a>. The
|
||||
value type and key type should be the graph's vertex descriptor
|
||||
type.
|
||||
</LI>
|
||||
<LI>The type <TT>BellmanFordVisitor</TT> must be a model of <a href="./BellmanFordVisitor.html">BellmanFordVisitor</a>.
|
||||
</LI>
|
||||
</UL>
|
||||
IN: <tt>EdgeListGraph& g</tt>
|
||||
<blockquote>
|
||||
A directed or undirected graph whose type must be a model of
|
||||
<a href="./EdgeListGraph.html">Edge List Graph</a>. If a root vertex is
|
||||
provided, then the graph must also model
|
||||
<a href="./VertexListGraph.html">Vertex List Graph</a>.<br>
|
||||
|
||||
<b>Python</b>: The parameter is named <tt>graph</tt>.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>Size N</tt>
|
||||
<blockquote>
|
||||
The number of vertices in the graph. The type <tt>Size</tt> must
|
||||
be an integer type.<br>
|
||||
<b>Default:</b> <tt>num_vertices(g)</tt>.<br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
|
||||
<h3>Named Parameters</h3>
|
||||
|
||||
IN: <tt>weight_map(WeightMap w)</tt>
|
||||
<blockquote>
|
||||
The weight (also know as ``length'' or ``cost'') of each edge in the
|
||||
graph. The <tt>WeightMap</tt> type must be a model of <a
|
||||
href="../../property_map/ReadablePropertyMap.html">Readable Property
|
||||
Map</a>. The key type for this property map must be the edge
|
||||
descriptor of the graph. The value type for the weight map must be
|
||||
<i>Addable</i> with the distance map's value type. <br>
|
||||
<b>Default:</b> <tt>get(edge_weight, g)</tt><br>
|
||||
|
||||
<b>Python</b>: Must be an <tt>edge_double_map</tt> for the graph.<br>
|
||||
<b>Python default</b>: <tt>graph.get_edge_double_map("weight")</tt>
|
||||
</blockquote>
|
||||
|
||||
OUT: <tt>predecessor_map(PredecessorMap p_map)</tt>
|
||||
<blockquote>
|
||||
The predecessor map records the edges in the minimum spanning
|
||||
tree. Upon completion of the algorithm, the edges <i>(p[u],u)</i>
|
||||
for all <i>u in V</i> are in the minimum spanning tree. If <i>p[u] =
|
||||
u</i> then <i>u</i> is either the source vertex or a vertex that is
|
||||
not reachable from the source. The <tt>PredecessorMap</tt> type
|
||||
must be a <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a> which key and vertex types the same as the vertex
|
||||
descriptor type of the graph.<br>
|
||||
<b>Default:</b> <tt>dummy_property_map</tt><br>
|
||||
|
||||
<b>Python</b>: Must be a <tt>vertex_vertex_map</tt> for the graph.<br>
|
||||
</blockquote>
|
||||
|
||||
IN/OUT: <tt>distance_map(DistanceMap d)</tt>
|
||||
<blockquote>
|
||||
The shortest path weight from the source vertex to each vertex in
|
||||
the graph <tt>g</tt> is recorded in this property map. The type
|
||||
<tt>DistanceMap</tt> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a>. The key type of the property map must be the
|
||||
vertex descriptor type of the graph, and the value type of the
|
||||
distance map must be <a
|
||||
href="http://www.sgi.com/tech/stl/LessThanComparable.html"> Less
|
||||
Than Comparable</a>.<br> <b>Default:</b> <tt>get(vertex_distance,
|
||||
g)</tt><br>
|
||||
<b>Python</b>: Must be a <tt>vertex_double_map</tt> for the graph.<br>
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>root_vertex(Vertex s)</tt>
|
||||
<blockquote>
|
||||
The starting (or "root") vertex from which shortest paths will be
|
||||
computed. When provided, the distance map need not be initialized
|
||||
(the algorithm will perform the initialization itself). However, the
|
||||
graph must model <a href="./VertexListGraph.html">Vertex List
|
||||
Graph</a> when this parameter is provided.<br>
|
||||
<b>Default:</b> None; if omitted, the user must initialize the
|
||||
distance map.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>visitor(BellmanFordVisitor v)</tt>
|
||||
<blockquote>
|
||||
The visitor object, whose type must be a model of
|
||||
<a href="./BellmanFordVisitor.html">Bellman-Ford Visitor</a>.
|
||||
The visitor object is passed by value <a
|
||||
href="#1">[1]</a>.
|
||||
<br>
|
||||
<b>Default:</b> <tt>bellman_visitor<null_visitor></tt><br>
|
||||
|
||||
<b>Python</b>: The parameter should be an object that derives from
|
||||
the <a
|
||||
href="BellmanFordVisitor.html#python"><tt>BellmanFordVisitor</tt></a> type
|
||||
of the graph.
|
||||
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>distance_combine(BinaryFunction combine)</tt>
|
||||
<blockquote>
|
||||
This function object replaces the role of addition in the relaxation
|
||||
step. The first argument type must match the distance map's value
|
||||
type and the second argument type must match the weight map's value
|
||||
type. The result type must be the same as the distance map's value
|
||||
type.<br>
|
||||
<b>Default:</b><tt>std::plus<D></tt>
|
||||
with <tt>D=typename property_traits<DistanceMap>::value_type</tt>.<br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>distance_compare(BinaryPredicate compare)</tt>
|
||||
<blockquote>
|
||||
This function object replaces the role of the less-than operator
|
||||
that compares distances in the relaxation step. The argument types
|
||||
must match the distance map's value type.<br>
|
||||
<b>Default:</b> <tt>std::less<D></tt>
|
||||
with <tt>D=typename property_traits<DistanceMap>::value_type</tt>.<br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
<P>
|
||||
|
||||
@@ -114,66 +300,49 @@ distances of the rest of the vertices to
|
||||
<P>
|
||||
The time complexity is <i>O(V E)</i>.
|
||||
|
||||
<P>
|
||||
|
||||
<h3>Visitor Event Points</h3>
|
||||
|
||||
<ul>
|
||||
<li><b><tt>vis.examine_edge(e, g)</tt></b> is invoked on every edge in
|
||||
the graph <i>|V|</i> times.
|
||||
<li><b><tt>vis.edge_relaxed(e, g)</tt></b> is invoked when the distance
|
||||
label for the target vertex is decreased. The edge <i>(u,v)</i> that
|
||||
participated in the last relaxation for vertex <i>v</i> is an edge in the
|
||||
shortest paths tree.
|
||||
<li><b><tt>vis.edge_not_relaxed(e, g)</tt></b> is invoked if the distance label
|
||||
for the target vertex is not decreased.
|
||||
<li><b><tt>vis.edge_minimized(e, g)</tt></b> is invoked during the
|
||||
second stage of the algorithm, during the test of whether each edge
|
||||
was minimized. If the edge is minimized then this function
|
||||
is invoked.
|
||||
<li><b><tt>vis.edge_not_minimized(e, g)</tt></b> is also invoked during the
|
||||
second stage of the algorithm, during the test of whether each edge
|
||||
was minimized. If the edge was not minimized, this function is
|
||||
invoked. This happens when there is a negative cycle in the graph.
|
||||
</ul>
|
||||
|
||||
<H3>Example</H3>
|
||||
|
||||
<P>
|
||||
The source code for this example is in <a
|
||||
href="../example/bellman_ford.cpp"><TT>examples/bellman_ford.cpp</TT></a>.
|
||||
An example of using the Bellman-Ford algorithm is in <a
|
||||
href="../example/bellman-example.cpp"><TT>examples/bellman-example.cpp</TT></a>.
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
enum { u, v, x, y, z, N };
|
||||
char name[] = { 'u', 'v', 'x', 'y', 'z' };
|
||||
|
||||
typedef std::pair<int,int> E;
|
||||
E edges[] = { E(u,y), E(u,x), E(u,v),
|
||||
E(v,u),
|
||||
E(x,y), E(x,v),
|
||||
E(y,v), E(y,z),
|
||||
E(z,u), E(z,x) };
|
||||
|
||||
int weight[] = { -4, 8, 5,
|
||||
-2,
|
||||
9, -3,
|
||||
7, 2,
|
||||
6, 7 };
|
||||
|
||||
typedef edge_list<E*,E,ptrdiff_t> Graph;
|
||||
Graph g(edges, edges + sizeof(edges)/sizeof(E));
|
||||
|
||||
vector<int> distance(N,std::numeric_limits<short>::max());
|
||||
vector<int> parent(N,-1);
|
||||
|
||||
distance[z] = 0;
|
||||
parent[z] = z;
|
||||
bool r = bellman_ford_shortest_paths(g, int(N), weight,
|
||||
distance.begin(),
|
||||
parent.begin());
|
||||
if (r)
|
||||
for (int i = 0; i < N; ++i)
|
||||
std::cout << name[i] << ": " << distance[i]
|
||||
<< " " << name[parent[i]] << std::endl;
|
||||
else
|
||||
std::cout << "negative cycle" << std::endl;
|
||||
</PRE>
|
||||
The distance and predecessor for each vertex is:
|
||||
<PRE>
|
||||
u: 2 v
|
||||
v: 4 x
|
||||
x: 7 z
|
||||
y: -2 u
|
||||
z: 0 z
|
||||
</PRE>
|
||||
<h3>Notes</h3>
|
||||
|
||||
<p><a name="1">[1]</a>
|
||||
Since the visitor parameter is passed by value, if your visitor
|
||||
contains state then any changes to the state during the algorithm
|
||||
will be made to a copy of the visitor object, not the visitor object
|
||||
passed in. Therefore you may want the visitor to hold this state by
|
||||
pointer or reference.
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. We make no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: bellman_visitor</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -101,14 +97,14 @@ and <a href="./property_writer.html"><tt>property_writer</tt></a>.
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -0,0 +1,307 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<!--
|
||||
-- Copyright (c) 2004 Trustees of Indiana University
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<head>
|
||||
<title>Boost Graph Library: Brandes' Betweenness Centrality</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
<h1><img src="figs/python.gif" alt="(Python)"/><tt>brandes_betweenness_centrality</tt></h1>
|
||||
|
||||
<p>
|
||||
<pre>
|
||||
<em>// named parameter versions</em>
|
||||
template<typename Graph, typename Param, typename Tag, typename Rest>
|
||||
void
|
||||
brandes_betweenness_centrality(const Graph& g,
|
||||
const bgl_named_params<Param,Tag,Rest>& params);
|
||||
|
||||
template<typename Graph, typename CentralityMap>
|
||||
void
|
||||
brandes_betweenness_centrality(const Graph& g, CentralityMap centrality_map);
|
||||
|
||||
template<typename Graph, typename CentralityMap, typename EdgeCentralityMap>
|
||||
void
|
||||
brandes_betweenness_centrality(const Graph& g, CentralityMap centrality_map,
|
||||
EdgeCentralityMap edge_centrality);
|
||||
|
||||
<em>// non-named parameter versions</em>
|
||||
template<typename Graph, typename CentralityMap, typename EdgeCentralityMap,
|
||||
typename IncomingMap, typename DistanceMap, typename DependencyMap,
|
||||
typename PathCountMap, typename VertexIndexMap>
|
||||
void
|
||||
brandes_betweenness_centrality(const Graph& g, CentralityMap centrality_map,
|
||||
EdgeCentralityMap edge_centrality,
|
||||
IncomingMap incoming,
|
||||
DistanceMap distance, DependencyMap dependency,
|
||||
PathCountMap path_count,
|
||||
VertexIndexMap vertex_index);
|
||||
|
||||
template<typename Graph, typename CentralityMap, typename EdgeCentralityMap,
|
||||
typename IncomingMap, typename DistanceMap, typename DependencyMap,
|
||||
typename PathCountMap, typename VertexIndexMap, typename WeightMap>
|
||||
void
|
||||
brandes_betweenness_centrality(const Graph& g, CentralityMap centrality_map,
|
||||
EdgeCentralityMap edge_centrality,
|
||||
IncomingMap incoming,
|
||||
DistanceMap distance, DependencyMap dependency,
|
||||
PathCountMap path_count,
|
||||
VertexIndexMap vertex_index,
|
||||
WeightMap weight_map);
|
||||
|
||||
<em>// helper functions</em>
|
||||
template<typename Graph, typename CentralityMap>
|
||||
void
|
||||
relative_betweenness_centrality(const Graph& g, CentralityMap centrality_map);
|
||||
|
||||
template<typename Graph, typename CentralityMap>
|
||||
typename property_traits<CentralityMap>::value_type
|
||||
central_point_dominance(const Graph& g, CentralityMap centrality_map);
|
||||
</pre>
|
||||
|
||||
<p>This algorithm [<a href="bibliography.html#brandes01">54</a>]
|
||||
computes the <em>betweenness centrality</em> [<a
|
||||
href="bibliography.html#freeman77">55</a>,<a
|
||||
href="bibliography.html#anthonisse71">56</a>] of each vertex or each
|
||||
edge in the graph. The betweenness centrality of a vertex <em>v</em>
|
||||
is defined by
|
||||
|
||||
<p><img src="figs/betweenness_centrality.gif">,
|
||||
|
||||
<p>where <img src="figs/sigma_st.gif"> is the number of shortest paths from
|
||||
vertex <em>s</em> to vertex <em>t</em> and <img src="figs/sigma_stv.gif">
|
||||
is the number of shortest paths from vertex <em>s</em> to vertex
|
||||
<em>t</em> that pass through vertex <em>v</em>.
|
||||
|
||||
<!-- \sum_{s \neq v \neq t}\frac{\sigma_{st}(v)}{\sigma_{st}} -->
|
||||
|
||||
<p>The edge betweenness centrality indicates for each edge the
|
||||
betweenness centrality that was contributed to the target(s) of the
|
||||
edge (plural for undirected graphs). Similar to (vertex) betweenness
|
||||
centrality, edge betweenness centrality can be used to determine the
|
||||
edges through which most shortest paths must pass. A single invocation
|
||||
of this algorithm can compute either the vertex or edge centrality (or
|
||||
both).</p>
|
||||
|
||||
<p>This algorithm can operate either on weighted graphs (if a suitable
|
||||
edge weight map is supplied) or unweighted graphs (if no edge weight
|
||||
map is supplied). The result is the absolute betweenness centrality;
|
||||
to convert to the relative betweenness centrality, which scales each
|
||||
absolute centrality by <img src="figs/rel_betweenness_centrality.gif">
|
||||
(where <em>n</em> is the number of vertices in the graph), use
|
||||
<tt>relative_betweenness_centrality</tt>. Given the relative
|
||||
betweenness centrality, one can compute the <em>central point
|
||||
dominance</em> [<a href="bibliography.html#freeman77">55</a>], which is a measure of the maximum "betweenness" of any
|
||||
point in the graph: it will be 0 for complete graphs and
|
||||
1 for "wheel" graphs (in which there is a central vertex that all
|
||||
paths include; see <a href="#Fig1">Fig. 1</a>). Let <img src="figs/v_star.gif"> be the vertex with the largest relative betweenness centrality; then, the central point dominance is defined as:
|
||||
|
||||
<p><img src="figs/central_point_dominance.gif">
|
||||
|
||||
<!-- C_B' = \frac{\sum_{v \in V} C_B(v^*) - C_B'(v)}{n-1} -->
|
||||
|
||||
<p><a name="Fig1">
|
||||
<table border="1">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Fig. 1: A wheel graph, where every path travels through the central node. <br>The central point dominance of this graph is 1.</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center"><img src="figs/wheel_graph.gif"></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3>Where Defined</h3>
|
||||
<a href="../../../boost/graph/betweenness_centrality.hpp"><tt>boost/graph/betweenness_centrality.hpp</tt></a>
|
||||
|
||||
<h3>Parameters</h3>
|
||||
IN: <tt>const Graph& g</tt>
|
||||
<blockquote>
|
||||
The graph object on which the algorithm will be applied. The type
|
||||
<tt>Graph</tt> must be a model of <a
|
||||
href="VertexListGraph.html">Vertex List Graph</a> and <a
|
||||
href="IncidenceGraph.html">Incidence Graph</a>. When an edge
|
||||
centrality map is supplied, it must also model <a
|
||||
href="EdgeListGraph.html">Edge List Graph</a>.<br>
|
||||
|
||||
<b>Python</b>: The parameter is named <tt>graph</tt>.
|
||||
</blockquote>
|
||||
|
||||
UTIL: <tt>IncomingMap incoming</tt>
|
||||
<blockquote>
|
||||
This property map records the set of edges incoming to each vertex that comprise a shortest path from a particular source vertex through this vertex, and is used internally by the algorithm.The <tt>IncomingMap</tt> type must be a <a
|
||||
href="../../property_map/LvaluePropertyMap.html">Lvalue Property
|
||||
Map</a> whose key type is the same as the vertex descriptor type of
|
||||
the graph and whose value type is a Sequence (e.g., an
|
||||
<tt>std::vector</tt>) containing edge descriptors.<br>
|
||||
|
||||
<b>Default:</b> <a
|
||||
href="../../property_map/iterator_property_map.html">
|
||||
<tt>iterator_property_map</tt></a> created from a
|
||||
<tt>std::vector</tt> of <tt>std::vector<Edge></tt>, where
|
||||
<tt>Edge</tt> is the edge descriptor type of the graph.<br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
UTIL: <tt>DistanceMap distance_map</tt>
|
||||
<blockquote>
|
||||
The shortest path weight from each source vertex <tt>s</tt> to each
|
||||
vertex in the graph <tt>g</tt> is recorded in this property map, but
|
||||
the result is only used internally. The type <tt>DistanceMap</tt>
|
||||
must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a>. The vertex descriptor type of the graph needs to
|
||||
be usable as the key type of the distance map. The value type of the
|
||||
distance map is the element type of a <a
|
||||
href="./Monoid.html">Monoid</a>.<br>
|
||||
|
||||
<b>Default:</b> <a
|
||||
href="../../property_map/iterator_property_map.html">
|
||||
<tt>iterator_property_map</tt></a> created from a
|
||||
<tt>std::vector</tt> of the <tt>WeightMap</tt>'s value type (or the
|
||||
<tt>vertices_size_type</tt> of the graph when no weight map exists)
|
||||
of size <tt>num_vertices(g)</tt> and using the <tt>vertex_index</tt> for
|
||||
the index map.<br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
UTIL: <tt>DependencyMap dependency</tt>
|
||||
<blockquote>
|
||||
Property map used internally to accumulate partial betweenness
|
||||
centrality results. The type <tt>DependencyMap</tt> must be a model
|
||||
of <a href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a>. The vertex descriptor type of the graph needs to
|
||||
be usable as the key type of the dependency map. The value type of
|
||||
the dependency map must be compatible with the value type of the
|
||||
centrality map.<br>
|
||||
|
||||
<b>Default:</b> <a
|
||||
href="../../property_map/iterator_property_map.html">
|
||||
<tt>iterator_property_map</tt></a> created from a
|
||||
<tt>std::vector</tt> of the <tt>CentralityMap</tt>'s value type of
|
||||
size <tt>num_vertices(g)</tt> and using the <tt>vertex_index</tt>
|
||||
for the index map.<br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
UTIL: <tt>PathCountMap path_count</tt>
|
||||
<blockquote>
|
||||
Property map used internally to accumulate the number of paths that
|
||||
pass through each particular vertex. The type <tt>PathCountMap</tt>
|
||||
must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a>. The vertex descriptor type of the graph needs to
|
||||
be usable as the key type of the dependency map. The value type of
|
||||
the dependency map must be an integral type large enough to store
|
||||
the number of paths in the graph.<br>
|
||||
|
||||
<b>Default:</b> <a
|
||||
href="../../property_map/iterator_property_map.html">
|
||||
<tt>iterator_property_map</tt></a> created from a
|
||||
<tt>std::vector</tt> of the <tt>degree_size_type</tt> of the graph of
|
||||
size <tt>num_vertices(g)</tt> and using the <tt>vertex_index</tt>
|
||||
for the index map.<br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
<h3>Named parameters</h3>
|
||||
OUT/UTIL: <tt>CentralityMap centrality_map</tt>
|
||||
<blockquote>
|
||||
This property map is used to accumulate the betweenness centrality
|
||||
of each vertex, and is the primary output of the algorithm. The type
|
||||
<tt>CentralityMap</tt> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a>, with the graph's vertex descriptor type as its key
|
||||
type. The value type of this property map should be a floating-point
|
||||
or rational type.<br>
|
||||
|
||||
<b>Default:</b> a <tt>dummy_property_map</tt>, which requires no
|
||||
work to compute and returns no answer.<br>
|
||||
<b>Python</b>: The color map must be a <tt>vertex_double_map</tt> for
|
||||
the graph.<br>
|
||||
<b>Python default</b>: <tt>graph.get_vertex_double_map("centrality")</tt>
|
||||
</blockquote>
|
||||
|
||||
OUT/UTIL: <tt>EdgeCentralityMap edge_centrality_map</tt>
|
||||
<blockquote>
|
||||
This property map is used to accumulate the betweenness centrality
|
||||
of each edge, and is a secondary form of output for the
|
||||
algorithm. The type <tt>EdgeCentralityMap</tt> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a>, with the graph's edge descriptor type as its key
|
||||
type. The value type of this property map should be the same as the
|
||||
value type of the <tt>CentralityMap</tt> property map.<br>
|
||||
|
||||
<b>Default:</b> a <tt>dummy_property_map</tt>, which requires no
|
||||
work to compute and returns no answer.<br>
|
||||
<b>Python</b>: The color map must be a <tt>edge_double_map</tt> for
|
||||
the graph.<br>
|
||||
<b>Python default</b>: <tt>graph.get_edge_double_map("centrality")</tt>
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>vertex_index_map(VertexIndexMap vertex_index)</tt>
|
||||
<blockquote>
|
||||
This maps each vertex to an integer in the range <tt>[0,
|
||||
num_vertices(g))</tt>. This is necessary for efficient updates of the
|
||||
heap data structure when an edge is relaxed. The type
|
||||
<tt>VertexIndexMap</tt> must be a model of
|
||||
<a href="../../property_map/ReadablePropertyMap.html">Readable Property Map</a>. The value type of the map must be an
|
||||
integer type. The vertex descriptor type of the graph needs to be
|
||||
usable as the key type of the map.<br>
|
||||
<b>Default:</b> <tt>get(vertex_index, g)</tt>.
|
||||
Note: if you use this default, make sure your graph has
|
||||
an internal <tt>vertex_index</tt> property. For example,
|
||||
<tt>adjacenty_list</tt> with <tt>VertexList=listS</tt> does
|
||||
not have an internal <tt>vertex_index</tt> property.<br>
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>weight_map(WeightMap w_map)</tt>
|
||||
<blockquote>
|
||||
The weight or ``length'' of each edge in the graph. The weights
|
||||
must all be non-negative, and the algorithm will throw a
|
||||
<a href="./exception.html#negative_edge"><tt>negative_edge</tt></a>
|
||||
exception is one of the edges is negative.
|
||||
The type <tt>WeightMap</tt> must be a model of
|
||||
<a href="../../property_map/ReadablePropertyMap.html">Readable Property Map</a>. The edge descriptor type of
|
||||
the graph needs to be usable as the key type for the weight
|
||||
map. The value type for this map must be
|
||||
the same as the value type of the distance map.<br>
|
||||
<b>Default:</b> All edge weights are assumed to be equivalent.
|
||||
<b>Python</b>: If supplied, must be an <tt>edge_double_map</tt> for the graph.
|
||||
</blockquote>
|
||||
|
||||
<h3>Complexity</h3>
|
||||
The time complexity is <em>O(VE)</em> for unweighted graphs and
|
||||
<em>O(VE + V(V+E) log V)</em> for weighted graphs. The space complexity
|
||||
is <em>O(VE)</em>.
|
||||
|
||||
<hr>
|
||||
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2004</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/doug_gregor.html">Douglas Gregor</A>, Indiana University (dgregor@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
<!-- Created: Fri Jun 4 16:42:50 EST 2004 -->
|
||||
<!-- hhmts start -->Last modified: Tue Mar 1 14:14:51 EST 2005 <!-- hhmts end -->
|
||||
</body>
|
||||
</html>
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. We make no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: bfs_visitor</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -43,7 +39,7 @@ visitor.
|
||||
// Construct graph G and obtain the source vertex s ...
|
||||
|
||||
boost::breadth_first_search(G, s,
|
||||
make_bfs_visitor(
|
||||
boost::make_bfs_visitor(
|
||||
std::make_pair(boost::record_distances(d, boost::on_tree_edge()),
|
||||
std::make_pair(boost::record_predecessors(p.begin(),
|
||||
boost::on_tree_edge()),
|
||||
@@ -118,14 +114,14 @@ and <a href="./property_writer.html"><tt>property_writer</tt></a>.
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
|
After Width: | Height: | Size: 8.2 KiB |
@@ -0,0 +1,96 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Named Parameters</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1><A NAME="sec:bgl-named-params"></A>
|
||||
<pre>
|
||||
bgl_named_params<Param, Type, Rest>
|
||||
</pre>
|
||||
</H1>
|
||||
|
||||
<p>
|
||||
Many of the Boost.Graph algorithms have a long list of parameters,
|
||||
most of which have default values. This causes several problems.
|
||||
First, C++ does not provide a mechanism for handling default
|
||||
parameters of template functions. However, this can be overcome by
|
||||
creating multiply version of an algorithm with different numbers of
|
||||
parameters with each version providing defaults for some subset of
|
||||
the parameters. This is the approach used in previous versions of
|
||||
Boost.Graph. This solution is still unsatisfactory for several
|
||||
reasons:
|
||||
|
||||
<ul>
|
||||
<li>The defaults for parameters can only been used in a particular
|
||||
order. If the ordering of the defaults does not fit the users situation
|
||||
he or she has to resort to providing all the parameters.
|
||||
|
||||
<li>Since the list of parameters is long, it is easy to forget
|
||||
the ordering.
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
A better solution is provided by <tt>bgl_named_params</tt>. This class
|
||||
allows users to provide parameters is any order, and matches
|
||||
arguments to parameters based on parameter names.
|
||||
|
||||
<p>
|
||||
The following code shows an example of calling
|
||||
<tt>bellman_ford_shortest_paths</tt> using the named parameter
|
||||
technique. Each of the arguments is passed to a function whose name
|
||||
indicates which parameter the argument is for. Each of the named
|
||||
parameters is separated by a <b>period</b>, not a comma.
|
||||
|
||||
<pre>
|
||||
bool r = boost::bellman_ford_shortest_paths(g, int(N),
|
||||
boost::weight_map(weight).
|
||||
distance_map(&distance[0]).
|
||||
predecessor_map(&parent[0]));
|
||||
</pre>
|
||||
|
||||
<p>The order in which the arguments are provided does not matter as
|
||||
long as they are matched with the correct parameter function. Here is
|
||||
an call to <tt>bellman_ford_shortest_paths</tt> that is equivalent to
|
||||
the one above.
|
||||
|
||||
<pre>
|
||||
bool r = boost::bellman_ford_shortest_paths(g, int(N),
|
||||
boost::predecessor_map(&parent[0]).
|
||||
distance_map(&distance[0]).
|
||||
weight_map(weight));
|
||||
</pre>
|
||||
|
||||
<p>Typically the user never needs to deal with the
|
||||
<tt>bgl_named_params</tt> class directly, since there are functions
|
||||
like <tt>boost::weight_map</tt> that create an instance of
|
||||
<tt>bgl_named_params</tt>.
|
||||
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Bibliography</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -235,14 +231,215 @@ SIAM Journal on Matrix Analysis and Applications (To appear)
|
||||
<EM>The Evolution of the Minimum Degree Ordering Algorithm</EM><br>
|
||||
SIAM Review, March 1989, vol. 31, num. 1, pp. 1-19.
|
||||
|
||||
</DL>
|
||||
<P></P><DT><A NAME="ford56:_maxim">36</a>
|
||||
<DD>L. R. Ford and D. R. Fulkerson<BR>
|
||||
<EM>Maximal flow through a network.</EM><br>
|
||||
Can. Journal of Mathematics 1956 pp.399-404
|
||||
|
||||
<P></P><DT><A NAME="goldberg85:_new_max_flow_algor">37</a>
|
||||
<DD>A. V. Goldberg<BR>
|
||||
<EM>A New Max-Flow Algorithm.</EM><br>
|
||||
MIT Tehnical report MIT/LCS/TM-291, 1985.
|
||||
|
||||
<P></P><DT><A NAME="karzanov74:_deter">38</a>
|
||||
<DD>A. V. Karzanov<BR>
|
||||
<EM>Determining the maximal flow in a network by the method of preflows.</EM><br>
|
||||
Sov. Math. Dokl. 1974
|
||||
|
||||
<P></P><DT><A NAME="ahuja93:_network_flows">39</a>
|
||||
<DD>Ravindra K. Ahuja and Thomas L. Magnanti and James B. Orlin<BR>
|
||||
<EM>Network Flows: Theory, Algorithms, and Applications.</EM><br>
|
||||
Prentice Hall, 1993.
|
||||
|
||||
<P></P><DT><A NAME="edmonds72:_improvements_netflow">40</a>
|
||||
<DD>Jack Edmonds and Richard M. Karp<BR>
|
||||
<EM>Theoretical improvements in the algorithmic efficiency for network flow problems.</EM><br>
|
||||
Journal of the ACM, 1972 19:248-264
|
||||
|
||||
<P></P><DT><A NAME="tarjan72:dfs_and_linear_algo">41</a>
|
||||
<DD>Robert E. Tarjan<BR>
|
||||
<EM>Depth first search and linear graph algorithms.</EM><br>
|
||||
SIAM Journal on Computing, 1(2):146-160, 1972
|
||||
|
||||
<P></P><DT><A NAME="eppstein97:dynamic_graph">42</a>
|
||||
<DD>David Eppstein, Zvi Galil, and Giuseppe F. Italiano<BR>
|
||||
<EM>Dynamic Graph Algorithms.</EM><br>
|
||||
Chapter 22, CRC Handbook of Algorithms and Theory of Computation, 1997.
|
||||
|
||||
<P></P><DT><A NAME="cuthill69:reducing_bandwith">43</a>
|
||||
<DD>E. Cuthill and J. McKee<BR>
|
||||
<EM>Reducing the bandwidth of sparse symmetric matrices.</EM><br>
|
||||
Proceedings of the 24th National Conference of the ACM, 1969.
|
||||
|
||||
<P></P><DT><A NAME="liu75:anal_cm_rcm">44</a>
|
||||
<DD>J. Liu and A. Sherman<BR>
|
||||
<EM>Comparative analysis of the Cuthill-Mckee and the reverse
|
||||
Cuthill-Mckee ordering algorithms for sparse matrices.</EM><br>
|
||||
SIAM Journal of Numerical Analysis. 13 (1975), pp. 198-213.
|
||||
|
||||
<P></P><DT><A NAME="george71:fem">45</a>
|
||||
<DD>Alan George<BR>
|
||||
<EM>Computer implementation of the finite element method</EM><br>
|
||||
Technical Report STAN-CS-208, Stanford University (1971).
|
||||
|
||||
<P></P><DT><A NAME="fortin96:_graph_iso_prob">46</a>
|
||||
<DD>Scott Fortin<BR>
|
||||
<EM>The Graph Isomorphism Problem</EM><br>
|
||||
TR 96-20, Dept. of Computer Science, University of Alberta (1996)
|
||||
|
||||
<P></P><DT><A NAME="mckay81:_pract_graph_iso">47</a>
|
||||
<DD>Brendan D. McKay<BR>
|
||||
<EM>Practical Graph Isomorphism</EM><br>
|
||||
Congressus Numerantium (1981)
|
||||
|
||||
<P></P><DT><A NAME="reingold77:_combin_algo">48</a>
|
||||
<DD>Reingold, Nievergelt, and Deo<BR>
|
||||
<EM>Combinatorial Algorithms: Theory and Practice</EM><br>
|
||||
Prentice Hall (1977)
|
||||
|
||||
<P></P><DT><A NAME="moore59">49</a>
|
||||
<DD>Edward Moore<BR>
|
||||
<EM>The shortest path through a maze</EM><br>
|
||||
International Symposium on the Theory of Switching (1959)<br>
|
||||
Harvard University Press
|
||||
|
||||
<P></P><DT><A NAME="nuutila95">50</a>
|
||||
<DD>E. Nuutila<BR>
|
||||
<EM>Efficient transitive closure computation in large digraphs</EM><br>
|
||||
PhD Thesis, Helsinki University of Technology, 1995. <br>
|
||||
Acta Polytechnica Scandinavica, Mathematics and Computing in
|
||||
Engineering Series, No. 74.
|
||||
|
||||
<P></P><DT><A NAME="goral79">51</a>
|
||||
<DD>A. Goralcikova and V. Koubek<BR>
|
||||
<EM>A reduct and closure algorithm for graphs</EM><br>
|
||||
In Mathematical Foundations of Computer Science, <br>
|
||||
volume 74 of Lecture Notes in Computer Science, pages 301-307. <br>
|
||||
Springer-Verlag, 1979
|
||||
|
||||
<P></P><DT><A NAME="simon86">52</a>
|
||||
<DD>Klaus Simon<BR>
|
||||
<EM>An Improved Algorithm for Transitive Closure on Acyclic Digraphs</EM><br>
|
||||
Theoretical Computer Science 58<br>
|
||||
Automata, Languages and Programming, 376-386, 1986
|
||||
|
||||
<P></P><DT><A NAME="purdom70">53</a>
|
||||
<DD>P. Purdom<BR>
|
||||
<EM>A Transitive Closure Algorithm</EM><br>
|
||||
BIT, 10, 1970, pp. 76-94.
|
||||
|
||||
<p></p><dt><a name="brandes01">54</a>
|
||||
<dd>Ulrik Brandes<br>
|
||||
<em><a href="http://ella.slis.indiana.edu/~katy/L579/brandes.pdf">A
|
||||
Faster Algorithm for Betweenness Centrality</a></em><br>
|
||||
Journal of Mathematical Sociology 25 (2):163-177, 2001.
|
||||
|
||||
<p></p><dt><a name="freeman77">55</a>
|
||||
<dd>Lindon C. Freeman<br>
|
||||
<em>A Set of Measures of Centrality Based on Betweenness</em><br>
|
||||
Sociometry 40, pp. 35-41, 1977.
|
||||
|
||||
<p></p><dt><a name="anthonisse71">56</a>
|
||||
<dd>J.M. Anthonisse<br>
|
||||
<em>The rush in a directed graph.</em><br>
|
||||
Technical Report BN9/71, Stichting Mahtematisch Centrum, Amsterdam, 1971.
|
||||
|
||||
<p></p><dt><a name="kamada89">57</a>
|
||||
<dd>T. Kamada and S. Kawai<br>
|
||||
<em>An algorithm for drawing general undirected graphs.</em><br>
|
||||
Information Processing Letters, 31, pp. 7-15, 1989.
|
||||
|
||||
<p></p><dt><a name="fruchterman91">58</a>
|
||||
<dd>T. Fruchterman and E. Reingold<br>
|
||||
<em>Graph drawing by force-directed placement.</em><br>
|
||||
Software--Practice & Experience, 21 (11), pp. 1129-1164, 1991.
|
||||
|
||||
<p></p><dt><a name="coleman83">59</a>
|
||||
<dd>Thomas F. Coleman and Jorge J. More<br>
|
||||
<em>Estimation of sparse Jacobian
|
||||
matrices and graph coloring problems.</em><br>
|
||||
Journal of Numerical Analasis V20, pp. 187-209, 1983.
|
||||
|
||||
<p></p><dt><a name="gursoy00">60</a>
|
||||
<dd>Attila Gürsoy and Murat Atun<br>
|
||||
<em>Neighborhood Preserving Load Balancing: A Self-Organizing Approach</em>
|
||||
<br>
|
||||
Euro-Par Parallel Processing, LNCS 1900, pp. 324-41, 2000.
|
||||
|
||||
<p></p><dt><a name="driscoll88">61</a>
|
||||
<dd>James R. Driscoll, Harold N. Gabow, Ruth Shrairman, and Robert E. Tarjan<br>
|
||||
<em>Relaxed Heaps: An alternative for Fibonacci Heaps with applications to parallel computation.</em><br>
|
||||
Communications of the ACM, 31 (11), pp. 1343-1354, November 1988.
|
||||
|
||||
<p></p><dt><a name="king70">62</a>
|
||||
<dd>King, I. P.<br>
|
||||
<em>An automatic reordering scheme for simultaneous equations derived from network analysis.</em><br>
|
||||
Int. J. Numer. Methods Engrg. 2, pp. 523-533, 1970.
|
||||
|
||||
<p></p><dt><a name="palmer2000">63</a>
|
||||
<dd>C. Palmer and J. Steffan<br>
|
||||
<em>Generating Network Topologies That Obey Power Laws</em><br>
|
||||
Proceedings of GLOBECOM. November, 2000.
|
||||
|
||||
<p></p><dt><a name="edmonds65">64</a>
|
||||
<dd>J. Edmonds<br>
|
||||
<em>Paths, trees, and flowers</em><br>
|
||||
Canadian Journal of Mathematics 17 (1965), pp. 449-467.
|
||||
|
||||
<p></p><dt><a name="lengauer-tarjan79">65</a>
|
||||
<dd>Thomas Lengauer and Robert Endre Tarjan<br>
|
||||
<em>A fast algorithm for finding dominators in a flowgraph</em><br>
|
||||
ACM Transactions on Programming Language and Systems, 1(1):121-141, 1979.
|
||||
|
||||
<p></p><dt><a name="muchnick97">66</a>
|
||||
<dd>Steven S. Muchnick<br>
|
||||
<em>Advanced Compiler Design and Implementation</em><br>
|
||||
Morgan Kaufmann Publishers, San Fransisco, 1997.
|
||||
|
||||
<p></p><dt><a name="appel98">67</a>
|
||||
<dd>Andrew W. Appel<br>
|
||||
<em>Modern Compiler Implementation in JAVA</em><br>
|
||||
Cambridge University Press, 1998.
|
||||
|
||||
<p></p><dt><a name="kolmogorov03">68</a>
|
||||
<dd>Vladimir Kolmogorov<br>
|
||||
<em>Graph Based Algorithms for Scene Reconstruction from Two or More Views</em><br>
|
||||
PhD thesis, Cornell University, September 2003.
|
||||
|
||||
<p></p><dt><a name="boykov-kolmogorov04">69</a>
|
||||
<dd>Yuri Boykov and Vladimir Kolmogorov<br>
|
||||
<em><a href="http://www.csd.uwo.ca/faculty/yuri/Abstracts/pami04-abs.html">An Experimental Comparison of Min-Cut/Max-Flow Algorithms for Energy Minimization in Vision</a></em><br>
|
||||
In IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 26, no. 9, pp. 1124-1137, Sept. 2004.
|
||||
|
||||
<p></p><dt><a name="boyermyrvold04">70</a>
|
||||
<dd>John M. Boyer and Wendy J. Myrvold<br>
|
||||
<em><a href="http://www.emis.de/journals/JGAA/accepted/2004/BoyerMyrvold2004.8.3.pdf">
|
||||
On the Cutting Edge: Simplified O(n) Planarity by Edge Addition</a>
|
||||
</em><br>
|
||||
Journal of Graph Algorithms and Applications, 8(2): 241-273, 2004.
|
||||
|
||||
<p></p><dt><a name="chrobakpayne95">71</a>
|
||||
<dd>M. Chrobak, T. Payne<br>
|
||||
<em>
|
||||
A Linear-time Algorithm for Drawing a Planar Graph on the Grid
|
||||
</em><br>
|
||||
Information Processing Letters 54: 241-246, 1995.
|
||||
|
||||
<p></p><dt><a name="defraysseixpachpollack90">72</a>
|
||||
<dd>H. de Fraysseix, J. Pach, R. Pollack<br>
|
||||
<em>
|
||||
How to Draw a Planar Graph on a Grid
|
||||
</em><br>
|
||||
Combinatorica 10: 41-51, 1990.
|
||||
|
||||
</dl>
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -0,0 +1,254 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright 2001-2004 The Trustees of Indiana University.
|
||||
--
|
||||
-- Use, modification and distribution is subject to the Boost Software
|
||||
-- License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
--
|
||||
-- Authors: Douglas Gregor
|
||||
-- Jeremy Siek
|
||||
-- Andrew Lumsdaine
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Biconnected Components and Articulation Points</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<h1>
|
||||
<TT>
|
||||
<img src="figs/python.gif" alt="(Python)"/>
|
||||
<A NAME="sec:biconnected-components">biconnected_components
|
||||
</A>
|
||||
</TT>
|
||||
and
|
||||
<tt>articulation_points</tt>
|
||||
</h1>
|
||||
|
||||
<PRE>
|
||||
<i>// named parameter version</i>
|
||||
template <typename Graph, typename ComponentMap, typename OutputIterator,
|
||||
typename P, typename T, typename R>
|
||||
std::pair<std::size_t, OutputIterator>
|
||||
biconnected_components(const Graph& g, ComponentMap comp, OutputIterator out,
|
||||
const bgl_named_params<P, T, R>& params)
|
||||
|
||||
template <typename Graph, typename ComponentMap,
|
||||
typename P, typename T, typename R>
|
||||
std::size_t
|
||||
biconnected_components(const Graph& g, ComponentMap comp,
|
||||
const bgl_named_params<P, T, R>& params)
|
||||
|
||||
template <typename Graph, typename OutputIterator,
|
||||
typename P, typename T, typename R>
|
||||
OutputIterator articulation_points(const Graph& g, OutputIterator out,
|
||||
const bgl_named_params<P, T, R>& params)
|
||||
|
||||
<i>// non-named parameter version</i>
|
||||
template <typename Graph, typename ComponentMap, typename OutputIterator,
|
||||
typename DiscoverTimeMap, typename LowPointMap>
|
||||
std::pair<std::size_t, OutputIterator>
|
||||
biconnected_components(const Graph& g, ComponentMap comp, OutputIterator out,
|
||||
DiscoverTimeMap discover_time, LowPointMap lowpt);
|
||||
|
||||
template <typename Graph, typename ComponentMap, typename OutputIterator>
|
||||
std::pair<std::size_t, OutputIterator>
|
||||
biconnected_components(const Graph& g, ComponentMap comp, OutputIterator out);
|
||||
|
||||
template <typename Graph, typename ComponentMap>
|
||||
std::size_t biconnected_components(const Graph& g, ComponentMap comp);
|
||||
<a name="sec:articulation_points">
|
||||
template <typename Graph, typename OutputIterator>
|
||||
OutputIterator articulation_points(const Graph& g, OutputIterator out);
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
A connected graph is <i>biconnected</i> if the removal of any single
|
||||
vertex (and all edges incident on that vertex) can not disconnect the
|
||||
graph. More generally, the biconnected components of a graph are the
|
||||
maximal subsets of vertices such that the removal of a vertex from a
|
||||
particular component will not disconnect the component. Unlike
|
||||
connected components, vertices may belong to multiple biconnected
|
||||
components: those vertices that belong to more than one biconnected
|
||||
component are called <em>articulation points</em> or, equivalently,
|
||||
<em>cut vertices</em>. Articulation points are vertices whose removal
|
||||
would increase the number of connected components in the graph. Thus,
|
||||
a graph without articulation points is biconnected. The following
|
||||
figure illustrates the articulation points and biconnected components
|
||||
of a small graph:
|
||||
|
||||
<p><center><img src="figs/biconnected.png"></center>
|
||||
|
||||
<p>Vertices can be present in multiple biconnected components, but each
|
||||
edge can only be contained in a single biconnected component. The
|
||||
output of the <tt>biconnected_components</tt> algorithm records the
|
||||
biconnected component number of each edge in the property map
|
||||
<tt>comp</tt>. Articulation points will be emitted to the (optional)
|
||||
output iterator argument to <tt>biconnected_components</tt>, or can be
|
||||
computed without the use of a biconnected component number map via
|
||||
<tt>articulation_points</tt>. These functions return the number of
|
||||
biconnected components, the articulation point output iterator, or a
|
||||
pair of these quantities, depending on what information was
|
||||
recorded.
|
||||
|
||||
<p>The algorithm implemented is due to Tarjan [<a href="bibliography.html#tarjan72:dfs_and_linear_algo">41</a>].
|
||||
|
||||
<H3>Where Defined</H3>
|
||||
|
||||
<P>
|
||||
<a href="../../../boost/graph/biconnected_components.hpp"><TT>boost/graph/biconnected_components.hpp</TT></a>
|
||||
|
||||
|
||||
<h3>Parameters</h3>
|
||||
|
||||
IN: <tt>const Graph& g</tt>
|
||||
<blockquote>
|
||||
An undirected graph. The graph type must be a model of <a
|
||||
href="VertexListGraph.html">Vertex List Graph</a> and <a
|
||||
href="IncidenceGraph.html">Incidence Graph</a>.<br>
|
||||
<b>Python</b>: The parameter is named <tt>graph</tt>.
|
||||
</blockquote>
|
||||
|
||||
OUT: <tt>ComponentMap c</tt>
|
||||
<blockquote>
|
||||
The algorithm computes how many biconnected components are in the graph,
|
||||
and assigning each component an integer label. The algorithm then
|
||||
records which component each edge in the graph belongs to by
|
||||
recording the component number in the component property map. The
|
||||
<tt>ComponentMap</tt> type must be a model of <a
|
||||
href="../../property_map/WritablePropertyMap.html">Writable Property
|
||||
Map</a>. The value type shouch be an integer type, preferably the same
|
||||
as the <tt>edges_size_type</tt> of the graph. The key type must be
|
||||
the graph's edge descriptor type.<br>
|
||||
<b>Default</b>: <tt>dummy_property_map</tt>.<br>
|
||||
<b>Python</b>: Must be an <tt>edge_int_map</tt> for the graph.<br>
|
||||
<b>Python default</b>: <tt>graph.get_edge_int_map("bicomponent")</tt>
|
||||
</blockquote>
|
||||
|
||||
OUT: <tt>OutputIterator out</tt>
|
||||
<blockquote>
|
||||
The algorithm writes articulation points via this output
|
||||
iterator and returns the resulting iterator.<br>
|
||||
<b>Default</b>: a dummy iterator that ignores values written to it.<br>
|
||||
|
||||
<b>Python</b>: this parameter is not used in Python. Instead, both
|
||||
algorithms return a Python <tt>list</tt> containing the articulation
|
||||
points.
|
||||
</blockquote>
|
||||
|
||||
<h3>Named Parameters</h3>
|
||||
|
||||
IN: <tt>vertex_index_map(VertexIndexMap i_map)</tt>
|
||||
<blockquote>
|
||||
This maps each vertex to an integer in the range <tt>[0,
|
||||
num_vertices(g))</tt>. The type
|
||||
<tt>VertexIndexMap</tt> must be a model of
|
||||
<a href="../../property_map/ReadablePropertyMap.html">Readable Property Map</a>. The value type of the map must be an
|
||||
integer type. The vertex descriptor type of the graph needs to be
|
||||
usable as the key type of the map.<br>
|
||||
<b>Default:</b> <tt>get(vertex_index, g)</tt><br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
UTIL/OUT: <tt>discover_time_map(DiscoverTimeMap discover_time)</tt>
|
||||
<blockquote>
|
||||
The discovery time of each vertex in the depth-first search. The
|
||||
type <tt>DiscoverTimeMap</tt> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a>. The value type of the map must be an integer
|
||||
type. The vertex descriptor type of the graph needs to be usable as
|
||||
the key type of the map.<br>
|
||||
<b>Default</b>: an <a
|
||||
href="../../property_map/iterator_property_map.html">
|
||||
</tt>iterator_property_map</tt></a> created from a
|
||||
<tt>std::vector</tt> of <tt>vertices_size_type</tt> of size
|
||||
<tt>num_vertices(g)</tt> and using <tt>get(vertex_index, g)</tt> for
|
||||
the index map.<br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
UTIL/OUT: <tt>lowpoint_map(LowPointMap lowpt)</tt>
|
||||
<blockquote>
|
||||
The low point of each vertex in the depth-first search, which is the
|
||||
smallest vertex reachable from a given vertex with at most one back
|
||||
edge. The type <tt>LowPointMap</tt> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a>. The value type of the map must be an integer
|
||||
type. The vertex descriptor type of the graph needs to be usable as
|
||||
the key type of the map.<br>
|
||||
<b>Default</b>: an <a
|
||||
href="../../property_map/iterator_property_map.html">
|
||||
</tt>iterator_property_map</tt></a> created from a
|
||||
<tt>std::vector</tt> of <tt>vertices_size_type</tt> of size
|
||||
<tt>num_vertices(g)</tt> and using <tt>get(vertex_index, g)</tt> for
|
||||
the index map.<br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
UTIL/OUT: <tt>predecessor_map(PredecessorMap p_map)</tt>
|
||||
<blockquote>
|
||||
The predecessor map records the depth first search tree.
|
||||
The <tt>PredecessorMap</tt> type
|
||||
must be a <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a> whose key and value types are the same as the vertex
|
||||
descriptor type of the graph.<br>
|
||||
<b>Default:</b> an <a
|
||||
href="../../property_map/iterator_property_map.html">
|
||||
</tt>iterator_property_map</tt></a> created from a
|
||||
<tt>std::vector</tt> of <tt>vertex_descriptor</tt> of size
|
||||
<tt>num_vertices(g)</tt> and using <tt>get(vertex_index, g)</tt> for
|
||||
the index map.<br>
|
||||
|
||||
<b>Python</b>: Must be a <tt>vertex_vertex_map</tt> for the graph.<br>
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>visitor(DFSVisitor vis)</tt>
|
||||
<blockquote>
|
||||
A visitor object that is invoked inside the algorithm at the
|
||||
event-points specified by the <a href="./DFSVisitor.html">DFS
|
||||
Visitor</a> concept. The visitor object is passed by value <a
|
||||
href="#1">[1]</a>. <br> <b>Default:</b>
|
||||
<tt>dfs_visitor<null_visitor></tt><br>
|
||||
|
||||
<b>Python</b>: The parameter should be an object that derives from
|
||||
the <a href="DFSVisitor.html#python"><tt>DFSVisitor</tt></a> type of
|
||||
the graph.
|
||||
</blockquote>
|
||||
|
||||
<H3>Complexity</H3>
|
||||
|
||||
<P>
|
||||
The time complexity for the biconnected components and articulation
|
||||
points algorithms
|
||||
<i>O(V + E)</i>.
|
||||
|
||||
<P>
|
||||
|
||||
<H3>Example</H3>
|
||||
|
||||
<P> The file <a
|
||||
href="../example/biconnected_components.cpp"><tt>examples/biconnected_components.cpp</tt></a>
|
||||
contains an example of calculating the biconnected components and
|
||||
articulation points of an undirected graph.
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000-2004</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana
|
||||
University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<a href="http://www.boost.org/people/doug_gregor.html">Doug Gregor</a>, Indiana University
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -0,0 +1,386 @@
|
||||
\documentclass[11pt]{report}
|
||||
|
||||
|
||||
\usepackage[leqno]{amsmath}
|
||||
\usepackage{amsfonts}
|
||||
\usepackage{amssymb}
|
||||
\usepackage{amsthm}
|
||||
\usepackage{latexsym}
|
||||
\usepackage{jweb}
|
||||
\usepackage{times}
|
||||
\usepackage{graphicx}
|
||||
\usepackage[nolineno]{lgrind}
|
||||
|
||||
\newif\ifpdf
|
||||
\ifx\pdfoutput\undefined
|
||||
\pdffalse
|
||||
\else
|
||||
\pdfoutput=1
|
||||
\pdftrue
|
||||
\fi
|
||||
|
||||
\ifpdf
|
||||
\usepackage[
|
||||
pdftex,
|
||||
colorlinks=true, % change to true for the electronic version
|
||||
linkcolor=blue,filecolor=blue,pagecolor=blue,urlcolor=blue
|
||||
]{hyperref}
|
||||
\newcommand{\myhyperref}[2]{\hyperref[#1]{#2}}
|
||||
\fi
|
||||
|
||||
\newcommand{\mtlfig}[2]{\centerline{\includegraphics*[#2]{#1.pdf}}}
|
||||
|
||||
\newcommand{\Path}{\rightsquigarrow}
|
||||
\newcommand{\ancestor}{\overset{T}{\rightsquigarrow}}
|
||||
\newcommand{\descendant}{\ancestor^{-1}}
|
||||
\newcommand{\backedge}{\overset{B}{\rightarrow}}
|
||||
\newcommand{\edge}{\rightarrow}
|
||||
\DeclareMathOperator{\suchthat}{s.t.}
|
||||
|
||||
\newcommand{\code}[1]{{\small{\em \textbf{#1}}}}
|
||||
\newcommand{\concept}[1]{\textsf{#1}}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\title{An Implementation of Biconnected Components}
|
||||
\author{Jeremy Siek}
|
||||
|
||||
\maketitle
|
||||
|
||||
\section{Introduction}
|
||||
|
||||
This paper documents the implementation of the
|
||||
\code{biconnected\_components()} function of the Boost Graph
|
||||
Library. The function was implemented by Jeremy Siek.
|
||||
|
||||
The algorithm used to implement the \code{biconnected\_components()}
|
||||
function is the one based on depth-first search described
|
||||
by Tarjan~\cite{tarjan72:dfs_and_linear_algo}.
|
||||
|
||||
An undirected graph $G = (V,E)$ is \emph{biconnected} if for each
|
||||
triple of distinct vertices $v, w, a \in V$ there is a path $p : v
|
||||
\Path w$ such that $a$ is not on the path $p$. An \emph{articulation
|
||||
point} of $G = (V,E)$ is a vertex $a \in V$ where there are two other
|
||||
distinct vertices $v,w \in V$ such that $a$ is on any path $p:v \Path
|
||||
w$ and there is at least one such path. If $a$ were to be removed from
|
||||
$G$, then $v$ and $w$ would no longer be reachable from each other.
|
||||
So articulation points act as bridges between biconnected components;
|
||||
the only path from one biconnected component to another is through an
|
||||
articulation point.
|
||||
|
||||
The algorithm finds articulation points based on information provided
|
||||
by depth-first search. During a DFS, we label each vertex $v \in G$
|
||||
with its discover time, denoted $d[v]$. During the DFS we also
|
||||
compute the $lowpt(v)$, which is the smallest (in terms of discover
|
||||
time) vertex reachable from $v$ by traversing zero or more DFS-tree
|
||||
edges followed by at most one back edge. Tree edges and back edges can
|
||||
be identified based on discover time because for tree edge $(u,v)$ we
|
||||
have $d[u] < d[v]$ and for back edge $(u,v)$ we have $d[u] >
|
||||
d[v]$. The $lowpt(v)$ is computed for $v$ by taking the minimum
|
||||
$lowpt$ of the vertices to which $v$ is adjacent. The $lowpt(v)$ is
|
||||
computed after the recursive DFS call so the $lowpt$ has already been
|
||||
computed for the adjacent vertices by the time $lowpt(v)$ is computed.
|
||||
|
||||
Now it turns out that $lowpt$ can be used to identify articulation
|
||||
points. Suppose $a,v,w$ are distinct vertices in $G$ such that $(a,v)$
|
||||
is a tree edge and $w$ is not a descendant of $v$. If $d[lowpt(v)]
|
||||
\geq d[a]$, then $a$ is an articulation point and removal of $a$
|
||||
disconnects $v$ and $w$. The reason this works is that if $d[lowpt(v)]
|
||||
\geq d[a]$, then we know all paths starting from $v$ stay within the
|
||||
sub-tree $T_v$ rooted at $v$. If a path were to escape from the
|
||||
sub-tree, then consider the first vertex $w$ in that path outside of
|
||||
$T_v$. $v \Path w$ must be considered for $lowpt(v)$, so $d[lowpt(v)]
|
||||
< d[w]$. Now $d[w] < d[a]$ due the structure of the DFS, so
|
||||
transitively $d[lowpt(v)] < d[a]$.
|
||||
|
||||
\section{The Implementation}
|
||||
|
||||
The implementation consists of a recursive DFS-like function named
|
||||
\code{biconnect()} and the public interface function
|
||||
\code{biconnected\-\_components()}. The \code{Graph} type must be a
|
||||
model of \concept{VertexListGraph} and of \concept{IncidenceGraph}.
|
||||
The result of the algorithm is recorded in the \code{ComponentMap},
|
||||
which maps edges to the biconnected component that they belong to
|
||||
(components are labeled with integers from zero on up). The
|
||||
\code{ComponentMap} type must be a model of
|
||||
\concept{WritablePropertyMap}, which the graph's
|
||||
\code{edge\-\_descriptor} type as the key type and an unsigned integer
|
||||
type as the value type. We do not record which component each vertex
|
||||
belongs to because vertices that are articulation points belong to
|
||||
multiple biconnected components. The number of biconnected components
|
||||
is returned in the \code{num\_components} parameter. The
|
||||
\code{discover\_time} parameter is used internally to keep track of
|
||||
the DFS discover time for each vertex. It must be a
|
||||
\concept{ReadWritePropertyMap} with the graph's
|
||||
\code{vertex\_\-descriptor} type as the key type and an unsigned
|
||||
integer as the value type. The \code{lowpt} parameter is used
|
||||
internally to keep track of the $d[lowpt(v)]$ for each vertex $v$. It
|
||||
must be a \concept{ReadWritePropertyMap} with the graph's
|
||||
\code{vertex\_\-descriptor} type is the key type and the value type is
|
||||
the same unsigned integer type as the value type in the
|
||||
\code{discover\-\_time} map.
|
||||
|
||||
@d Biconnected Components Algorithm
|
||||
@{
|
||||
namespace detail {
|
||||
@<Recursive Biconnect Function@>
|
||||
}
|
||||
|
||||
template <typename Graph, typename ComponentMap,
|
||||
typename DiscoverTimeMap, typename LowPointMap>
|
||||
void biconnected_components
|
||||
(typename graph_traits<Graph>::vertex_descriptor v,
|
||||
typename graph_traits<Graph>::vertex_descriptor u,
|
||||
const Graph& g,
|
||||
ComponentMap comp,
|
||||
std::size_t& num_components,
|
||||
DiscoverTimeMap discover_time,
|
||||
LowPointMap lowpt)
|
||||
{
|
||||
typedef graph_traits<Graph>::vertex_descriptor vertex_t;
|
||||
typedef graph_traits<Graph>::edge_descriptor edge_t;
|
||||
@<Concept checking of type parameters@>
|
||||
typedef typename property_traits<DiscoverTimeMap>::value_type D;
|
||||
num_components = 0;
|
||||
std::size_t dfs_time = 0;
|
||||
std::stack<edge_t> S;
|
||||
@<Initialize discover times to infinity@>
|
||||
@<Process each connected component@>
|
||||
}
|
||||
@}
|
||||
|
||||
\noindent In the following code we use the Boost Concept Checking
|
||||
Library to provide better error messages in the event that the user
|
||||
makes a mistake in the kind of parameter used in the function
|
||||
template.
|
||||
|
||||
@d Concept checking of type parameters
|
||||
@{
|
||||
function_requires< VertexListGraphConcept<Graph> >();
|
||||
function_requires< IncidenceGraphConcept<Graph> >();
|
||||
function_requires< WritablePropertyMapConcept<ComponentMap, edge_t> >();
|
||||
function_requires< ReadWritePropertyMapConcept<DiscoverTimeMap, vertex_t> >();
|
||||
function_requires< ReadWritePropertyMapConcept<LowPointMap, vertex_t> >();
|
||||
@}
|
||||
|
||||
The first step of the algorithm is to initialize the discover times of
|
||||
all the vertices to infinity. This marks the vertices as undiscovered.
|
||||
|
||||
@d Initialize discover times to infinity
|
||||
@{
|
||||
typename graph_traits<Graph>::vertex_iterator wi, wi_end;
|
||||
std::size_t infinity = std::numeric_limits<std::size_t>::max();
|
||||
for (tie(wi, wi_end) = vertices(g); wi != wi_end; ++wi)
|
||||
put(discover_time, *wi, infinity);
|
||||
@}
|
||||
|
||||
\noindent Next we invoke \code{biconnect()} on every vertex in the
|
||||
graph, making sure that all connected components within the graph are
|
||||
searched (\code{biconnect()} only processes a single connected
|
||||
component).
|
||||
|
||||
@d Process each connected component
|
||||
@{
|
||||
for (tie(wi, wi_end) = vertices(g); wi != wi_end; ++wi)
|
||||
if (get(discover_time, *wi) == std::numeric_limits<D>::max())
|
||||
detail::biconnect(*wi, *wi, true,
|
||||
g, comp, num_components,
|
||||
discover_time, dfs_time, lowpt, S);
|
||||
@}
|
||||
|
||||
The recursive \code{biconnect()} function is shown below. The
|
||||
\code{v} parameter is where the DFS is started. The \code{u}
|
||||
parameter is the parent of \code{v} in the DFS-tree if \code{at\_top
|
||||
== false} or if \code{at\_top == true} the \code{u} is not used.
|
||||
\code{S} is a stack of edges that is used to collect all edges in a
|
||||
biconnected component. The way this works is that on ``the way down''
|
||||
edges are pushed into the stack. ``On the way back up'', when an
|
||||
articulation point $v$ is found (identified because $d[lowpt(w)] \geq
|
||||
d[v]$) we know that a contiguous portion of the stack (starting at the
|
||||
top) contains the edges in the sub-tree $T_v$ which is the biconnected
|
||||
component. We therefore pop these edges off of the stack (until we
|
||||
find an edge $e$ where $d[lowpt(source(e))] < d[w]$) and mark them as
|
||||
belonging to the same component. The code below also includes the
|
||||
bookkeeping details such as recording the discover times and computing
|
||||
$lowpt$. When a back edge $(v,w)$ is encountered, we do not use
|
||||
$lowpt(w)$ in calculating $lowpt(v)$ since $lowpt(w)$ has not yet been
|
||||
computed. Also, we ignore the edge $(v,w)$ if $w$ is the parent of $v$
|
||||
in the DFS-tree, meaning that $(w,v)$ has already been examined and
|
||||
categorized as a tree edge (not a back edge).
|
||||
|
||||
@d Recursive Biconnect Function
|
||||
@{
|
||||
template <typename Graph, typename ComponentMap,
|
||||
typename DiscoverTimeMap, typename LowPointMap, typename Stack>
|
||||
void biconnect(typename graph_traits<Graph>::vertex_descriptor v,
|
||||
typename graph_traits<Graph>::vertex_descriptor u,
|
||||
bool at_top,
|
||||
const Graph& g,
|
||||
ComponentMap comp,
|
||||
std::size_t& c,
|
||||
DiscoverTimeMap d,
|
||||
std::size_t& dfs_time,
|
||||
LowPointMap lowpt,
|
||||
Stack& S)
|
||||
{
|
||||
typedef typename graph_traits<Graph>::vertex_descriptor vertex_t;
|
||||
typedef typename property_traits<DiscoverTimeMap>::value_type D;
|
||||
D infinity = std::numeric_limits<D>::max();
|
||||
put(d, v, ++dfs_time);
|
||||
put(lowpt, v, get(d, v));
|
||||
typename graph_traits<Graph>::out_edge_iterator ei, ei_end;
|
||||
for (tie(ei, ei_end) = out_edges(v, g); ei != ei_end; ++ei) {
|
||||
vertex_t w = target(*ei, g);
|
||||
if (get(d, w) == infinity) {
|
||||
S.push(*ei);
|
||||
biconnect(w, v, false, g, comp, c, d, dfs_time, lowpt, S);
|
||||
put(lowpt, v, std::min(get(lowpt, v), get(lowpt, w)));
|
||||
if (get(lowpt, w) >= get(d, v)) {
|
||||
@<Record the biconnected component@>
|
||||
}
|
||||
} else if (get(d, w) < get(d, v) && (!at_top && w != u)) {
|
||||
S.push(*ei);
|
||||
put(lowpt, v, std::min(get(lowpt, v), get(d, w)));
|
||||
}
|
||||
}
|
||||
}
|
||||
@}
|
||||
|
||||
\noindent The following is the code for popping the edges of sub-tree
|
||||
$T_v$ off of the stack and recording them as being in the same
|
||||
biconnected component.
|
||||
|
||||
@d Record the biconnected component
|
||||
@{
|
||||
while (d[source(S.top(), g)] >= d[w]) {
|
||||
put(comp, S.top(), c);
|
||||
S.pop();
|
||||
}
|
||||
put(comp, S.top(), c);
|
||||
S.pop();
|
||||
++c;
|
||||
@}
|
||||
|
||||
|
||||
\section{Appendix}
|
||||
|
||||
@o biconnected-components.hpp
|
||||
@{
|
||||
// Copyright (c) Jeremy Siek 2001
|
||||
//
|
||||
// Permission to use, copy, modify, distribute and sell this software
|
||||
// and its documentation for any purpose is hereby granted without fee,
|
||||
// provided that the above copyright notice appears in all copies and
|
||||
// that both that copyright notice and this permission notice appear
|
||||
// in supporting documentation. Silicon Graphics makes no
|
||||
// representations about the suitability of this software for any
|
||||
// purpose. It is provided "as is" without express or implied warranty.
|
||||
|
||||
// NOTE: this final is generated by libs/graph/doc/biconnected_components.w
|
||||
|
||||
#ifndef BOOST_GRAPH_BICONNECTED_COMPONENTS_HPP
|
||||
#define BOOST_GRAPH_BICONNECTED_COMPONENTS_HPP
|
||||
|
||||
#include <stack>
|
||||
#include <boost/limits.hpp>
|
||||
#include <boost/graph/graph_traits.hpp>
|
||||
#include <boost/graph/graph_concepts.hpp>
|
||||
#include <boost/property_map.hpp>
|
||||
|
||||
namespace boost {
|
||||
@<Biconnected Components Algorithm@>
|
||||
} // namespace boost
|
||||
|
||||
#endif BOOST_GRAPH_BICONNECTED_COMPONENTS_HPP
|
||||
@}
|
||||
|
||||
Figure~\ref{fig:bcc} shows the graph used in the following example and
|
||||
the edges are labeled by biconnected component number, as computed by
|
||||
the algorithm.
|
||||
|
||||
|
||||
\begin{figure}[htbp]
|
||||
\mtlfig{bcc}{width=3.0in}
|
||||
\caption{The biconnected components.}
|
||||
\label{fig:bcc}
|
||||
\end{figure}
|
||||
|
||||
|
||||
@o biconnected-components.cpp
|
||||
@{
|
||||
#include <vector>
|
||||
#include <list>
|
||||
#include <boost/graph/biconnected_components.hpp>
|
||||
#include <boost/graph/adjacency_list.hpp>
|
||||
|
||||
namespace boost {
|
||||
struct edge_component_t {
|
||||
enum { num = 555 };
|
||||
typedef edge_property_tag kind;
|
||||
} edge_component;
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
using namespace boost;
|
||||
typedef adjacency_list<vecS, vecS, undirectedS,
|
||||
no_property, property<edge_component_t, std::size_t> > graph_t;
|
||||
typedef graph_traits<graph_t>::vertex_descriptor vertex_t;
|
||||
graph_t g(9);
|
||||
add_edge(0, 5, g); add_edge(0, 1, g); add_edge(0, 6, g);
|
||||
add_edge(1, 2, g); add_edge(1, 3, g); add_edge(1, 4, g);
|
||||
add_edge(2, 3, g);
|
||||
add_edge(4, 5, g);
|
||||
add_edge(6, 8, g); add_edge(6, 7, g);
|
||||
add_edge(7, 8, g);
|
||||
|
||||
std::size_t c = 0;
|
||||
std::vector<std::size_t> discover_time(num_vertices(g));
|
||||
std::vector<vertex_t> lowpt(num_vertices(g));
|
||||
property_map<graph_t, edge_component_t>::type
|
||||
component = get(edge_component, g);
|
||||
biconnected_components(0, 8, g, component,
|
||||
c, &discover_time[0], &lowpt[0]);
|
||||
|
||||
std::cout << "graph A {\n"
|
||||
<< " node[shape=\"circle\"]\n";
|
||||
|
||||
graph_traits<graph_t>::edge_iterator ei, ei_end;
|
||||
for (tie(ei, ei_end) = edges(g); ei != ei_end; ++ei)
|
||||
std::cout << source(*ei, g) << " -- " << target(*ei, g)
|
||||
<< "[label=\"" << component[*ei] << "\"]\n";
|
||||
std::cout << "}\n";
|
||||
|
||||
return 0;
|
||||
}
|
||||
@}
|
||||
|
||||
|
||||
|
||||
% \paragraph{Definition.} A \emph{palm tree} $P$ is a directed graph that
|
||||
% consists of two disjoint sets of edges, denoted by $v \rightarrow w$
|
||||
% and $v \backedge w$ respectively, with the following properties:
|
||||
|
||||
% \begin{enumerate}
|
||||
|
||||
% \item The subgraph $T$ containing the edges $v \rightarrow w$ is a
|
||||
% spanning tree of $P$.
|
||||
|
||||
% \item $\backedge \; \subseteq \descendant$. That is, each edge of $P$
|
||||
% that is not in $T$ connects a vertex to one of its ancestors in $T$.
|
||||
% \end{enumerate}
|
||||
|
||||
|
||||
|
||||
\bibliographystyle{abbrv}
|
||||
\bibliography{jtran,ggcl,optimization,generic-programming,cad}
|
||||
|
||||
\end{document}
|
||||
|
||||
% LocalWords: Biconnected Siek biconnected Tarjan undirected DFS lowpt num dfs
|
||||
% LocalWords: biconnect VertexListGraph IncidenceGraph ComponentMap namespace
|
||||
% LocalWords: WritablePropertyMap ReadWritePropertyMap typename LowPointMap wi
|
||||
% LocalWords: DiscoverTimeMap const comp typedef VertexListGraphConcept max ei
|
||||
% LocalWords: IncidenceGraphConcept WritablePropertyMapConcept iterator bool
|
||||
% LocalWords: ReadWritePropertyMapConcept hpp ifndef endif bcc cpp struct enum
|
||||
% LocalWords: adjacency vecS undirectedS jtran ggcl
|
||||
@@ -0,0 +1,259 @@
|
||||
<HTML>
|
||||
<!-- Copyright 2007 Aaron Windsor
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
--
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Boyer-Myrvold Planarity Testing/Embedding</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1>Boyer-Myrvold Planarity Testing/Embedding</H1>
|
||||
|
||||
<p>
|
||||
A graph is <a href="./planar_graphs.html#planar"><i>planar</i></a> if it can
|
||||
be drawn in two-dimensional space without any of its edges crossing. Such a
|
||||
drawing of a planar graph is called a
|
||||
<a href="./planar_graphs.html#plane_drawing"><i>plane drawing</i></a>. Each
|
||||
plane drawing belongs to an equivalence class called a <i>planar embedding</i>
|
||||
<a href="#1">[1]</a> that is defined by the clockwise ordering of adjacent
|
||||
edges around each vertex in the graph. A planar embedding is a convenient
|
||||
intermediate representation of an actual drawing of a planar graph, and many
|
||||
planar graph drawing algorithms are formulated as functions mapping a planar
|
||||
embedding to a plane drawing.
|
||||
<br>
|
||||
<br>
|
||||
<table align="center" class="image">
|
||||
<caption align="bottom"><h5>A planar graph (top left), along with a planar
|
||||
embedding of that graph (bottom left) can be used to create a plane drawing
|
||||
(right) by embedding edges around each vertex in the order in which they
|
||||
appear in the planar embedding.
|
||||
</h5></caption>
|
||||
<tr><td>
|
||||
<img src="./figs/embedding_illustration.png">
|
||||
</td></tr>
|
||||
<tr></tr>
|
||||
<tr></tr>
|
||||
</table>
|
||||
<br>
|
||||
<p>
|
||||
The function <tt>boyer_myrvold_planarity_test</tt> implements the planarity
|
||||
testing/embedding algorithm of Boyer and Myrvold
|
||||
[<a href="./bibliography.html#boyermyrvold04">70</a>].
|
||||
<tt>boyer_myrvold_planarity_test</tt> returns <tt>true</tt> if the input graph
|
||||
is planar and <tt>false</tt> otherwise. As a side-effect of this test, a planar
|
||||
embedding can be constructed if the graph is planar or a minimal set of edges
|
||||
that form a <a href = "./planar_graphs.html#kuratowskisubgraphs">Kuratowski
|
||||
subgraph</a> can be found if the graph is not planar.
|
||||
<tt>boyer_myrvold_planarity_test</tt> uses named parameter arguments (courtesy
|
||||
of the <a href="../../parameter/doc/html/index.html">Boost.Parameter</a>
|
||||
library) to specify what the function actually does. Some examples are:
|
||||
|
||||
<ul>
|
||||
<li>Testing whether or not a graph is planar:
|
||||
<pre>
|
||||
bool is_planar = boyer_myrvold_planarity_test(g);
|
||||
</pre>
|
||||
|
||||
<li>Computing a planar embedding for a graph if it is planar, otherwise finding
|
||||
a set of edges that forms an obstructing Kuratowski subgraph:
|
||||
<pre>
|
||||
if (boyer_myrvold_planarity_test(boyer_myrvold_params::graph = g,
|
||||
boyer_myrvold_params::embedding = embedding_pmap,
|
||||
boyer_myrvold_params::kuratowski_subgraph = out_itr
|
||||
)
|
||||
)
|
||||
{
|
||||
//do something with the embedding in embedding_pmap
|
||||
}
|
||||
else
|
||||
{
|
||||
//do something with the kuratowski subgraph output to out_itr
|
||||
}
|
||||
</pre>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
The parameters passed to <tt>boyer_myrvold_planarity_test</tt> in the examples
|
||||
above do more than just carry the data structures used for input and output -
|
||||
the algorithm is optimized at compile time based on which parameters are
|
||||
present. A complete list of parameters accepted and their interactions are
|
||||
described below.
|
||||
<p>
|
||||
<tt>boyer_myrvold_planarity_test</tt> accepts as input any undirected graph,
|
||||
even those with self-loops and multiple edges.
|
||||
However, many planar graph drawing algorithms make additional restrictions
|
||||
on the structure of the input graph - for example, requiring that the input
|
||||
graph is connected, biconnected, or even maximal planar (triangulated.)
|
||||
Fortunately, any planar graph on <i>n</i> vertices that lacks one of these
|
||||
properties can be augmented with additional edges so that it satisfies that
|
||||
property in <i>O(n)</i> time - the functions
|
||||
<tt><a href="./make_connected.html">make_connected</a></tt>,
|
||||
<tt><a href="./make_biconnected_planar.html">make_biconnected_planar</a></tt>,
|
||||
and <tt><a href="./make_maximal_planar.html">make_maximal_planar</a></tt>
|
||||
exist for this purpose. If the graph drawing algorithm you're using requires,
|
||||
say, a biconnected graph, then you must make your input graph biconnected
|
||||
<i>before</i> passing it into <tt>boyer_myrvold_planarity_test</tt> so that the
|
||||
computed planar embedding includes these additional edges. This may require
|
||||
more than one call to <tt>boyer_myrvold_planarity_test</tt> depending on the
|
||||
structure of the graph you begin with, since both
|
||||
<tt>make_biconnected_planar</tt> and <tt>make_maximal_planar</tt> require a
|
||||
planar embedding of the existing graph as an input parameter.
|
||||
|
||||
<p><p>
|
||||
The named parameters accepted by <tt>boyer_myrvold_planarity_test</tt> are:
|
||||
|
||||
<ul>
|
||||
<li><b><tt>graph</tt></b> : The input graph - this is the only required
|
||||
parameter.
|
||||
<li><b><tt>vertex_index_map</tt></b> : A mapping from vertices of the input
|
||||
graph to indexes in the range <tt>[0..num_vertices(g))</tt>. If this parameter
|
||||
is not provided, the vertex index map is assumed to be available as an interior
|
||||
property of the graph, accessible by calling <tt>get(vertex_index, g)</tt>.
|
||||
<li><b><tt>edge_index_map</tt></b>: A mapping from the edges of the input graph
|
||||
to indexes in the range <tt>[0..num_edges(g))</tt>. This parameter is only
|
||||
needed if the <tt>kuratowski_subgraph</tt> argument is provided. If the
|
||||
<tt>kuratowski_subgraph</tt> argument is provided and this parameter is not
|
||||
provided, the EdgeIndexMap is assumed to be available as an interior property
|
||||
accessible by calling <tt>get(edge_index, g)</tt>.
|
||||
<li><b><tt>embedding</tt></b> : If the graph is planar, this will be populated
|
||||
with a mapping from vertices to the clockwise order of neighbors in the planar
|
||||
embedding.
|
||||
<li><b><tt>kuratowski_subgraph</tt></b> : If the graph is not planar, a minimal
|
||||
set of edges that form the obstructing Kuratowski subgraph will be written to
|
||||
this iterator.
|
||||
</ul>
|
||||
|
||||
These named parameters all belong to the namespace
|
||||
<tt>boyer_myrvold_params</tt>. See below for more information on the concepts
|
||||
required for these arguments.
|
||||
|
||||
<H3>Verifying the output</H3>
|
||||
|
||||
Whether or not the input graph is planar, <tt>boyer_myrvold_planarity_test</tt>
|
||||
can produce a certificate that can be automatically checked to verify that the
|
||||
function is working properly.
|
||||
<p>
|
||||
If the graph is planar, a planar embedding can be produced. The
|
||||
planar embedding can be verified by passing it to a plane drawing routine
|
||||
(such as <tt><a href="straight_line_drawing.html">
|
||||
chrobak_payne_straight_line_drawing</a></tt>) and using the function
|
||||
<tt><a href="is_straight_line_drawing.html">is_straight_line_drawing</a></tt>
|
||||
to verify that the resulting graph is planar.
|
||||
<p>
|
||||
If the graph is not planar, a set of edges that forms a Kuratowski subgraph in
|
||||
the original graph can be produced. This set of edges can be passed to the
|
||||
function <tt><a href="is_kuratowski_subgraph.html">is_kuratowski_subgraph</a>
|
||||
</tt> to verify that they can be contracted into a <i>K<sub>5</sub></i> or
|
||||
<i>K<sub>3,3</sub></i>. <tt>boyer_myrvold_planarity_test</tt> chooses the set
|
||||
of edges forming the Kuratowski subgraph in such a way that the contraction to
|
||||
a <i>K<sub>5</sub></i> or <i>K<sub>3,3</sub></i> can be done by a simple
|
||||
deterministic process which is described in the documentation to
|
||||
<tt>is_kuratowski_subgraph</tt>.
|
||||
|
||||
<H3>Where Defined</H3>
|
||||
|
||||
<P>
|
||||
<a href="../../../boost/graph/boyer_myrvold_planar_test.hpp">
|
||||
<TT>boost/graph/boyer_myrvold_planar_test.hpp</TT>
|
||||
</a>
|
||||
|
||||
<H3>Parameters</H3>
|
||||
|
||||
IN: <tt>Graph& g</tt>
|
||||
|
||||
<blockquote>
|
||||
Any undirected graph. The graph type must be a model of
|
||||
<a href="VertexAndEdgeListGraph.html">VertexAndEdgeListGraph</a> and
|
||||
<a href="IncidenceGraph.html">IncidenceGraph</a>.
|
||||
</blockquote>
|
||||
|
||||
OUT <tt>PlanarEmbedding embedding</tt>
|
||||
|
||||
<blockquote>
|
||||
Must model the <a href="PlanarEmbedding.html">PlanarEmbedding</a> concept.
|
||||
</blockquote>
|
||||
|
||||
IN <tt>OutputIterator kuratowski_subgraph</tt>
|
||||
|
||||
<blockquote>
|
||||
An OutputIterator which accepts values of the type
|
||||
<tt>graph_traits<Graph>::edge_descriptor</tt>
|
||||
</blockquote>
|
||||
|
||||
IN <tt>VertexIndexMap vm</tt>
|
||||
|
||||
<blockquote>
|
||||
A <a href="../../property_map/ReadablePropertyMap.html">Readable Property Map
|
||||
</a> that maps vertices from <tt>g</tt> to distinct integers in the range
|
||||
<tt>[0, num_vertices(g) )</tt><br>
|
||||
<b>Default</b>: <tt>get(vertex_index,g)</tt><br>
|
||||
</blockquote>
|
||||
|
||||
IN <tt>EdgeIndexMap em</tt>
|
||||
|
||||
<blockquote>
|
||||
A <a href="../../property_map/ReadablePropertyMap.html">Readable Property Map
|
||||
</a> that maps edges from <tt>g</tt> to distinct integers in the range
|
||||
<tt>[0, num_edges(g) )</tt><br>
|
||||
<b>Default</b>: <tt>get(edge_index,g)</tt>, but this parameter is only used if
|
||||
the <tt>kuratowski_subgraph_iterator</tt> is provided.<br>
|
||||
</blockquote>
|
||||
|
||||
<H3>Complexity</H3>
|
||||
|
||||
Assuming that both the vertex index and edge index supplied take time
|
||||
<i>O(1)</i> to return an index and there are <i>O(n)</i>
|
||||
total self-loops and parallel edges in the graph, most combinations of
|
||||
arguments given to
|
||||
<tt>boyer_myrvold_planarity_test</tt> result in an algorithm that runs in time
|
||||
<i>O(n)</i> for a graph with <i>n</i> vertices and <i>m</i> edges. The only
|
||||
exception is when Kuratowski subgraph isolation is requested for a dense graph
|
||||
(a graph with <i>n = o(m)</i>) - the running time will be <i>O(n+m)</i>
|
||||
<a href = "#2">[2]</a>.
|
||||
|
||||
<H3>Examples</H3>
|
||||
|
||||
<P>
|
||||
<ul>
|
||||
<li><a href="../example/simple_planarity_test.cpp">A simple planarity test</a>
|
||||
<li><a href="../example/kuratowski_subgraph.cpp">Isolating a Kuratowski
|
||||
Subgraph</a>
|
||||
<li><a href="../example/straight_line_drawing.cpp">Using a planar embedding to
|
||||
create a straight line drawing</a>
|
||||
</ul>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
<a href="./planar_graphs.html">Planar Graphs in the Boost Graph Library</a>
|
||||
|
||||
|
||||
<h3>Notes</h3>
|
||||
|
||||
<p><a name="1">[1] A planar embedding is also called a <i>combinatorial
|
||||
embedding</i>.
|
||||
|
||||
<p><a name="2">[2] The algorithm can still be made to run in time <i>O(n)</i>
|
||||
for this case, if needed. <a href="planar_graphs.html#EulersFormula">Euler's
|
||||
formula</a> implies that a planar graph with <i>n</i> vertices can have no more
|
||||
than <i>3n - 6</i> edges, which means that any non-planar graph on <i>n</i>
|
||||
vertices has a subgraph of only <i>3n - 5</i> edges that contains a Kuratowski
|
||||
subgraph. So, if you need to find a Kuratowski subgraph of a graph with more
|
||||
than <i>3n - 5</i> edges in time <i>O(n)</i>, you can create a subgraph of the
|
||||
original graph consisting of any arbitrary <i>3n - 5</i> edges and pass that
|
||||
graph to <tt>boyer_myrvold_planarity_test</tt>.
|
||||
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
Copyright © 2007 Aaron Windsor (<a href="mailto:aaron.windsor@gmail.com">
|
||||
aaron.windsor@gmail.com</a>)
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -1,120 +1,145 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
-- Copyright (c) Jeremy Siek 2000, 2001
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Breadth-First Search</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1><A NAME="sec:bfs">
|
||||
<img src="figs/python.gif" alt="(Python)"/>
|
||||
<TT>breadth_first_search</TT>
|
||||
</H1>
|
||||
|
||||
<P>
|
||||
<DIV ALIGN="LEFT">
|
||||
<TABLE CELLPADDING=3 border>
|
||||
<TR><TH ALIGN="LEFT"><B>Graphs:</B></TH>
|
||||
<TD ALIGN="LEFT">directed and undirected</TD>
|
||||
</TR>
|
||||
<TR><TH ALIGN="LEFT"><B>Properties:</B></TH>
|
||||
<TD ALIGN="LEFT">color</TD>
|
||||
</TR>
|
||||
<TR><TH ALIGN="LEFT"><B>Complexity:</B></TH>
|
||||
<TD ALIGN="LEFT">time: <i>O(V + E)</i></TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
</DIV>
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
(1)
|
||||
template <class <a href="./VertexListGraph.html">VertexListGraph</a>, class <a href="./BFSVisitor.html">BFSVisitor</a>>
|
||||
void breadth_first_search(VertexListGraph& G,
|
||||
typename graph_traits<VertexListGraph>::vertex_descriptor s,
|
||||
BFSVisitor vis);
|
||||
<i>// named parameter version</i>
|
||||
template <class Graph, class P, class T, class R>
|
||||
void breadth_first_search(Graph& G,
|
||||
typename graph_traits<Graph>::vertex_descriptor s,
|
||||
const bgl_named_params<P, T, R>& params);
|
||||
|
||||
(2)
|
||||
template <class <a href="./VertexListGraph.html">VertexListGraph</a>, class <a href="./BFSVisitor.html">BFSVisitor</a>, class <a href="#ColorMap">ColorMap</a>>
|
||||
void breadth_first_search(VertexListGraph& g,
|
||||
typename graph_traits<VertexListGraph>::vertex_descriptor s,
|
||||
BFSVisitor vis, ColorMap color);
|
||||
|
||||
(3)
|
||||
template <class <a href="./IncidenceGraph.html">IncidenceGraph</a>, class <a href="./Buffer.html">Buffer</a>, <a href="./BFSVisitor.html">BFSVisitor</a>, class <a href="#ColorMap">ColorMap</a>>
|
||||
void breadth_first_search(VertexListGraph& g,
|
||||
typename graph_traits<VertexListGraph>::vertex_descriptor s,
|
||||
Buffer& Q, BFSVisitor vis, ColorMap color)
|
||||
<i>// non-named parameter version</i>
|
||||
template <class Graph, class Buffer, class BFSVisitor,
|
||||
class ColorMap>
|
||||
void breadth_first_search(const Graph& g,
|
||||
typename graph_traits<Graph>::vertex_descriptor s,
|
||||
Buffer& Q, BFSVisitor vis, ColorMap color);
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
The breadth-first search (BFS) algorithm is not really an algorithm in
|
||||
the sense that it has a particular purpose. Instead BFS is more like
|
||||
an algorithm <I>pattern</I>. One can do many different things with
|
||||
BFS. For example, the BFS pattern is used in the BGL to build several
|
||||
other algorithms: Dijkstra's shortest paths, Prim's Minimum Spanning
|
||||
Tree and best-first search. The definition of a <I>breadth-first
|
||||
search</I> is given in Section <A
|
||||
HREF="./graph_theory_review.html#sec:bfs-algorithm">Breadth-First
|
||||
Search</A>.
|
||||
|
||||
<P>
|
||||
The BGL BFS functions are highly parameterized so that they can be
|
||||
used in a wide variety of places. The way to customize the BFS
|
||||
algorithm to perform different operations is to supply a visitor,
|
||||
which is a function object with multiple functions. Each member
|
||||
function of the visitor gets invoked at special times during the
|
||||
algorithm as specified by <a
|
||||
href="./BFSVisitor.html">BFSVisitor</a>. Also, visitors can be layered
|
||||
on top of each other so that one can do lots of things during a single
|
||||
run of BFS. See the <a href="./bfs_visitor.html">bfs_visitor</a> class
|
||||
and the <A HREF="./EventVisitor.html">EventVisitor</A> concept for
|
||||
more details.
|
||||
|
||||
<P>
|
||||
Another way to customize the BFS algorithm is change the type of queue
|
||||
used. For instance, <TT>dijkstra_shortest_paths()</TT> uses a priority
|
||||
queue.
|
||||
|
||||
<p>
|
||||
The <tt>ColorMap</tt> is used by BFS to keep track of which vertices
|
||||
have been visited. At the beginning of the algorithm all vertices are
|
||||
white. As the algorithm proceeds, vertices are colored gray as they
|
||||
are inserted into the queue, and then colored black when they are
|
||||
finished and removed from queue.
|
||||
The <tt>breadth_first_search()</tt> function performs a breadth-first
|
||||
traversal [<a href="./bibliography.html#moore59">49</a>] of a directed
|
||||
or undirected graph. A breadth-first traversal visits vertices that
|
||||
are closer to the source before visiting vertices that are further
|
||||
away. In this context ``distance'' is defined as the number of edges
|
||||
in the shortest path from the source vertex. The
|
||||
<tt>breadth_first_search()</tt> function can be used to compute the
|
||||
shortest path from the source to all reachable vertices and the
|
||||
resulting shortest-path distances. For more definitions related to BFS
|
||||
see section <a href="./graph_theory_review.html#sec:bfs-algorithm">
|
||||
Breadth-First Search</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
BFS uses two data structures to to implement the traversal: a color
|
||||
marker for each vertex and a queue. White vertices are undiscovered
|
||||
while gray vertices are discovered but have undiscovered adjacent
|
||||
vertices. Black vertices are discovered and are adjacent to only other
|
||||
black or gray vertices. The algorithm proceeds by removing a vertex
|
||||
</i>u</i> from the queue and examining each out-edge <i>(u,v)</i>. If an
|
||||
adjacent vertex <i>v</i> is not already discovered, it is colored gray and
|
||||
placed in the queue. After all of the out-edges are examined, vertex
|
||||
<i>u</i> is colored black and the process is repeated. Pseudo-code for the
|
||||
BFS algorithm is a listed below.
|
||||
</p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>
|
||||
BFS(<i>G</i>, <i>s</i>)
|
||||
<b>for</b> each vertex <i>u in V[G]</i>
|
||||
<i>color[u] :=</i> WHITE
|
||||
<i>d[u] := infinity</i>
|
||||
<i>p[u] := u</i>
|
||||
<b>end for</b>
|
||||
<i>color[s] :=</i> GRAY
|
||||
<i>d[s] := 0</i>
|
||||
ENQUEUE(<i>Q</i>, <i>s</i>)
|
||||
<b>while</b> (<i>Q != Ø</i>)
|
||||
<i>u :=</i> DEQUEUE(Q)
|
||||
<b>for</b> each vertex <i>v in Adj[u]</i>
|
||||
<b>if</b> (<i>color[v] =</i> WHITE)
|
||||
<i>color[v] :=</i> GRAY
|
||||
<i>d[v] := d[u] + 1</i>
|
||||
<i>p[v] := u</i>
|
||||
ENQUEUE(<i>Q</i>, <i>v</i>)
|
||||
<b>else</b>
|
||||
<b>if</b> (<i>color[v] =</i> GRAY)
|
||||
...
|
||||
<b>else</b>
|
||||
...
|
||||
<b>end for</b>
|
||||
<i>color[u] :=</i> BLACK
|
||||
<b>end while</b>
|
||||
return (<i>d</i>, <i>p</i>)
|
||||
</pre>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<pre>
|
||||
|
||||
initialize vertex <i>u</i>
|
||||
|
||||
|
||||
<P>
|
||||
Version 1 of the algorithm takes only three arguments: the graph
|
||||
object, the source vertex, and a visitor to specify the actions to be
|
||||
taken during the graph search. The algorithm will need to use a color
|
||||
property which must be provided by the graph object (through a vertex
|
||||
color property).
|
||||
|
||||
<P>
|
||||
Version 2 of the algorithm adds a color property argument to
|
||||
accommodate the use of an external property map.
|
||||
|
||||
<P>
|
||||
Version 3 of the algorithm is the most generalized. It adds a
|
||||
parameter for the queue. This version does not initialize the color of
|
||||
all the vertices to white at the start of the algorithm or invoke the
|
||||
<tt>initialize_vertex()</tt> visitor method, so that must be taken
|
||||
care of before calling this versin of <tt>breadth_first_search()</tt>.
|
||||
|
||||
<P>
|
||||
|
||||
discover vertex <i>s</i>
|
||||
|
||||
examine vertex <i>u</i>
|
||||
examine edge <i>(u,v)</i>
|
||||
<i>(u,v)</i> is a tree edge
|
||||
|
||||
|
||||
|
||||
discover vertex <i>v</i>
|
||||
<i>(u,v)</i> is a non-tree edge
|
||||
|
||||
<i>(u,v)</i> has a gray target
|
||||
|
||||
<i>(u,v)</i> has a black target
|
||||
|
||||
finish vertex <i>u</i>
|
||||
</pre>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
The <tt>breadth_first_search()</tt> function can be extended with
|
||||
user-defined actions that will be called a certain event points. The
|
||||
actions must be provided in the form of a visitor object, that is, an
|
||||
object who's type meets the requirements for a <a
|
||||
href="./BFSVisitor.html">BFS Visitor</a>. In the above pseudo-code,
|
||||
the event points are the labels on the right. Also a description of
|
||||
each event point is given below. By default, the
|
||||
<tt>breadth_first_search()</tt> function does not carry out any
|
||||
actions, not even recording distances or predecessors. However these
|
||||
can be easily added using the <a
|
||||
href="./distance_recorder.html"><tt>distance_recorder</tt></a> and <a
|
||||
href="./predecessor_recorder.html"><tt>predecessor_recorder</tt></a>
|
||||
event visitors.
|
||||
|
||||
|
||||
<H3>Where Defined</H3>
|
||||
|
||||
@@ -123,34 +148,104 @@ care of before calling this versin of <tt>breadth_first_search()</tt>.
|
||||
|
||||
<P>
|
||||
|
||||
<H3>Requirements on Types</H3>
|
||||
<h3>Parameters</h3>
|
||||
|
||||
<P>
|
||||
IN: <tt>Graph& g</tt>
|
||||
<blockquote>
|
||||
A directed or undirected graph. The graph type must
|
||||
be a model of <a href="./VertexListGraph.html">Vertex List Graph</a>
|
||||
and <a href="./IncidenceGraph.html">Incidence Graph</a>.<br>
|
||||
|
||||
<UL>
|
||||
<LI>The type <TT>IncidenceGraph</TT> must be a model of <a href="./IncidenceGraph.html">IncidenceGraph</a>.
|
||||
</LI>
|
||||
<LI>The type <TT>VertexListGraph</TT> must be a model of <a href="./VertexListGraph.html">VertexListGraph</a>.
|
||||
</LI>
|
||||
<LI>The type <TT>BFSVisitor</TT> must be a model of <a href="./BFSVisitor.html">BFSVisitor</a>.
|
||||
</LI>
|
||||
<LI>In version (1) of the algorithm the graph must be a model
|
||||
of <a href="./PropertyGraph.html">PropertyGraph</a> for
|
||||
<TT>vertex_color_t</TT> and
|
||||
the color property map for the graph must meet the
|
||||
same requirements as <TT>ColorMap</TT>.
|
||||
</LI>
|
||||
<LI><a name="ColorMap">The type <TT>ColorMap</TT> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">ReadWritePropertyMap</a>.
|
||||
A vertex descriptor must be usable as the key type of the map,
|
||||
and the value type of the map must be a model of <a
|
||||
href="./ColorValue.html">ColorValue</a>.</a>
|
||||
</LI>
|
||||
<LI>The type <TT>Buffer</TT> must be a model of <a href="./Buffer.html">Buffer</a>.
|
||||
</LI>
|
||||
</UL>
|
||||
<b>Python</b>: The parameter is named <tt>graph</tt>.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>vertex_descriptor s</tt>
|
||||
<blockquote>
|
||||
The source vertex where the search is started.<br>
|
||||
|
||||
<b>Python</b>: The parameter is named <tt>root_vertex</tt>.
|
||||
</blockquote>
|
||||
|
||||
|
||||
<h3>Named Parameters</h3>
|
||||
|
||||
IN: <tt>visitor(BFSVisitor vis)</tt>
|
||||
<blockquote>
|
||||
A visitor object that is invoked inside the algorithm at the
|
||||
event-points specified by the <a href="BFSVisitor.html">BFS
|
||||
Visitor</a> concept. The visitor object is passed by value <a
|
||||
href="#1">[1]</a>.<br> <b>Default:</b>
|
||||
<tt>bfs_visitor<null_visitor></tt> <br>
|
||||
|
||||
<b>Python</b>: The parameter should be an object that derives from
|
||||
the <a href="BFSVisitor.html#python"><tt>BFSVisitor</tt></a> type of the graph.
|
||||
|
||||
</blockquote>
|
||||
|
||||
UTIL/OUT: <tt>color_map(ColorMap color)</tt>
|
||||
<blockquote>
|
||||
This is used by the algorithm to keep track of its progress through
|
||||
the graph. The user need not initialize the color map before calling
|
||||
<tt>breadth_first_search()</tt> since the algorithm initializes the
|
||||
color of every vertex to white at the start of the algorihtm. If you
|
||||
need to perform multiple breadth-first searches on a graph (for
|
||||
example, if there are some disconnected components) then use the <a
|
||||
href="./breadth_first_visit.html"><tt>breadth_first_visit()</tt></a>
|
||||
function and do your own color initialization.
|
||||
|
||||
<p>The type <tt>ColorMap</tt> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a> and its key type must be the graph's vertex
|
||||
descriptor type and the value type of the color map must model
|
||||
<a href="./ColorValue.html">ColorValue</a>.<br>
|
||||
<b>Default:</b> an <a
|
||||
href="../../property_map/iterator_property_map.html">
|
||||
</tt>iterator_property_map</tt></a> created from a
|
||||
<tt>std::vector</tt> of <tt>default_color_type</tt> of size
|
||||
<tt>num_vertices(g)</tt> and using the <tt>i_map</tt> for the index
|
||||
map.<br>
|
||||
|
||||
<b>Python</b>: The color map must be a <tt>vertex_color_map</tt> for
|
||||
the graph.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>vertex_index_map(VertexIndexMap i_map)</tt>
|
||||
<blockquote>
|
||||
This maps each vertex to an integer in the range <tt>[0,
|
||||
num_vertices(g))</tt>. This parameter is only necessary when the
|
||||
default color property map is used. The type <tt>VertexIndexMap</tt>
|
||||
must be a model of <a
|
||||
href="../../property_map/ReadablePropertyMap.html">Readable Property
|
||||
Map</a>. The value type of the map must be an integer type. The
|
||||
vertex descriptor type of the graph needs to be usable as the key
|
||||
type of the map.<br>
|
||||
|
||||
<b>Default:</b> <tt>get(vertex_index, g)</tt>.
|
||||
Note: if you use this default, make sure your graph has
|
||||
an internal <tt>vertex_index</tt> property. For example,
|
||||
<tt>adjacenty_list</tt> with <tt>VertexList=listS</tt> does
|
||||
not have an internal <tt>vertex_index</tt> property.<br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
UTIL: <tt>buffer(Buffer& Q)</tt>
|
||||
<blockquote>
|
||||
The queue used to determine the order in which vertices will be
|
||||
discovered. If a FIFO queue is used, then the traversal will
|
||||
be according to the usual BFS ordering. Other types of queues
|
||||
can be used, but the traversal order will be different.
|
||||
For example Dijkstra's algorithm can be implemented
|
||||
using a priority queue. The type <tt>Buffer</tt> must be a model of
|
||||
<a href="./Buffer.html">Buffer</a>.<br> The <tt>value_type</tt>
|
||||
of the buffer must be the <tt>vertex_descriptor</tt> type for the graph.<br>
|
||||
<b>Default:</b> <tt>boost::queue</tt><br>
|
||||
|
||||
<b>Python</b>: The buffer must derive from the <a
|
||||
href="./Buffer.html">Buffer</a> type for the graph.
|
||||
|
||||
</blockquote>
|
||||
|
||||
<P>
|
||||
|
||||
<H3><A NAME="SECTION001330300000000000000">
|
||||
Complexity</A>
|
||||
@@ -161,85 +256,82 @@ The time complexity is <i>O(E + V)</i>.
|
||||
|
||||
<P>
|
||||
|
||||
<h3>Visitor Event Points</h3>
|
||||
|
||||
<ul>
|
||||
<li><b><tt>vis.initialize_vertex(v, g)</tt></b> is invoked on every vertex
|
||||
before the start of the search.
|
||||
|
||||
<li><b><tt>vis.examine_vertex(u, g)</tt></b>r is invoked in each
|
||||
vertex as it is removed from the queue.
|
||||
|
||||
<li><b><tt>vis.examine_edge(e, g)</tt></b> is invoked on every out-edge
|
||||
of each vertex immediately after the vertex is removed from the queue.
|
||||
|
||||
<li><b><tt>vis.tree_edge(e, g)</tt></b> is invoked (in addition to
|
||||
<tt>examine_edge()</tt>) if the edge is a tree edge. The
|
||||
target vertex of edge <tt>e</tt> is discovered at this time.
|
||||
|
||||
<li><b><tt>vis.discover_vertex(u, g)</tt></b> is invoked the first time the
|
||||
algorithm encounters vertex <i>u</i>. All vertices closer to the
|
||||
source vertex have been discovered, and vertices further from the
|
||||
source have not yet been discovered.
|
||||
|
||||
<li><b><tt>vis.non_tree_edge(e, g)</tt></b> is invoked (in addition to
|
||||
<tt>examine_edge()</tt>) if the edge is not a tree edge.
|
||||
|
||||
<li><b><tt>vis.gray_target(e, g)</tt></b> is invoked (in addition to
|
||||
<tt>non_tree_edge()</tt>) if the target vertex is colored gray at the
|
||||
time of examination. The color gray indicates that
|
||||
the vertex is currently in the queue.
|
||||
|
||||
<li><b><tt>vis.black_target(e, g)</tt></b> is invoked (in addition to
|
||||
<tt>non_tree_edge()</tt>) if the target vertex is colored black at the
|
||||
time of examination. The color black indicates that the
|
||||
vertex is no longer in the queue.
|
||||
|
||||
<li><b><tt>vis.finish_vertex(u, g)</tt></b> is invoked after all of the out
|
||||
edges of <i>u</i> have been examined and all of the adjacent vertices
|
||||
have been discovered.
|
||||
|
||||
</ul>
|
||||
|
||||
<H3><A NAME="SECTION001330400000000000000">
|
||||
Example</A>
|
||||
</H3>
|
||||
|
||||
<P>
|
||||
This example demonstrates using the BGL Breadth-first search algorithm
|
||||
on the graph from <A
|
||||
HREF="./graph_theory_review.html#fig:bfs-example">Figure 5</A>. The
|
||||
source code for this example is in <a
|
||||
href="../example/bfs_basics.cpp"><TT>examples/bfs_basics.cpp</TT></a>.
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
// Select the graph type we wish to use
|
||||
typedef adjacency_list<vecS, undirectedS> Graph;
|
||||
// Set up the vertex ID's and names
|
||||
enum { r, s, t, u, v, w, x, y, N };
|
||||
char name[] = { 'r', 's', 't', 'u', 'v', 'w', 'x', 'y' };
|
||||
// Specify the edges in the graph
|
||||
typedef pair<int,int> 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) };
|
||||
// Create the graph object
|
||||
Graph G(N, edge_array, edge_array + sizeof(edge_array)/sizeof(E));
|
||||
|
||||
// Some typedef's to save a little typing
|
||||
typedef Graph::vertex_descriptor Vertex;
|
||||
typedef std::vector<Vertex>::iterator Piter;
|
||||
typedef std::vector<Graph::size_type>::iterator Iiter;
|
||||
|
||||
// vectors to hold color, discover time, and finish time properties
|
||||
std::vector<default_color_type> color(num_vertices(G));
|
||||
std::vector<Graph::size_type> dtime(num_vertices(G));
|
||||
std::vector<Graph::size_type> ftime(num_vertices(G));
|
||||
|
||||
breadth_first_search(G, vertex(s,G),
|
||||
visit_timestamp(dtime.begin(), ftime.begin()),
|
||||
color.begin());
|
||||
|
||||
// Use std::sort to order the vertices by their discover time
|
||||
vector<Graph::size_type> discover_order(N);
|
||||
iota(discover_order.begin(), discover_order.end(), 0);
|
||||
std::sort(discover_order.begin(), discover_order.end(),
|
||||
indirect_cmp<Iiter, std::less<Graph::size_type> >(dtime.begin()));
|
||||
|
||||
cout << "order of discovery: ";
|
||||
for (int i = 0; i < N; ++i)
|
||||
cout << name[ discover_order[i] ] << " ";
|
||||
|
||||
vector<Graph::size_type> finish_order(N);
|
||||
iota(finish_order.begin(), finish_order.end(), 0);
|
||||
std::sort(finish_order.begin(), finish_order.end(),
|
||||
indirect_cmp<Iiter, std::less<Graph::size_type> >(ftime.begin()));
|
||||
|
||||
cout << endl << "order of finish: ";
|
||||
for (int i = 0; i < N; ++i)
|
||||
cout << name[ finish_order[i] ] << " ";
|
||||
cout << endl;
|
||||
</PRE>
|
||||
The output is:
|
||||
<PRE>
|
||||
order of discovery: s r w v t x u y
|
||||
order of finish: s r w v t x u y
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
The example in <a
|
||||
href="../example/bfs-example.cpp"><TT>example/bfs-example.cpp</TT></a>
|
||||
demonstrates using the BGL Breadth-first search algorithm on the graph
|
||||
from <A HREF="./graph_theory_review.html#fig:bfs-example">Figure
|
||||
5</A>. The file
|
||||
<a href="../example/bfs-example2.cpp"><TT>example/bfs-example2.cpp</TT></a>
|
||||
contains the same example, except that the <tt>adacency_list</tt>
|
||||
class used has <tt>VertexList</tt> and <tt>EdgeList</tt> set
|
||||
to <tt>listS</tt>.
|
||||
</P>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
<a href="./bfs_visitor.html"><tt>bfs_visitor</tt></a> and
|
||||
<a href="./depth_first_search.html"><tt>depth_first_search()</tt></a>
|
||||
|
||||
<h3>Notes</h3>
|
||||
|
||||
<p><a name="1">[1]</a>
|
||||
Since the visitor parameter is passed by value, if your visitor
|
||||
contains state then any changes to the state during the algorithm
|
||||
will be made to a copy of the visitor object, not the visitor object
|
||||
passed in. Therefore you may want the visitor to hold this state by
|
||||
pointer or reference.
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -0,0 +1,186 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000, 2001
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Breadth-First Visit</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1><A NAME="sec:bfv"><img src="figs/python.gif" alt="(Python)"/>
|
||||
<TT>breadth_first_visit</TT>
|
||||
</H1>
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
template <class <a href="./IncidenceGraph.html">IncidenceGraph</a>, class P, class T, class R>
|
||||
void breadth_first_visit(IncidenceGraph& G,
|
||||
typename graph_traits<IncidenceGraph>::vertex_descriptor s,
|
||||
const bgl_named_params<P, T, R>& params);
|
||||
|
||||
template <class <a href="./IncidenceGraph.html">IncidenceGraph</a>, class <a href="./Buffer.html">Buffer</a>, class <a href="./BFSVisitor.html">BFSVisitor</a>, class ColorMap>
|
||||
void breadth_first_visit
|
||||
(const IncidenceGraph& g,
|
||||
typename graph_traits<IncidenceGraph>::vertex_descriptor s,
|
||||
Buffer& Q, BFSVisitor vis, ColorMap color)
|
||||
</PRE>
|
||||
|
||||
This function is basically the same as <tt>breadth_first_search()</tt>
|
||||
except that the color markers are not initialized in the
|
||||
algorithm. The user is responsible for making sure the color for every
|
||||
vertex is white before calling the algorithm. With this difference,
|
||||
the graph type is only required to be an <a
|
||||
href="./IncidenceGraph.html">Incidence Graph</a> instead of a <a
|
||||
href="./VertexListGraph.html">Vertex List Graph</a>. Also, this
|
||||
difference allows for more flexibility in the color property map. For
|
||||
example, one could use a map that only implements a partial function
|
||||
on the vertices, which could be more space efficient when the search
|
||||
only reaches a small portion of the graph.
|
||||
|
||||
<H3>Where Defined</H3>
|
||||
|
||||
<P>
|
||||
<a href="../../../boost/graph/breadth_first_search.hpp"><TT>boost/graph/breadth_first_search.hpp</TT></a>
|
||||
|
||||
|
||||
<h3>Parameters</h3>
|
||||
|
||||
IN: <tt>IncidenceGraph& g</tt>
|
||||
<blockquote>
|
||||
A directed or undirected graph. The graph type must
|
||||
be a model of <a href="./IncidenceGraph.html">Incidence Graph</a>.<br>
|
||||
|
||||
<b>Python</b>: The parameter is named <tt>graph</tt>.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>vertex_descriptor s</tt>
|
||||
<blockquote>
|
||||
The source vertex where the search is started.<br>
|
||||
|
||||
<b>Python</b>: The parameter is named <tt>root_vertex</tt>.
|
||||
</blockquote>
|
||||
|
||||
|
||||
<h3>Named Parameters</h3>
|
||||
|
||||
IN: <tt>visitor(BFSVisitor vis)</tt>
|
||||
<blockquote>
|
||||
A visitor object that is invoked inside the algorithm at the
|
||||
event-points specified by the <a href="BFSVisitor.html">BFS
|
||||
Visitor</a> concept. The visitor object is passed by value <a
|
||||
href="#1">[1]</a>.<br> <b>Default:</b>
|
||||
<tt>bfs_visitor<null_visitor></tt><br>
|
||||
|
||||
<b>Python</b>: The parameter should be an object that derives from
|
||||
the <a href="BFSVisitor.html#python"><tt>BFSVisitor</tt></a> type of the graph.
|
||||
</blockquote>
|
||||
|
||||
UTIL/OUT: <tt>color_map(ColorMap color)</tt>
|
||||
<blockquote>
|
||||
This is used by the algorithm to keep track of its progress through
|
||||
the graph. The type <tt>ColorMap</tt> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a> and its key type must be the graph's vertex
|
||||
descriptor type and the value type of the color map must model
|
||||
<a href="./ColorValue.html">ColorValue</a>.<br>
|
||||
<b>Default:</b> <tt>get(vertex_color, g)</tt><br>
|
||||
|
||||
<b>Python</b>: The color map must be a <tt>vertex_color_map</tt> for
|
||||
the graph.
|
||||
</blockquote>
|
||||
|
||||
UTIL: <tt>buffer(Buffer& Q)</tt>
|
||||
<blockquote>
|
||||
The queue used to determine the order in which vertices will be
|
||||
discovered. If a FIFO queue is used, then the traversal will
|
||||
be according to the usual BFS ordering. Other types of queues
|
||||
can be used, but the traversal order will be different.
|
||||
For example Dijkstra's algorithm can be implemented
|
||||
using a priority queue. The type <tt>Buffer</tt> must be a model of
|
||||
<a href="./Buffer.html">Buffer</a>.<br>
|
||||
<b>Default:</b> <tt>boost::queue</tt><br>
|
||||
|
||||
<b>Python</b>: The buffer must derive from the <a
|
||||
href="./Buffer.html">Buffer</a> type for the graph.
|
||||
</blockquote>
|
||||
|
||||
|
||||
<H3><A NAME="SECTION001330300000000000000">
|
||||
Complexity</A>
|
||||
</H3>
|
||||
|
||||
<P>
|
||||
The time complexity is <i>O(E)</i>.
|
||||
|
||||
<P>
|
||||
|
||||
<h3>Visitor Event Points</h3>
|
||||
|
||||
<ul>
|
||||
<li><b><tt>vis.examine_vertex(u, g)</tt></b>r is invoked in each
|
||||
vertex as it is removed from the queue.
|
||||
|
||||
<li><b><tt>vis.examine_edge(e, g)</tt></b> is invoked on every out-edge
|
||||
of each vertex immediately after the vertex is removed from the queue.
|
||||
|
||||
<li><b><tt>vis.tree_edge(e, g)</tt></b> is invoked (in addition to
|
||||
<tt>examine_edge()</tt>) if the edge is a tree edge. The
|
||||
target vertex of edge <tt>e</tt> is discovered at this time.
|
||||
|
||||
<li><b><tt>vis.discover_vertex(u, g)</tt></b> is invoked the first time the
|
||||
algorithm encounters vertex <i>u</i>. All vertices closer to the
|
||||
source vertex have been discovered, and vertices further from the
|
||||
source have not yet been discovered.
|
||||
|
||||
<li><b><tt>vis.non_tree_edge(e, g)</tt></b> is invoked (in addition to
|
||||
<tt>examine_edge()</tt>) if the edge is not a tree edge.
|
||||
|
||||
<li><b><tt>vis.gray_target(e, g)</tt></b> is invoked (in addition to
|
||||
<tt>non_tree_edge()</tt>) if the target vertex is colored gray at the
|
||||
time of examination. The color gray indicates that
|
||||
the vertex is currently in the queue.
|
||||
|
||||
<li><b><tt>vis.black_target(e, g)</tt></b> is invoked (in addition to
|
||||
<tt>non_tree_edge()</tt>) if the target vertex is colored black at the
|
||||
time of examination. The color black indicates that the
|
||||
vertex is no longer in the queue.
|
||||
|
||||
<li><b><tt>vis.finish_vertex(u, g)</tt></b> is invoked after all of the out
|
||||
edges of <i>u</i> have been examined and all of the adjacent vertices
|
||||
have been discovered.
|
||||
|
||||
</ul>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
<a href="./breadth_first_search.html"><tt>breadth_first_search()</tt></a>,
|
||||
<a href="./bfs_visitor.html"><tt>bfs_visitor</tt></a>, and
|
||||
<a href="./depth_first_search.html"><tt>depth_first_search()</tt></a>
|
||||
|
||||
<h3>Notes</h3>
|
||||
|
||||
<p><a name="1">[1]</a>
|
||||
Since the visitor parameter is passed by value, if your visitor
|
||||
contains state then any changes to the state during the algorithm
|
||||
will be made to a copy of the visitor object, not the visitor object
|
||||
passed in. Therefore you may want the visitor to hold this state by
|
||||
pointer or reference.
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -0,0 +1,178 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<!--
|
||||
-- Copyright Doug Gregor 2004. Use, modification and
|
||||
-- distribution is subject to the Boost Software License, Version
|
||||
-- 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
-- For more information, see http://www.boost.org
|
||||
-->
|
||||
<head>
|
||||
<title>Bundled Properties</title>
|
||||
</head>
|
||||
|
||||
<body BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86"/>
|
||||
<h1>Bundled Properties</h1>
|
||||
|
||||
<p>Class templates <code><a
|
||||
href="adjacency_list.html">adjacency_list</a></code> and
|
||||
<code><a href="adjacency_matrix.html">adjacency_matrix</a></code> support
|
||||
the introduction of named properties via <a
|
||||
href="using_adjacency_list.html#sec:adjacency-list-properties">internal
|
||||
properties</a>. However, this method is cumbersome in many uses,
|
||||
where it would be more intuitive to just specify a structure or
|
||||
class that contains internal properties for edges or
|
||||
vertices. Bundled properties allow one to use
|
||||
<code>adjacency_list</code> and <code>adjacency_matrix</code> in this
|
||||
manner, providing a simple
|
||||
way to introduce and access any number of internal properties
|
||||
for vertices and edges.</p>
|
||||
|
||||
<p>One can introduce bundled properties into an
|
||||
either graph type by providing a user-defined class
|
||||
type for the <code>VertexProperties</code> or
|
||||
<code>EdgeProperties</code> template arguments. The user-defined
|
||||
class may alternatively be placed at the end of a
|
||||
<code>property</code> list, replacing the (implicit)
|
||||
<code>boost::no_property</code> argument.</p>
|
||||
|
||||
<h2>Example: Route planning</h2>
|
||||
<p>Consider the implementation of a simple route planner that
|
||||
should find the shortest directions from one city to another
|
||||
via a set of highways. The vertices of the graph are cities,
|
||||
and we may wish to store several bits of information about the
|
||||
city within each vertex:</p>
|
||||
<pre>
|
||||
struct City
|
||||
{
|
||||
string name;
|
||||
int population;
|
||||
vector<int> zipcodes;
|
||||
};
|
||||
</pre>
|
||||
|
||||
<p>The edges in the graph represent highways, which also have
|
||||
several interesting attributes:</p>
|
||||
|
||||
<pre>
|
||||
struct Highway
|
||||
{
|
||||
string name;
|
||||
double miles;
|
||||
int speed_limit;
|
||||
int lanes;
|
||||
bool divided;
|
||||
};
|
||||
</pre>
|
||||
|
||||
<p>Without bundled properties, translating this example directly
|
||||
into an instantiation of <code>adjacency_list</code> would
|
||||
involve several custom properties and would result in a type
|
||||
like this:</p>
|
||||
<pre>
|
||||
typedef boost::adjacency_list<
|
||||
boost::listS, boost::vecS, boost::bidirectionalS,
|
||||
// Vertex properties
|
||||
boost::property<boost::vertex_name_t, std::string,
|
||||
boost::property<population_t, int,
|
||||
boost::property<zipcodes_t, std::vector<int> > > >,
|
||||
// Edge properties
|
||||
boost::property<boost::edge_name_t, std::string,
|
||||
boost::property<boost::edge_length_t, double,
|
||||
boost::property<edge_speed_limit_t, int,
|
||||
boost::property<edge_lanes_t, int,
|
||||
boost::property<edge_divided, bool> > > > > >
|
||||
Map;
|
||||
</pre>
|
||||
|
||||
<p>With bundled properties, we can directly use the
|
||||
<code>City</code> and <code>Highway</code> structures:</p>
|
||||
<pre>
|
||||
typedef boost::adjacency_list<
|
||||
boost::listS, boost::vecS, boost::bidirectionalS,
|
||||
City, Highway> Map;
|
||||
</pre>
|
||||
|
||||
<h2>Accessing bundled properties</h2>
|
||||
<p>To access a bundled property for a particular edge or vertex,
|
||||
subscript your graph with the descriptor of the edge or vertex
|
||||
whose bundled property you wish to access. For instance:</p>
|
||||
<pre>
|
||||
Map map; // load the map
|
||||
Map::vertex_descriptor v = *vertices(map).first;
|
||||
map[v].name = "Troy";
|
||||
map[v].population = 49170;
|
||||
map[v].zipcodes.push_back(12180);
|
||||
Map::edge_descriptor e = *out_edges(v, map).first;
|
||||
map[e].name = "I-87";
|
||||
map[e].miles = 10;
|
||||
map[e].speed_limit = 65;
|
||||
map[e].lanes = 4;
|
||||
map[e].divided = true;
|
||||
</pre>
|
||||
|
||||
<h2>Properties maps from bundled properties</h2>
|
||||
<p>Often one needs to create a property map from an internal
|
||||
property for use in a generic algorithm. For instance, using the
|
||||
graph without bundled properties we might invoke <a
|
||||
href="dijkstra_shortest_paths.html">Dijkstra's shortest
|
||||
paths</a> algorithm like this:</p>
|
||||
<pre>
|
||||
vector<double> distances(num_vertices(map));
|
||||
dijkstra_shortest_paths(map, from,
|
||||
weight_map(get(edge_length, map))
|
||||
.distance_map(make_iterator_property_map(distances.begin(),
|
||||
get(vertex_index, map))));
|
||||
</pre>
|
||||
|
||||
<p>With bundled properties, we can just pass a <em>member pointer</em>
|
||||
as the property for <code>get</code>. The equivalent example
|
||||
using bundled properties is:</p>
|
||||
<pre>
|
||||
vector<double> distances(num_vertices(map));
|
||||
dijkstra_shortest_paths(map, from,
|
||||
weight_map(get(<font color="#ff0000">&Highway::miles</font>, map))
|
||||
.distance_map(make_iterator_property_map(distances.begin(),
|
||||
get(vertex_index, map))));
|
||||
</pre>
|
||||
|
||||
<p>The type of the returned property map is <code>property_map<Map, int Highway::*>::type</code>
|
||||
or <code>property_map<Map, int Highway::*>::const_type</code>, depending on whether the graph
|
||||
<code>map</code> is non-constant or constant.
|
||||
|
||||
<p> You may also access the entire vertex or edge bundle as a property map
|
||||
using the <code>vertex_bundle</code> or <code>edge_bundle</code> properties,
|
||||
respectively. For instance, the property map returned by <code>get(vertex_bundle, map)</code> is
|
||||
an <a href="../../property_map/LvaluePropertyMap.html">Lvalue Property Map</a> providing access to the
|
||||
<code>City</code> values stored in each vertex.
|
||||
|
||||
<h2>Getting the type of bundled properties</h2>
|
||||
|
||||
<p>To get the type of the vertex or edge bundle for a given graph
|
||||
type <tt>Graph</tt>, you can use the trait
|
||||
classes <tt>vertex_bundle_type</tt>
|
||||
and <tt>edge_bundle_type</tt>. The
|
||||
type <tt>vertex_bundle_type<Graph>::type</tt> will be the
|
||||
type bundled with vertices (or <tt>no_vertex_bundle</tt> if the
|
||||
graph supports bundles but no vertex bundle
|
||||
exists). Likewise, <tt>edge_bundle_type<Graph>::type</tt>
|
||||
will be the type bundled with edges (or <tt>no_edge_bundle</tt> if
|
||||
no edge bundle exists).</p>
|
||||
|
||||
<h2>Compatibility</h2> <p>Bundled properties will only work
|
||||
properly on compilers that support class template partial
|
||||
specialization.</p>
|
||||
|
||||
<hr>
|
||||
Copyright © 2004 <a href="http://www.boost.org/people/doug_gregor.html">Doug Gregor</a>.
|
||||
<address><a href="mailto:gregod@cs.rpi.edu"></a></address>
|
||||
<!-- Created: Fri May 7 09:59:21 EDT 2004 -->
|
||||
<!-- hhmts start -->
|
||||
Last modified: Fri May 7 10:56:01 EDT 2004
|
||||
<!-- hhmts end -->
|
||||
</body>
|
||||
</html>
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Challenge</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -25,30 +21,25 @@
|
||||
|
||||
<ul>
|
||||
|
||||
<li>Dynamic graph algorithms such as described in <a
|
||||
href="http://citeseer.ist.psu.edu/eppstein99dynamic.html">Dynamic Graph
|
||||
Algorithms</a> and <a
|
||||
href="http://citeseer.ist.psu.edu/alberts98software.html">A Software
|
||||
Library of Dynamic Graph Algorithms</a>.
|
||||
|
||||
<li>Polish up code/docs for pending items and champion the formal
|
||||
review. The pending items are:</li>
|
||||
<ul>
|
||||
<li><tt>container_traits.hpp</tt> (this should also include
|
||||
the work Matt Austern is doing on this topic)</li>
|
||||
|
||||
<li><tt>concept_checks.hpp</tt> </li>
|
||||
|
||||
<li><tt>property.hpp</tt></li>
|
||||
|
||||
<li>The queues and heaps: <tt>queue.hpp</tt>,
|
||||
<tt>mutable_queue.hpp</tt>, <tt>fibonacci_heap.hpp</tt>.
|
||||
Somehow merge implementation with Dietmer's heaps and queues.</li>
|
||||
|
||||
<li><tt>iterator_adaptor.hpp</tt> (need to figure out
|
||||
why this causes problems for VC++)</li>
|
||||
|
||||
<li><tt>disjoint_sets</tt> </li>
|
||||
</ul>
|
||||
|
||||
<li>Port the graph library to Borland C++</li>
|
||||
|
||||
<li>Port the graph library to Metrowerks C++</li>
|
||||
|
||||
<li>Construct a set of planar graph algorithms.</li>
|
||||
<ul>
|
||||
<li> Is the graph planar?</li>
|
||||
@@ -67,15 +58,19 @@ polygons.</li>
|
||||
according to a user defined comparison object.</li>
|
||||
</ul>
|
||||
|
||||
<li>Finish and test Maximum Flow algorithm.</li>
|
||||
<li>Rewrite the Qhull algorithm using the Boost Graph Library (this is
|
||||
high difficulty challenge). Or, for a more manageable challenge,
|
||||
write an interface for Qhull with the BGL. <a
|
||||
href="http://www.geom.umn.edu/locate/qhull">Qhull</a> computes the
|
||||
convex hull, Delaunay triangulation, Voronoi diagram, and halfspace
|
||||
intersection about a point. Qhull runs in 2-d, 3-d, 4-d, and higher
|
||||
dimensions. Qhull is used for collision detection, animation, plate
|
||||
tectonics, 3-d modeling, robot motion planning, and other <a
|
||||
href="http://www.geom.umn.edu/~bradb/qhull-news.html#use">applications</a>.
|
||||
It is currently difficult to use from a C++ program.
|
||||
|
||||
<li>Create an <tt>adjacency_matrix</tt> class that models
|
||||
the <a href="./AdjacencyMatrix.html">AdjacencyMatrix</a>
|
||||
concept.</li>
|
||||
</li>
|
||||
|
||||
<li>Floyd-Warshall algorithm.</li>
|
||||
|
||||
<li>Rewrite the Qhull algorithm using the Boost Graph Library.</li>
|
||||
|
||||
<li>Explore the use of Algorithm Objects as an alternative to
|
||||
the current approach with visitors.</li>
|
||||
@@ -94,27 +89,31 @@ polygons.</li>
|
||||
<li>Modularize the tests in test/graph.cpp to apply to particular
|
||||
concepts. Make sure there are run-time tests for every BGL concept.</li>
|
||||
|
||||
<li>Write tests for the BGL algorithms. Currently the examples
|
||||
are used as a sanity check, but they do not constitute a real test. </li>
|
||||
<li>Write tests for the BGL algorithms. There are a few, but
|
||||
more are needed. The example provide a sanity check but do not
|
||||
provide full coverage.</li>
|
||||
|
||||
<li>Write up the examples from Knuth's <i>Stanford GraphBase</i> using
|
||||
the BGL. The file <a
|
||||
href="../example/miles_span.cpp"><tt>examples/miles_span.cpp</tt></a>
|
||||
is a start.
|
||||
is a start.</li>
|
||||
|
||||
<li>Create a class to support sub-graph views of a graph, where a
|
||||
sub-graph behaves just like a graph, but shares vertex and edge
|
||||
properties with the original graph. Perhaps even support sub-graphs
|
||||
of sub-graphs, etc.
|
||||
<li>Further testing of the <tt>subgraph</tt> class and add more
|
||||
features.</li>
|
||||
|
||||
<li>Implement a minimum-cost maximum-flow algorithm.</li>
|
||||
|
||||
<li>Make the <tt>type</tt> of all (internal) property maps convertible to the <tt>const_type</tt> of the property maps.<li>
|
||||
|
||||
<li>Add static functions to <tt>adjacency_list</tt> to return the per-vertex, per-edge, and per-graph overhead.</li>
|
||||
</ul>
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
<html><!--
|
||||
-- Copyright (c) 2004 Trustees of Indiana University
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Function template circle_graph_layout</title></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><table cellpadding="2" width="100%"><td valign="top"><img src="../../../boost.png" alt="boost.png (6897 bytes)" width="277" height="86"></td><td align="center"><a href="../../../index.htm">Home</a></td><td align="center"><a href="../../libraries.htm">Libraries</a></td><td align="center"><a href="http://www.boost.org/people/people.htm">People</a></td><td align="center"><a href="http://www.boost.org/more/faq.htm">FAQ</a></td><td align="center"><a href="../../../more/index.htm">More</a></td></table><hr><div class="refentry" lang="en"><a name="id103562-bb"></a><div class="titlepage"><div></div><div></div></div><div class="refnamediv"><h2><img src="figs/python.gif" alt="(Python)"/><span class="refentrytitle">Function template circle_graph_layout</span></h2><p>boost::circle_graph_layout — Layout the graph with the vertices at the points of a regular n-polygon. </p></div><h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2><div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis">
|
||||
<span class="bold"><b>template</b></span><<span class="bold"><b>typename</b></span> VertexListGraph, <span class="bold"><b>typename</b></span> PositionMap, <span class="bold"><b>typename</b></span> Radius>
|
||||
<span class="type"><span class="bold"><b>void</b></span></span> circle_graph_layout(<span class="bold"><b>const</b></span> VertexListGraph & g, PositionMap position,
|
||||
Radius radius);</pre></div><div class="refsect1" lang="en"><a name="id821794"></a><h2>Where Defined</h2><a href="../../../boost/graph/circle_layout.hpp">boost/graph/circle_layout.hpp</a><h2>Description</h2><p>The distance from the center of the polygon to each point is determined by the <tt class="computeroutput">radius</tt> parameter. The <tt class="computeroutput">position</tt> parameter must be an Lvalue Property Map whose value type is a class type containing <tt class="computeroutput">x</tt> and <tt class="computeroutput">y</tt> members that will be set to the <tt class="computeroutput">x</tt> and <tt class="computeroutput">y</tt> coordinates.
|
||||
|
||||
<h2>Parameters</h2>
|
||||
IN: <tt>const VertexListGraph& g</tt>
|
||||
<blockquote>
|
||||
The graph object on which the algorithm will be applied. The type
|
||||
<tt>VertexListGraph</tt> must be a model of <a
|
||||
href="VertexListGraph.html">Vertex List Graph</a>.<br>
|
||||
<b>Python</b>: The parameter is named <tt>graph</tt>.
|
||||
</blockquote>
|
||||
|
||||
OUT: <tt>PositionMap position</tt>
|
||||
<blockquote>
|
||||
This property map is used to store the position of each vertex. The
|
||||
type <tt>PositionMap</tt> must be a model of <a
|
||||
href="../../property_map/WritablePropertyMap.html">Writable Property
|
||||
Map</a>, with the graph's edge descriptor type as its key type. The
|
||||
value type of this property map should be assignable from the
|
||||
type <tt>Radius</tt>. <br>
|
||||
|
||||
<b>Python</b>: The position map must be a <tt>vertex_point2d_map</tt> for
|
||||
the graph.<br>
|
||||
<b>Python default</b>: <tt>graph.get_vertex_point2d_map("position")</tt>
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>Radius radius</tt>
|
||||
<blockquote>
|
||||
This is the radius of the circle on which points will be layed
|
||||
out. It must be compatible with <tt>double</tt>.<br>
|
||||
</blockquote>
|
||||
|
||||
</p></div></div><table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr><td align="left"></td><td align="right"><small></small></td></tr></table><hr>
|
||||
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2004</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/doug_gregor.html">Douglas Gregor</A>, Indiana University (dgregor -at- cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (lums -at- osl.iu.edu)
|
||||
</TD></TR></TABLE>
|
||||
</body></html>
|
||||
@@ -0,0 +1,720 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<html>
|
||||
<!--
|
||||
-- Copyright (c) 2005 Trustees of Indiana University
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<head>
|
||||
<title>Compressed Sparse Row Graph</title>
|
||||
|
||||
<STYLE TYPE="text/css">
|
||||
<!--
|
||||
.indent
|
||||
{
|
||||
padding-left: 50pt;
|
||||
padding-right: 50pt;
|
||||
}
|
||||
-->
|
||||
</STYLE>
|
||||
|
||||
<script language="JavaScript" type="text/JavaScript">
|
||||
<!--
|
||||
function address(host, user) {
|
||||
var atchar = '@';
|
||||
var thingy = user+atchar+host;
|
||||
thingy = '<a hre' + 'f=' + "mai" + "lto:" + thingy + '>' + user+atchar+host + '</a>';
|
||||
document.write(thingy);
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86"></img>
|
||||
<h1>Compressed Sparse Row Graph</h1>
|
||||
|
||||
<p>The class template <code>compressed_sparse_row_graph</code> is
|
||||
a graph class that uses the compact Compressed Sparse Row (CSR)
|
||||
format to store directed graphs. While CSR graphs have much less
|
||||
overhead than many other graph formats (e.g., <a
|
||||
href="adjacency_list.html"><code>adjacency_list</code></a>), they
|
||||
do not provide any mutability: one cannot add or remove vertices
|
||||
or edges from a CSR graph. Use this format in high-performance
|
||||
applications or for very large graphs that you do not need to
|
||||
change.</p>
|
||||
|
||||
<p>The CSR format stores vertices and edges in separate arrays,
|
||||
with the indices into these arrays corresponding to the identifier
|
||||
for the vertex or edge, respectively. The edge array is sorted by
|
||||
the source of each edge, but contains only the targets for the
|
||||
edges. The vertex array stores offsets into the edge array,
|
||||
providing the offset of the first edge outgoing from each
|
||||
vertex. Iteration over the out-edges for the <i>i</i><sup>th</sup>
|
||||
vertex in the graph is achieved by
|
||||
visiting <tt>edge_array[vertex_array[i]]</tt>, <tt>edge_array[vertex_array[i]+1]</tt>,
|
||||
..., <tt>edge_array[vertex_array[i+1]]</tt>. This format minimizes
|
||||
memory use to <i>O(n + m)</i>, where <i>n</i> and <i>m</i> are the
|
||||
number of vertices and edges, respectively. The constants
|
||||
multiplied by <i>n</i> and <i>m</i> are based on the size of the
|
||||
integers needed to represent indices into the edge and vertex
|
||||
arrays, respectively, which can be controlled using
|
||||
the <a href="#template-parms">template parameters</a>.</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="#synopsis">Synopsis</a></li>
|
||||
<li><a href="#where">Where Defined</a></li>
|
||||
<li><a href="#models">Models</a></li>
|
||||
<li><a href="#template-parms">Template parameters</a></li>
|
||||
<li><a href="#properties">Properties</a></li>
|
||||
<li><a href="#member-functions">Member functions</a>
|
||||
<ul>
|
||||
<li><a href="#constructors">Constructors</a></li>
|
||||
<li><a href="#mutators">Mutators</a></li>
|
||||
<li><a href="#property-access">Property access</a></li>
|
||||
</ul></li>
|
||||
|
||||
<li><a href="#non-members">Non-member functions</a>
|
||||
<ul>
|
||||
<li><a href="#vertex-access">Vertex access</a></li>
|
||||
<li><a href="#edge-access">Edge access</a></li>
|
||||
<li><a href="#property-map-accessors">Property map accessors</a></li>
|
||||
<li><a href="#incremental-construction-functions">Incremental construction functions</a></li>
|
||||
</ul></li>
|
||||
|
||||
<li><a href="#example">Example</a></li>
|
||||
</ul>
|
||||
|
||||
<a name="synopsis"></a><h2>Synopsis</h2>
|
||||
|
||||
<pre>
|
||||
namespace boost {
|
||||
|
||||
template<typename <a href="#Directed">Directed</a> = directedS, typename <a href="#VertexProperty">VertexProperty</a> = void,
|
||||
typename <a href="#EdgeProperty">EdgeProperty</a> = void, typename <a href="#GraphProperty">GraphProperty</a> = no_property,
|
||||
typename <a href="#Vertex">Vertex</a> = std::size_t, typename <a href="#EdgeIndex">EdgeIndex</a> = Vertex>
|
||||
class compressed_sparse_row_graph
|
||||
{
|
||||
public:
|
||||
<i>// <a href="#constructors">Graph constructors</a></i>
|
||||
<a href="#default-const">compressed_sparse_row_graph</a>();
|
||||
|
||||
template<typename InputIterator>
|
||||
<a href="#edge-const">compressed_sparse_row_graph</a>(InputIterator edge_begin, InputIterator edge_end,
|
||||
vertices_size_type numverts,
|
||||
edges_size_type numedges = 0,
|
||||
const GraphProperty& prop = GraphProperty());
|
||||
|
||||
template<typename InputIterator, typename EdgePropertyIterator>
|
||||
<a href="#edge-prop-const">compressed_sparse_row_graph</a>(InputIterator edge_begin, InputIterator edge_end,
|
||||
EdgePropertyIterator ep_iter,
|
||||
vertices_size_type numverts,
|
||||
edges_size_type numedges = 0,
|
||||
const GraphProperty& prop = GraphProperty());
|
||||
|
||||
template<typename Graph, typename VertexIndexMap>
|
||||
<a href="#graph-const">compressed_sparse_row_graph</a>(const Graph& g, const VertexIndexMap& vi,
|
||||
vertices_size_type numverts,
|
||||
edges_size_type numedges);
|
||||
|
||||
template<typename Graph, typename VertexIndexMap>
|
||||
compressed_sparse_row_graph(const Graph& g, const VertexIndexMap& vi);
|
||||
|
||||
template<typename Graph>
|
||||
explicit <a href="#graph-const">compressed_sparse_row_graph</a>(const Graph& g);
|
||||
|
||||
<i>// <a href="#mutators">Graph mutators</a></i>
|
||||
template<typename Graph, typename VertexIndexMap>
|
||||
void <a href="#assign">assign</a>(const Graph& g, const VertexIndexMap& vi,
|
||||
vertices_size_type numverts, edges_size_type numedges);
|
||||
|
||||
template<typename Graph, typename VertexIndexMap>
|
||||
void <a href="#assign">assign</a>(const Graph& g, const VertexIndexMap& vi);
|
||||
|
||||
template<typename Graph>
|
||||
void <a href="#assign">assign</a>(const Graph& g);
|
||||
|
||||
<i>// <a href="#property-access">Property Access</a></i>
|
||||
VertexProperty& <a href="#vertex-subscript">operator[]</a>(vertex_descriptor v);
|
||||
const VertexProperty& <a href="#vertex-subscript">operator[]</a>(vertex_descriptor v) const;
|
||||
EdgeProperty& <a href="#edge-subscript">operator[]</a>(edge_descriptor v);
|
||||
const EdgeProperty& <a href="#edge-subscript">operator[]</a>(edge_descriptor v) const;
|
||||
};
|
||||
|
||||
<i>// <a href="IncidenceGraph.html">Incidence Graph requirements</a></i>
|
||||
vertex_descriptor source(edge_descriptor, const compressed_sparse_row_graph&);
|
||||
vertex_descriptor target(edge_descriptor, const compressed_sparse_row_graph&);
|
||||
std::pair<out_edge_iterator, out_edge_iterator>
|
||||
out_edges(vertex_descriptor, const compressed_sparse_row_graph&);
|
||||
degree_size_type out_degree(vertex_descriptor v, const compressed_sparse_row_graph&);
|
||||
|
||||
<i>// <a href="AdjacencyGraph.html">Adjacency Graph requirements</a></i>
|
||||
std::pair<adjacency_iterator, adjacency_iterator>
|
||||
adjacent_vertices(vertex_descriptor, const compressed_sparse_row_graph&);
|
||||
|
||||
<i>// <a href="VertexListGraph.html">Vertex List Graph requirements</a></i>
|
||||
std::pair<vertex_iterator, vertex_iterator> vertices(const compressed_sparse_row_graph&);
|
||||
vertices_size_type num_vertices(const compressed_sparse_row_graph&);
|
||||
|
||||
<i>// <a href="EdgeListGraph.html">Edge List Graph requirements</a></i>
|
||||
std::pair<edge_iterator, edge_iterator> edges(const compressed_sparse_row_graph&);
|
||||
edges_size_type num_edges(const compressed_sparse_row_graph&);
|
||||
|
||||
<i>// <a href="#vertex-access">Vertex access</a></i>
|
||||
vertex_descriptor <a href="#vertex">vertex</a>(vertices_size_type i, const compressed_sparse_row_graph&);
|
||||
|
||||
<i>// <a href="#edge-access">Edge access</a></i>
|
||||
std::pair<out_edge_iterator, out_edge_iterator>
|
||||
<a href="#edge_range">edge_range</a>(vertex_descriptor u, vertex_descriptor v, const compressed_sparse_row_graph&);
|
||||
std::pair<edge_descriptor, bool>
|
||||
<a href="#edge">edge</a>(vertex_descriptor u, vertex_descriptor v, const compressed_sparse_row_graph&);
|
||||
edge_descriptor <a href="#edge_from_index">edge_from_index</a>(edges_size_type i, const compressed_sparse_row_graph&);
|
||||
|
||||
<i>// <a href="#property-map-accessors">Property map accessors</a></i>
|
||||
template<typename <a href="./PropertyTag.html">PropertyTag</a>>
|
||||
property_map<compressed_sparse_row_graph, PropertyTag>::type
|
||||
<a href="#get">get</a>(PropertyTag, compressed_sparse_row_graph& g)
|
||||
|
||||
template<typename <a href="./PropertyTag.html">PropertyTag</a>>
|
||||
property_map<compressed_sparse_row_graph, Tag>::const_type
|
||||
<a href="#get">get</a>(PropertyTag, const compressed_sparse_row_graph& g)
|
||||
|
||||
template<typename <a href="./PropertyTag.html">PropertyTag</a>, class X>
|
||||
typename property_traits<property_map<compressed_sparse_row_graph, PropertyTag>::const_type>::value_type
|
||||
<a href="#get-x">get</a>(PropertyTag, const compressed_sparse_row_graph& g, X x)
|
||||
|
||||
template<typename <a href="./PropertyTag.html">PropertyTag</a>, class X, class Value>
|
||||
void <a href="#put-x">put</a>(PropertyTag, const compressed_sparse_row_graph& g, X x, const Value& value);
|
||||
|
||||
template<typename <a href="./PropertyTag.html#GraphPropertyTag">GraphPropertyTag</a>>
|
||||
typename graph_property<compressed_sparse_row_graph, GraphPropertyTag>::type&
|
||||
<a href="#get_property">get_property</a>(compressed_sparse_row_graph& g, GraphPropertyTag);
|
||||
|
||||
template<typename <a href="./PropertyTag.html#GraphPropertyTag">GraphPropertyTag</a>>
|
||||
typename graph_property<compressed_sparse_row_graph, GraphPropertyTag>::type const &
|
||||
<a href="#get_property">get_property</a>(const compressed_sparse_row_graph& g, GraphPropertyTag);
|
||||
|
||||
template<typename <a href="./PropertyTag.html#GraphPropertyTag">GraphPropertyTag</a>>
|
||||
void <a href="#set_property">set_property</a>(const compressed_sparse_row_graph& g, GraphPropertyTag,
|
||||
const typename graph_property<compressed_sparse_row_graph, GraphPropertyTag>::type& value);
|
||||
|
||||
<i>// <a href="#incremental-construction-functions">Incremental construction functions</a></i>
|
||||
template<typename Graph>
|
||||
vertex_descriptor <a href=#add_vertex">add_vertex</a>(compressed_sparse_row_graph& g);
|
||||
|
||||
template<typename Graph>
|
||||
vertex_descriptor <a href=#add_vertices">add_vertices</a>(vertices_size_type count, compressed_sparse_row_graph& g);
|
||||
|
||||
template<typename Graph>
|
||||
edge_descriptor <a href=#add_edge">add_vertices</a>(vertex_descriptor src, vertex_descriptor tgt, compressed_sparse_row_graph& g);
|
||||
|
||||
} <i>// end namespace boost</i>
|
||||
</pre>
|
||||
|
||||
<a name="where"></a><h2>Where Defined</h2>
|
||||
<p><code><<a href="../../../boost/graph/compressed_sparse_row_graph.hpp">boost/graph/compressed_sparse_row_graph.hpp</a>></code></p>
|
||||
|
||||
<a name="models"></a><h2>Models</h2>
|
||||
|
||||
<p>The <tt>compressed_sparse_row_graph</tt> class template models
|
||||
(i.e., implements the requirements of) many of the
|
||||
BGL <a href="graph_concepts.html">graph concepts</a>, allowing it
|
||||
to be used with most of the BGL algorithms. In particular, it
|
||||
models the following specific graph concepts:</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="Graph.html">Graph</a></li>
|
||||
<li><a href="IncidenceGraph.html">IncidenceGraph</a></li>
|
||||
<li><a href="AdjacencyGraph.html">AdjacencyGraph</a></li>
|
||||
<li><a href="VertexListGraph.html">VertexListGraph</a></li>
|
||||
<li><a href="EdgeListGraph.html">EdgeListGraph</a></li>
|
||||
<li><a href="PropertyGraph.html">PropertyGraph</a></li>
|
||||
</ul>
|
||||
|
||||
<a name="template-parms"></a><h2>Template Parameters</h2>
|
||||
|
||||
<p>The <tt>compressed_sparse_row_graph</tt> class has several
|
||||
template parameters that can customize the layout in memory and
|
||||
what properties are attached to the graph itself. All
|
||||
parameters have defaults, so users interested only in the
|
||||
structure of a graph can use the
|
||||
type <tt>compressed_sparse_row_graph<></tt> and ignore
|
||||
the parameters.</p>
|
||||
|
||||
<b>Parameters</b>
|
||||
<br>
|
||||
<br>
|
||||
|
||||
<a name="Directed"></a><code>Directed</code>
|
||||
<blockquote>
|
||||
A selector that determines whether the graph will be directed,
|
||||
bidirectional or undirected. At this time, the CSR graph type
|
||||
only supports directed graphs, so this value must
|
||||
be <code>boost::directedS</code>.<br>
|
||||
<b>Default</b>: <code>boost::directedS</code>
|
||||
</blockquote>
|
||||
|
||||
<a name="VertexProperty"></a><code>VertexProperty</code>
|
||||
<blockquote>
|
||||
A class type that will be
|
||||
attached to each vertex in the graph. If this value
|
||||
is <code>void</code>, no properties will be attached to
|
||||
the vertices of the graph.<br>
|
||||
<b>Default</b>: <code>void</code>
|
||||
</blockquote>
|
||||
|
||||
<a name="EdgeProperty"></a><code>EdgeProperty</code>
|
||||
<blockquote>
|
||||
A class type that will be attached to each edge in the graph. If
|
||||
this value is <code>void</code>, no properties will be
|
||||
attached to the edges of the graph.<br>
|
||||
<b>Default</b>: <code>void</code>
|
||||
</blockquote>
|
||||
|
||||
<a name="GraphProperty"></a><code>GraphProperty</code>
|
||||
<blockquote>
|
||||
A nested set
|
||||
of <code>property</code> templates that describe the
|
||||
properties of the graph itself. If this value
|
||||
is <code>no_property</code>, no properties will be attached to
|
||||
the graph.<br>
|
||||
<b>Default</b>: <code>no_property</code>
|
||||
</blockquote>
|
||||
|
||||
<a name="Vertex"></a><code>Vertex</code>
|
||||
<blockquote>
|
||||
An unsigned integral type that will be
|
||||
used as both the index into the array of vertices and as the
|
||||
vertex descriptor itself. Larger types permit the CSR graph to
|
||||
store more vertices; smaller types reduce the storage required
|
||||
per vertex.<br>
|
||||
<b>Default</b>: <code>std::size_t</code>
|
||||
</blockquote>
|
||||
|
||||
<a name="EdgeIndex"></a><code>EdgeIndex</code>
|
||||
<blockquote>
|
||||
An unsigned integral type that will be used as the index into
|
||||
the array of edges. As with the <code>Vertex</code> parameter,
|
||||
larger types permit more edges whereas smaller types reduce
|
||||
the amount of storage needed per
|
||||
edge. The <code>EdgeIndex</code> type shall not be smaller
|
||||
than the <code>Vertex</code> type, but it may be larger. For
|
||||
instance, <code>Vertex</code> may be a 16-bit integer
|
||||
(allowing 32,767 vertices in the graph)
|
||||
whereas <code>EdgeIndex</code> could then be a 32-bit integer
|
||||
to allow a complete graph to be stored in the CSR format.<br>
|
||||
<b>Default</b>: <code>Vertex</code>
|
||||
</blockquote>
|
||||
|
||||
<a name="properties"></a><h2>Interior Properties</h2>
|
||||
|
||||
<p> The <tt>compressed_sparse_row_graph</tt> allows properties to
|
||||
be attached to its vertices, edges, or to the graph itself by way
|
||||
of its <a href="#template-parms">template parameters</a>. These
|
||||
properties may be accessed via
|
||||
the <a href="#property-access">member</a>
|
||||
and <a href="#property-map-accessors">non-member</a> property
|
||||
access functions, using the <a href="bundles.html">bundled
|
||||
properties</a> scheme.</p>
|
||||
|
||||
<p>The CSR graph provides two kinds of built-in
|
||||
properties: <tt>vertex_index</tt>, which maps from vertices to
|
||||
values in <tt>[0, n)</tt> and <tt>edge_index</tt>, which maps
|
||||
from edges to values in <tt>[0, m)</tt>, where <tt>n</tt>
|
||||
and <tt>m</tt> are the number of vertices and edges in the graph,
|
||||
respectively. </p>
|
||||
|
||||
<a name="member-functions"></a><h2>Member Functions</h2>
|
||||
|
||||
<a name="constructors"></a><h3>Constructors</h3>
|
||||
<pre><a name="default-const"></a>
|
||||
compressed_sparse_row_graph();
|
||||
</pre>
|
||||
<p class="indent">Constructs a graph with no vertices or edges.</p>
|
||||
|
||||
<hr></hr>
|
||||
|
||||
<pre><a name="edge-const"></a>
|
||||
template<typename InputIterator>
|
||||
compressed_sparse_row_graph(InputIterator edge_begin, InputIterator edge_end,
|
||||
vertices_size_type numverts,
|
||||
edges_size_type numedges = 0,
|
||||
const GraphProperty& prop = GraphProperty());
|
||||
</pre>
|
||||
|
||||
<p class="indent">
|
||||
Constructs a graph with <code>numverts</code> vertices whose
|
||||
edges are specified by the iterator range <code>[edge_begin,
|
||||
edge_end)</code>. The <tt>InputIterator</tt> must be a model of
|
||||
<a
|
||||
href="http://www.sgi.com/tech/stl/InputIterator.html">InputIterator</a>
|
||||
whose <code>value_type</code> is an <code>std::pair</code> of
|
||||
integer values. These integer values are the source and target
|
||||
vertices for the edges, and must fall within the range <code>[0,
|
||||
numverts)</code>. The edges in <code>[edge_begin,
|
||||
edge_end)</code> must be sorted so that all edges originating
|
||||
from vertex <i>i</i> preceed any edges originating from all
|
||||
vertices <i>j</i> where <i>j > i</i>.
|
||||
</p>
|
||||
|
||||
<p class="indent">
|
||||
The value <code>numedges</code>, if provided, tells how many
|
||||
edges are in the range <code>[edge_begin, edge_end)</code> and
|
||||
will be used to preallocate data structures to save both memory
|
||||
and time during construction.
|
||||
</p>
|
||||
|
||||
<p class="indent">
|
||||
The value <code>prop</code> will be used to initialize the graph
|
||||
property.
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
|
||||
<pre><a name="edge-prop-const"></a>
|
||||
template<typename InputIterator, typename EdgePropertyIterator>
|
||||
compressed_sparse_row_graph(InputIterator edge_begin, InputIterator edge_end,
|
||||
EdgePropertyIterator ep_iter,
|
||||
vertices_size_type numverts,
|
||||
edges_size_type numedges = 0,
|
||||
const GraphProperty& prop = GraphProperty());
|
||||
</pre>
|
||||
<p class="indent">
|
||||
This constructor constructs a graph with <code>numverts</code>
|
||||
vertices and the edges provided in the iterator range
|
||||
<code>[edge_begin, edge_end)</code>. Its semantics are identical
|
||||
to the <a href="#edge-const">edge range constructor</a>, except
|
||||
that edge properties are also initialized. The type
|
||||
<tt>EdgePropertyIterator</tt> must be a model of the <a
|
||||
href="http://www.sgi.com/tech/stl/InputIterator.html">InputIterator</a>
|
||||
concept whose <tt>value_type</tt> is convertible to
|
||||
<tt>EdgeProperty</tt>. The iterator range <tt>[ep_iter, ep_ter +
|
||||
m)</tt> will be used to initialize the properties on the edges
|
||||
of the graph, where <tt>m</tt> is distance from
|
||||
<tt>edge_begin</tt> to <tt>edge_end</tt>.
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
|
||||
<pre><a name="#graph-const"></a>
|
||||
template<typename Graph, typename VertexIndexMap>
|
||||
compressed_sparse_row_graph(const Graph& g, const VertexIndexMap& vi,
|
||||
vertices_size_type numverts,
|
||||
edges_size_type numedges);
|
||||
|
||||
template<typename Graph, typename VertexIndexMap>
|
||||
compressed_sparse_row_graph(const Graph& g, const VertexIndexMap& vi);
|
||||
|
||||
template<typename Graph>
|
||||
explicit compressed_sparse_row_graph(const Graph& g);
|
||||
</pre>
|
||||
|
||||
<p class="indent">
|
||||
Calls the <a href="#assign"><tt>assign</tt></a> function with
|
||||
all of the arguments it is given.
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
|
||||
<a name="mutators"></a><h3>Mutators</h3>
|
||||
<pre><a name="assign"></a>
|
||||
template<typename Graph, typename VertexIndexMap>
|
||||
void assign(const Graph& g, const VertexIndexMap& vi,
|
||||
vertices_size_type numverts, edges_size_type numedges);
|
||||
|
||||
template<typename Graph, typename VertexIndexMap>
|
||||
void assign(const Graph& g, const VertexIndexMap& vi);
|
||||
|
||||
template<typename Graph>
|
||||
void assign(const Graph& g);
|
||||
</pre>
|
||||
|
||||
<p class="indent">
|
||||
Clears the CSR graph and builds a CSR graph in place from the
|
||||
structure of another graph. The graph type <tt>Graph</tt> must
|
||||
be a model of <a href="IncidenceGraph.html">IncidenceGraph</a>
|
||||
and have a <tt>vertex(i, g)</tt> function that retrieves the
|
||||
<i>i</i><sup>th</sup> vertex in the graph.
|
||||
|
||||
<br><b>Parameters</b>
|
||||
|
||||
<ul>
|
||||
<li><tt>g</tt>: The incoming graph.</li>
|
||||
|
||||
<li><tt>vi</tt>: A map from vertices to indices. If not
|
||||
provided, <tt>get(vertex_index, g)</tt> will be used.</li>
|
||||
|
||||
<li><tt>numverts</tt>: The number of vertices in the graph
|
||||
<tt>g</tt>. If not provided, <tt>Graph</tt> must be a model of
|
||||
<a href="VertexListGraph.html">VertexListGraph</a>.</li>
|
||||
|
||||
<li><tt>numedges</tt>: The number of edges in the graph
|
||||
<tt>g</tt>. If not provided, <tt>Graph</tt> must be a model of
|
||||
<a href="EdgeListGraph.html">EdgeListGraph</a>.</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
|
||||
<a name="property-access"></a><h3>Property Access</h3>
|
||||
|
||||
<pre><a name="vertex-subscript"></a>
|
||||
VertexProperty& operator[](vertex_descriptor v);
|
||||
const VertexProperty& operator[](vertex_descriptor v) const;
|
||||
</pre>
|
||||
|
||||
<p class="indent">
|
||||
Retrieves the property value associated with vertex
|
||||
<tt>v</tt>. Only valid when <tt>VertexProperty</tt> is a class
|
||||
type that is not <tt>no_property</tt>.
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
|
||||
<pre><a name="edge-subscript">
|
||||
EdgeProperty& operator[](edge_descriptor v);
|
||||
const EdgeProperty& operator[](edge_descriptor v) const;
|
||||
</pre>
|
||||
|
||||
<p class="indent">
|
||||
Retrieves the property value associated with edge
|
||||
<tt>v</tt>. Only valid when <tt>EdgeProperty</tt> is a class
|
||||
type that is not <tt>no_property</tt>.
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
<a name="non-members"></a><h2>Non-member Functions</h2>
|
||||
|
||||
<a name="vertex-access"></a><h3>Vertex access</h3>
|
||||
|
||||
<pre><a name="vertex"></a>
|
||||
vertex_descriptor vertex(vertices_size_type i, const compressed_sparse_row_graph&);
|
||||
</pre>
|
||||
<p class="indent">
|
||||
Retrieves the <i>i</i><sup>th</sup> vertex in the graph in
|
||||
constant time.
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
|
||||
<a name="edge-access"></a><h3>Edge access</h3>
|
||||
<pre><a name="edge_range"></a>
|
||||
std::pair<out_edge_iterator, out_edge_iterator>
|
||||
edge_range(vertex_descriptor u, vertex_descriptor v, const compressed_sparse_row_graph&);
|
||||
</pre>
|
||||
|
||||
<p class="indent">
|
||||
Returns all edges from <tt>u</tt> to <tt>v</tt>. Requires time
|
||||
linear in the number of edges outgoing from <tt>u</tt>.
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
|
||||
<pre><a name="edge"></a>
|
||||
std::pair<edge_descriptor, bool>
|
||||
edge(vertex_descriptor u, vertex_descriptor v, const compressed_sparse_row_graph&);
|
||||
</pre>
|
||||
|
||||
<p class="indent">
|
||||
If there exists an edge <i>(u, v)</i> in the graph, returns the
|
||||
descriptor for that edge and <tt>true</tt>; otherwise, the
|
||||
second value in the pair will be <tt>false</tt>. If multiple
|
||||
edges exist from <tt>u</tt> to <tt>v</tt>, the first edge will
|
||||
be returned; use <a href="#edge_range"><tt>edge_range</tt></a>
|
||||
to retrieve all edges.
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
|
||||
<pre><a name="edge_from_index"></a>
|
||||
edge_descriptor edge_from_index(edges_size_type i, const compressed_sparse_row_graph&);
|
||||
</pre>
|
||||
|
||||
<p class="indent">
|
||||
Returns the <i>i</i><sup>th</sup> edge in the graph. This
|
||||
operation requires logarithmic time in the number of vertices.
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
|
||||
<h3><a name="property-map-accessors">Property Map Accessors</a></h3>
|
||||
|
||||
<pre><a name="get"></a>
|
||||
template<typename <a href="./PropertyTag.html">PropertyTag</a>>
|
||||
property_map<compressed_sparse_row_graph, PropertyTag>::type
|
||||
get(PropertyTag, compressed_sparse_row_graph& g)
|
||||
|
||||
template<typename <a href="./PropertyTag.html">PropertyTag</a>>
|
||||
property_map<compressed_sparse_row_graph, Tag>::const_type
|
||||
get(PropertyTag, const compressed_sparse_row_graph& g)
|
||||
</pre>
|
||||
|
||||
<p class="indent">
|
||||
Returns the property map object for the vertex property
|
||||
specified by <TT>PropertyTag</TT>. The <TT>PropertyTag</TT> must
|
||||
be a member pointer to access one of the fields in
|
||||
<tt>VertexProperty</tt> or <tt>EdgeProperty</tt>.
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
|
||||
<pre><a name="get-x"></a>
|
||||
template<typename <a href="./PropertyTag.html">PropertyTag</a>, class X>
|
||||
typename property_traits<property_map<compressed_sparse_row_graph, PropertyTag>::const_type>::value_type
|
||||
get(PropertyTag, const compressed_sparse_row_graph& g, X x)
|
||||
</pre>
|
||||
|
||||
<p class="indent">
|
||||
This returns the property value for <tt>x</tt>, where <tt>x</tt>
|
||||
is either a vertex or edge descriptor.
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
|
||||
<pre><a name="put-x"></a>
|
||||
template<typename <a href="./PropertyTag.html">PropertyTag</a>, class X, class Value>
|
||||
void put(PropertyTag, const compressed_sparse_row_graph& g, X x, const Value& value);
|
||||
</pre>
|
||||
|
||||
<p class="indent">
|
||||
This sets the property value for <tt>x</tt> to
|
||||
<tt>value</tt>. <tt>x</tt> is either a vertex or edge
|
||||
descriptor. <tt>Value</tt> must be convertible to <tt>typename
|
||||
property_traits<property_map<compressed_sparse_row_graph,
|
||||
PropertyTag>::type>::value_type</tt>
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
|
||||
<pre><a name="get_property"></a>
|
||||
template<typename <a href="./PropertyTag.html#GraphPropertyTag">GraphPropertyTag</a>>
|
||||
typename graph_property<compressed_sparse_row_graph, GraphPropertyTag>::type&
|
||||
get_property(compressed_sparse_row_graph& g, GraphPropertyTag);
|
||||
|
||||
template<typename <a href="./PropertyTag.html#GraphPropertyTag">GraphPropertyTag</a>>
|
||||
typename graph_property<compressed_sparse_row_graph, GraphPropertyTag>::type const &
|
||||
get_property(const compressed_sparse_row_graph& g, GraphPropertyTag);
|
||||
</pre>
|
||||
|
||||
<p class="indent">
|
||||
Return the property specified by <tt>GraphPropertyTag</tt> that
|
||||
is attached to the graph object <tt>g</tt>.
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
|
||||
<pre><a name="set_property"></a>
|
||||
template<typename <a href="./PropertyTag.html#GraphPropertyTag">GraphPropertyTag</a>>
|
||||
void set_property(const compressed_sparse_row_graph& g, GraphPropertyTag,
|
||||
const typename graph_property<compressed_sparse_row_graph, GraphPropertyTag>::type& value);
|
||||
</pre>
|
||||
|
||||
<p class="indent">
|
||||
Set the property specified by <tt>GraphPropertyTag</tt> that
|
||||
is attached to the graph object <tt>g</tt>.
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
|
||||
<h3><a name="incremental-construction-functions">Incremental construction functions</a></h3>
|
||||
|
||||
<pre><a name="add_vertex"></a>
|
||||
vertex_descriptor add_vertex(compressed_sparse_row_graph& g)
|
||||
</pre>
|
||||
|
||||
<p class="indent">
|
||||
Add a new vertex to the end of the graph <tt>g</tt>, and return a
|
||||
descriptor for that vertex. The new vertex will be greater than any of
|
||||
the previous vertices in <tt>g</tt>.
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
|
||||
<pre><a name="add_vertices"></a>
|
||||
vertex_descriptor add_vertices(vertices_size_type count, compressed_sparse_row_graph& g)
|
||||
</pre>
|
||||
|
||||
<p class="indent">
|
||||
Add <tt>count</tt> new vertices to the end of the graph <tt>g</tt>, and
|
||||
return a descriptor for the smallest new vertex. The new vertices will
|
||||
be greater than any of the previous vertices in <tt>g</tt>.
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
|
||||
<pre><a name="add_edge"></a>
|
||||
edge_descriptor add_edge(vertex_descriptor src, vertex_descriptor tgt, compressed_sparse_row_graph& g)
|
||||
</pre>
|
||||
|
||||
<p class="indent">
|
||||
Add a new edge from <tt>src</tt> to <tt>tgt</tt> in the graph <tt>g</tt>,
|
||||
and return a descriptor for it. There must not be an edge in <tt>g</tt>
|
||||
whose source vertex is greater than <tt>src</tt>. If the vertex
|
||||
<tt>src</tt> has out edges before this operation is called, there must be
|
||||
none whose target is larger than <tt>tgt</tt>.
|
||||
</p>
|
||||
|
||||
<hr></hr>
|
||||
<a name="example"></a><h2>Example</h2>
|
||||
|
||||
<br>[<a
|
||||
href="../example/csr-example.cpp">libs/graph/example/csr-example.cpp</a>]
|
||||
|
||||
<p>We will use the <tt>compressed_sparse_row_graph</tt> graph
|
||||
class to store a simple Web graph. In this web graph the vertices
|
||||
represent web pages and the edges represent links from one web
|
||||
page to another. With each web page we want to associate a URL, so
|
||||
we initially create a <tt>WebPage</tt> class that stores the
|
||||
URL. Then we can create our graph type by providing
|
||||
<tt>WebPage</tt> as a parameter to the
|
||||
<tt>compressed_sparse_row_graph</tt> class template.</p>
|
||||
|
||||
<pre>
|
||||
class WebPage
|
||||
{
|
||||
public:
|
||||
std::string url;
|
||||
};
|
||||
|
||||
// ...
|
||||
|
||||
typedef compressed_sparse_row_graph<directedS, WebPage> WebGraph;
|
||||
WebGraph g(&the_edges[0], &the_edges[0] + sizeof(the_edges)/sizeof(E), 6);
|
||||
</pre>
|
||||
|
||||
<p>We can then set the properties on the vertices of the graph
|
||||
using the <a href="bundles.html">bundled properties</a> syntax,
|
||||
and display the edges for the user.</p>
|
||||
|
||||
<pre>
|
||||
// Set the URLs of each vertex
|
||||
int index = 0;
|
||||
BGL_FORALL_VERTICES(v, g, WebGraph)
|
||||
g[v].url = urls[index++];
|
||||
|
||||
// Output each of the links
|
||||
std::cout << "The web graph:" << std::endl;
|
||||
BGL_FORALL_EDGES(e, g, WebGraph)
|
||||
std::cout << " " << g[source(e, g)].url << " -> " << g[target(e, g)].url
|
||||
<< std::endl;
|
||||
</pre>
|
||||
|
||||
<p>See the <a href="../example/csr-example.cpp">complete example
|
||||
source</a> for other operations one can perform with a
|
||||
<tt>compressed_sparse_row_graph</tt>.</p>
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2005</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/doug_gregor.html">Doug Gregor</A>, Indiana University (<script language="Javascript">address("cs.indiana.edu", "dgregor")</script>)<br>
|
||||
Jeremiah Willcock, Indiana University (<script language="Javascript">address("osl.iu.edu", "jewillco")</script>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<script language="Javascript">address("osl.iu.edu", "lums")</script>)
|
||||
</TD></TR></TABLE>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,266 +1,156 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
-- Copyright (c) Jeremy Siek 2000-2001
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Jeremy Siek makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Connected Components</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
|
||||
<H1>
|
||||
<A NAME="sec:connected-components"></A><A NAME="sec:strongly-connected-components"></A>
|
||||
<TT>connected_components</TT>
|
||||
<A NAME="sec:connected-components">
|
||||
<img src="figs/python.gif" alt="(Python)"/>
|
||||
<TT>connected_components</TT></A>
|
||||
</H1>
|
||||
|
||||
<P>
|
||||
<DIV ALIGN="left">
|
||||
<TABLE CELLPADDING=3 border>
|
||||
<TR><TH ALIGN="LEFT"><B>Graphs:</B></TH>
|
||||
<TD ALIGN="LEFT">see below</TD>
|
||||
</TR>
|
||||
<TR><TH ALIGN="LEFT"><B>Properties:</B></TH>
|
||||
<TD ALIGN="LEFT">components, color, discover time, finish time</TD>
|
||||
</TR>
|
||||
<TR><TH ALIGN="LEFT"><B>Complexity:</B></TH>
|
||||
<TD ALIGN="LEFT"><i>O(V + E)</i></TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
</DIV>
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
(1)
|
||||
template <class VertexListGraph, class Visitor,
|
||||
class Components>
|
||||
typename property_traits< Components >::value_type
|
||||
connected_components(VertexListGraph& G, Components c,
|
||||
Visitor v);
|
||||
<i>// named parameter version</i>
|
||||
template <class VertexListGraph, class ComponentMap, class P, class T, class R>
|
||||
typename property_traits<ComponentMap>::value_type
|
||||
connected_components(VertexListGraph& G, ComponentMap comp,
|
||||
const bgl_named_params<P, T, R>& params = <i>all defaults</i>);
|
||||
|
||||
(2)
|
||||
template <class VertexListGraph, class Visitor,
|
||||
class Components, class Color>
|
||||
typename property_traits<Components>::value_type
|
||||
connected_components(VertexListGraph& G, Components c,
|
||||
Color color, Visitor v);
|
||||
|
||||
(3)
|
||||
template <class VertexListGraph, class Visitor,
|
||||
class Components, class DiscoverTime,
|
||||
class FinishTime, class Color>
|
||||
typename property_traits<Components>::value_type
|
||||
connected_components(VertexListGraph& G, Components c,
|
||||
DiscoverTime d, FinishTime f,
|
||||
Color color, Visitor v);
|
||||
<i>// there is not a non-named parameter version of this function</i>
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
The <TT>connected_component()</TT> function dispatches to two different
|
||||
algorithms depending on whether the graph in question is directed or
|
||||
undirected.
|
||||
|
||||
<P>
|
||||
|
||||
<UL>
|
||||
<LI>Computes the strongly connected components of a directed graph
|
||||
using the DFS/transpose/DFS algorithm [<A
|
||||
HREF="bibliography.html#aho83:_data_struct_algo">1</A>,<A
|
||||
HREF="bibliography.html#clr90">8</A>].
|
||||
|
||||
<P>
|
||||
</LI>
|
||||
<LI>Computes the connected components of an undirected graph using
|
||||
a DFS-based approach. If the connected-components are to be
|
||||
calculated over and over while a graph is changing the disjoint-set
|
||||
based approach of function
|
||||
<TT>dynamic_connected_components()</TT> is faster. For
|
||||
``static'' graphs this DFS-based approach is faster [<A
|
||||
HREF="bibliography.html#clr90">8</A>].
|
||||
</LI>
|
||||
</UL>
|
||||
|
||||
<P>
|
||||
The output of the algorithm is recorded in the component property
|
||||
map <TT>c</TT>, which will contain numbers giving the component ID
|
||||
assigned to each vertex. The number of components is the return value
|
||||
of the function.
|
||||
|
||||
<P>
|
||||
The algorithm requires the use of several property maps: color,
|
||||
discover time, and finish time. There are several versions of this
|
||||
algorithm to accommodate whether you wish to use interior or exterior
|
||||
property maps.
|
||||
The <TT>connected_components()</TT> functions compute the connected
|
||||
components of an undirected graph using a DFS-based approach. A
|
||||
<b><I>connected component</I></b> of an undirected graph is a set of
|
||||
vertices that are all reachable from each other. If the connected
|
||||
components need to be maintained while a graph is growing the
|
||||
disjoint-set based approach of function <a
|
||||
href="./incremental_components.html">
|
||||
<TT>incremental_components()</TT></a> is faster. For ``static'' graphs
|
||||
this DFS-based approach is faster [<A
|
||||
HREF="bibliography.html#clr90">8</A>].
|
||||
|
||||
<P>
|
||||
The output of the algorithm is recorded in the component property map
|
||||
<TT>comp</TT>, which will contain numbers giving the component number
|
||||
assigned to each vertex. The total number of components is the return
|
||||
value of the function.
|
||||
|
||||
<H3>Where Defined</H3>
|
||||
|
||||
<P>
|
||||
<a href="../../../boost/graph/connected_components.hpp"><TT>boost/graph/connected_components.hpp</TT></a>
|
||||
|
||||
<P>
|
||||
|
||||
<H3>Definitions</H3>
|
||||
<h3>Parameters</h3>
|
||||
|
||||
<P>
|
||||
A <I>connected component</I> of an undirected graph is a set of
|
||||
vertices that are all reachable from each other. A <I>strongly
|
||||
connected component</I> of a directed graph <i>G=(V,E)</i> is a
|
||||
maximal set of vertices <i>U</i> which is in <i>V</i> such that for
|
||||
every pair of vertices <i>u</i> and <i>v</i> in <i>U</i>, we have both
|
||||
a path from <i>u</i> to <i>v</i> and path from <i>v</i> to
|
||||
<i>u</i>. That is to say that <i>u</i> and <i>v</i> are reachable from
|
||||
each other.
|
||||
IN: <tt>const Graph& g</tt>
|
||||
<blockquote>
|
||||
An undirected graph. The graph type must be a model of <a
|
||||
href="VertexListGraph.html">Vertex List Graph</a> and <a
|
||||
href="IncidenceGraph.html">Incidence Graph</a>.<br>
|
||||
|
||||
<P>
|
||||
<b>Python</b>: The parameter is named <tt>graph</tt>.
|
||||
</blockquote>
|
||||
|
||||
<H3>Requirements on Types</H3>
|
||||
OUT: <tt>ComponentMap c</tt>
|
||||
<blockquote>
|
||||
The algorithm computes how many connected components are in the graph,
|
||||
and assigning each component an integer label. The algorithm then
|
||||
records which component each vertex in the graph belongs to by
|
||||
recording the component number in the component property map. The
|
||||
<tt>ComponentMap</tt> type must be a model of <a
|
||||
href="../../property_map/WritablePropertyMap.html">Writable Property
|
||||
Map</a>. The value type shouch be an integer type, preferably the same
|
||||
as the <tt>vertices_size_type</tt> of the graph. The key type must be
|
||||
the graph's vertex descriptor type.<br>
|
||||
|
||||
<P>
|
||||
<b>Python</b>: Must be an <tt>vertex_int_map</tt> for the graph.<br>
|
||||
<b>Python default</b>: <tt>graph.get_vertex_int_map("component")</tt>
|
||||
</blockquote>
|
||||
|
||||
<UL>
|
||||
<LI>The graph type must be a model of <a
|
||||
href="./VertexListGraph.html">VertexListGraph</a>.
|
||||
|
||||
</LI>
|
||||
<LI><TT>DiscoverTime</TT> and <TT>FinishTime</TT> must be models of <a
|
||||
href="../../property_map/WritablePropertyMap.html">WritablePropertyMap</a>
|
||||
and their value type must be an integer type. Vertex descriptors from
|
||||
the graph should be usable as the key type for these maps.
|
||||
</LI>
|
||||
<LI>The <TT>Color</TT> map must be a <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">ReadWritePropertyMap</a>
|
||||
and the graph's vertex descriptor type should be usable as the
|
||||
map's key type. The value type of the map must be a
|
||||
model of <I>ColorValue</I>.
|
||||
</LI>
|
||||
<LI>The <TT>Components</TT> type must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">ReadWritePropertyMap</a>. The
|
||||
value type of the <TT>Components</TT> property map should be
|
||||
an integer type, preferably the same as the <TT>size_type</TT> of
|
||||
the graph. The key type should be the graph's vertex descriptor
|
||||
type.
|
||||
</LI>
|
||||
</UL>
|
||||
<h3>Named Parameters</h3>
|
||||
|
||||
UTIL: <tt>color_map(ColorMap color)</tt>
|
||||
<blockquote>
|
||||
This is used by the algorithm to keep track of its progress through
|
||||
the graph. The type <tt>ColorMap</tt> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a> and its key type must be the graph's vertex
|
||||
descriptor type and the value type of the color map must model
|
||||
<a href="./ColorValue.html">ColorValue</a>.<br>
|
||||
<b>Default:</b> an <a
|
||||
href="../../property_map/iterator_property_map.html">
|
||||
</tt>iterator_property_map</tt></a> created from a
|
||||
<tt>std::vector</tt> of <tt>default_color_type</tt> of size
|
||||
<tt>num_vertices(g)</tt> and using the <tt>i_map</tt> for the index
|
||||
map.<br>
|
||||
<b>Python</b>: The color map must be a <tt>vertex_color_map</tt> for
|
||||
the graph.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>vertex_index_map(VertexIndexMap i_map)</tt>
|
||||
<blockquote>
|
||||
This maps each vertex to an integer in the range <tt>[0,
|
||||
num_vertices(g))</tt>. This parameter is only necessary when the
|
||||
default color property map is used. The type <tt>VertexIndexMap</tt>
|
||||
must be a model of <a
|
||||
href="../../property_map/ReadablePropertyMap.html">Readable Property
|
||||
Map</a>. The value type of the map must be an integer type. The
|
||||
vertex descriptor type of the graph needs to be usable as the key
|
||||
type of the map.<br>
|
||||
|
||||
<b>Default:</b> <tt>get(vertex_index, g)</tt>.
|
||||
Note: if you use this default, make sure your graph has
|
||||
an internal <tt>vertex_index</tt> property. For example,
|
||||
<tt>adjacenty_list</tt> with <tt>VertexList=listS</tt> does
|
||||
not have an internal <tt>vertex_index</tt> property.<br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
<P>
|
||||
|
||||
<H3>Complexity</H3>
|
||||
|
||||
<P>
|
||||
The time complexity for the strongly connected components algorithm is
|
||||
<i>O(V + E)</i>. The time complexity for the connected components
|
||||
algorithm is also <i>O(V + E)</i>.
|
||||
The time complexity for the connected components algorithm is also
|
||||
<i>O(V + E)</i>.
|
||||
|
||||
<P>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
<a href="./strong_components.html"><tt>strong_components()</tt></a>
|
||||
and <a href="./incremental_components.html"><tt>incremental_components()</tt></a>
|
||||
|
||||
<H3>Example</H3>
|
||||
|
||||
<P>
|
||||
Calculating the connected components of an undirected graph. The
|
||||
complete source is in file <a
|
||||
href="../example/connected_components.cpp"><tt>examples/connected_components.cpp</tt></a>.
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
typedef discover_time_property< finish_time_property
|
||||
< color_property<> > > VertexProperty;
|
||||
typedef adjacency_list <vecS, vecS, undirectedS, VertexProperty> Graph;
|
||||
typedef graph_traits<Graph>::vertex_descriptor Vertex;
|
||||
|
||||
const int N = 6;
|
||||
Graph G(N);
|
||||
add_edge(0, 1, G);
|
||||
add_edge(1, 4, G);
|
||||
add_edge(4, 0, G);
|
||||
add_edge(2, 5, G);
|
||||
|
||||
std::vector<int> c(num_vertices(G));
|
||||
int num = connected_components(G, c.begin(),
|
||||
get_color_map(G), null_visitor());
|
||||
|
||||
cout << endl;
|
||||
std::vector<int>::iterator i;
|
||||
cout << "Total number of components: " << num << endl;
|
||||
for (i = c.begin(); i != c.end(); ++i)
|
||||
cout << "Vertex " << i - c.begin()
|
||||
<< " is in component " << *i << endl;
|
||||
cout << endl;
|
||||
</PRE>
|
||||
The output is:
|
||||
<PRE>
|
||||
Total number of components: 3
|
||||
Vertex 0 is in component 1
|
||||
Vertex 1 is in component 1
|
||||
Vertex 2 is in component 2
|
||||
Vertex 3 is in component 3
|
||||
Vertex 4 is in component 1
|
||||
Vertex 5 is in component 2
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
Calculating the strongly connected components of a directed graph.
|
||||
<PRE>
|
||||
typedef discover_time_property< finish_time_property
|
||||
< color_property<> > > VertexProperty;
|
||||
typedef adjacency_list< vecS, vecS, directedS, VertexProperty > Graph;
|
||||
const int N = 6;
|
||||
Graph G(N);
|
||||
add_edge(0, 1, G);
|
||||
add_edge(1, 1, G);
|
||||
add_edge(1, 3, G);
|
||||
add_edge(1, 4, G);
|
||||
add_edge(4, 3, G);
|
||||
add_edge(3, 4, G);
|
||||
add_edge(3, 0, G);
|
||||
add_edge(5, 2, G);
|
||||
|
||||
typedef graph_traits<Graph>::vertex_descriptor Vertex;
|
||||
|
||||
std::vector<int> c(N);
|
||||
int num = connected_components(G, c.begin(),
|
||||
get_color_map(G), null_visitor());
|
||||
|
||||
cout << endl;
|
||||
cout << "Total number of components: " << num << endl;
|
||||
std::vector<int>::iterator i;
|
||||
for (i = c.begin(); i != c.end(); ++i)
|
||||
cout << "Vertex " << i - c.begin()
|
||||
<< " is in component " << *i << endl;
|
||||
}
|
||||
</PRE>
|
||||
The output is:
|
||||
<PRE>
|
||||
Total number of components: 3
|
||||
Vertex 0 is in component 3
|
||||
Vertex 1 is in component 3
|
||||
Vertex 2 is in component 2
|
||||
Vertex 3 is in component 3
|
||||
Vertex 4 is in component 3
|
||||
Vertex 5 is in component 1
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
|
||||
The file <a
|
||||
href="../example/connected_components.cpp"><tt>examples/connected_components.cpp</tt></a>
|
||||
contains an example of calculating the connected components of an
|
||||
undirected graph.
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Constructing Graph Algorithms</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -173,14 +169,14 @@ namespace boost {
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Copy Graph</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1><TT>copy_graph</TT></H1>
|
||||
|
||||
<PRE>
|
||||
template <class <a href="./VertexListGraph.html">VertexListGraph</a>, class <a href="./MutableGraph.html">MutableGraph</a>>
|
||||
void copy_graph(const VertexListGraph& G, MutableGraph& G_copy,
|
||||
const bgl_named_params<P, T, R>& params = <i>all defaults</i>)
|
||||
</PRE>
|
||||
|
||||
This function copies all of the vertices and edges from graph
|
||||
<tt>G</tt> into <tt>G_copy</tt>. Also, it copies the vertex and edge
|
||||
properties, either by using the <tt>vertex_all</tt> and
|
||||
<tt>edge_all</tt> property maps, or by user-supplied copy functions.
|
||||
|
||||
<H3>Where Defined</H3>
|
||||
|
||||
<P>
|
||||
<a href="../../../boost/graph/copy.hpp"><TT>boost/graph/copy.hpp</TT></a>
|
||||
|
||||
<P>
|
||||
|
||||
<H3>Parameters</H3>
|
||||
|
||||
IN: <tt>const VertexListGraph& G</tt>
|
||||
<blockquote>
|
||||
A directed or undirected graph. The graph type must be a model of <a href="./VertexListGraph.html">Vertex List Graph</a>.
|
||||
</blockquote>
|
||||
|
||||
OUT: <tt>MutableGraph& G_copy</tt>
|
||||
<blockquote>
|
||||
The resulting copy of the graph. The graph type must be a model of <a
|
||||
href="./MutableGraph.html">Mutable Graph</a>.
|
||||
</blockquote>
|
||||
|
||||
<h3>Named Parameters</h3>
|
||||
|
||||
IN: <tt>vertex_copy(VertexCopier vc)</tt>
|
||||
<blockquote>
|
||||
This is a <a href="http://www.sgi.com/tech/stl/BinaryFunction.html">Binary Function</a> that copies the properties of a vertex in the original graph
|
||||
into the corresponding vertex in the copy.<br>
|
||||
|
||||
<b>Default:</b> <tt>vertex_copier<VertexListGraph, MutableGraph></tt>
|
||||
which uses the property tag <tt>vertex_all</tt> to access a property
|
||||
map from the graph.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>edge_copy(EdgeCopier ec)</tt>
|
||||
<blockquote>
|
||||
This is a <a href="http://www.sgi.com/tech/stl/BinaryFunction.html">Binary Function</a> that copies the properties of an edge in the original graph
|
||||
into the corresponding edge in the copy.<br>
|
||||
|
||||
<b>Default:</b> <tt>edge_copier<VertexListGraph, MutableGraph></tt>
|
||||
which uses the property tag <tt>edge_all</tt> to access a property
|
||||
map from the graph.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>vertex_index_map(VertexIndexMap i_map)</tt>
|
||||
<blockquote>
|
||||
The vertex index map type must be a model of <a
|
||||
href="../../property_map/ReadablePropertyMap.html">Readable Property
|
||||
Map</a> and must map the vertex descriptors of <tt>G</tt> to the
|
||||
integers in the half-open range <tt>[0,num_vertices(G))</tt>.<br>
|
||||
|
||||
<b>Default:</b> <tt>get(vertex_index, G)</tt>.
|
||||
Note: if you use this default, make sure your graph has
|
||||
an internal <tt>vertex_index</tt> property. For example,
|
||||
<tt>adjacenty_list</tt> with <tt>VertexList=listS</tt> does
|
||||
not have an internal <tt>vertex_index</tt> property.
|
||||
</blockquote>
|
||||
|
||||
|
||||
UTIL/OUT: <tt>orig_to_copy(Orig2CopyMap c)</tt>
|
||||
<blockquote>
|
||||
This maps vertices in the original graph to vertices in the copy.
|
||||
|
||||
<b>Default:</b> an <a
|
||||
href="../../property_map/iterator_property_map.html">
|
||||
</tt>iterator_property_map</tt></a> created from a
|
||||
<tt>std::vector</tt> of the output graph's vertex descriptor type of size
|
||||
<tt>num_vertices(g)</tt> and using the <tt>i_map</tt> for the index
|
||||
map.
|
||||
</blockquote>
|
||||
|
||||
<H3>Complexity</H3>
|
||||
|
||||
<P>
|
||||
The time complexity is <i>O(V + E)</i>.
|
||||
|
||||
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -0,0 +1,247 @@
|
||||
<HTML>
|
||||
|
||||
<!-- Copyright (c) Jeremy Siek 2000 -->
|
||||
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Cuthill-Mckee Ordering</Title>
|
||||
</Head>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1>
|
||||
<img src="figs/python.gif" alt="(Python)"/>
|
||||
<TT>cuthill_mckee_ordering</TT>
|
||||
</H1>
|
||||
|
||||
|
||||
<P>
|
||||
<DIV ALIGN="LEFT">
|
||||
<TABLE CELLPADDING=3 border>
|
||||
<TR><TH ALIGN="LEFT"><B>Graphs:</B></TH>
|
||||
<TD ALIGN="LEFT">undirected</TD>
|
||||
</TR>
|
||||
<TR><TH ALIGN="LEFT"><B>Properties:</B></TH>
|
||||
<TD ALIGN="LEFT">color, degree</TD>
|
||||
</TR>
|
||||
<TR><TH ALIGN="LEFT"><B>Complexity:</B></TH>
|
||||
<TD ALIGN="LEFT">time: <i>O(m log(m)|V|)</i> where <i>m = max { degree(v) | v in V }</i> </TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
</DIV>
|
||||
|
||||
|
||||
<pre>
|
||||
(1)
|
||||
template <class IncidenceGraph, class OutputIterator,
|
||||
class ColorMap, class DegreeMap>
|
||||
OutputIterator
|
||||
cuthill_mckee_ordering(const IncidenceGraph& g,
|
||||
typename graph_traits<Graph>::vertex_descriptor s,
|
||||
OutputIterator inverse_permutation,
|
||||
ColorMap color, DegreeMap degree)
|
||||
|
||||
(2)
|
||||
template <class VertexListGraph, class OutputIterator>
|
||||
OutputIterator
|
||||
cuthill_mckee_ordering(const VertexIndexMap& G, OutputIterator inverse_permutation);
|
||||
|
||||
template <class VertexListGraph, class OutputIterator, class VertexIndexMap>
|
||||
OutputIterator
|
||||
cuthill_mckee_ordering(const VertexIndexMap& G, OutputIterator inverse_permutation,
|
||||
VertexIndexMap index_map);
|
||||
|
||||
template <class VertexListGraph, class OutputIterator,
|
||||
class ColorMap, class DegreeMap>
|
||||
OutputIterator
|
||||
cuthill_mckee_ordering(const VertexListGraph& G, OutputIterator inverse_permutation,
|
||||
ColorMap color, DegreeMap degree)
|
||||
|
||||
(3)
|
||||
template <class IncidenceGraph, class OutputIterator,
|
||||
class ColorMap, class DegreeMap>
|
||||
OutputIterator
|
||||
cuthill_mckee_ordering(const IncidenceGraph& g,
|
||||
std::deque< typename
|
||||
graph_traits<Graph>::vertex_descriptor > vertex_queue,
|
||||
OutputIterator inverse_permutation,
|
||||
ColorMap color, DegreeMap degree)
|
||||
</pre>
|
||||
|
||||
The goal of the Cuthill-Mckee (and reverse Cuthill-Mckee) ordering
|
||||
algorithm[<A
|
||||
HREF="bibliography.html#george81:__sparse_pos_def">14</A>, <A
|
||||
HREF="bibliography.html#cuthill69:reducing_bandwith">43</A>, <a
|
||||
href="bibliography.html#liu75:anal_cm_rcm">44</a>, <a
|
||||
href="bibliography.html#george71:fem">45</a> ] is to reduce the <a
|
||||
href="./bandwidth.html">bandwidth</a> of a graph by reordering the
|
||||
indices assigned to each vertex. The Cuthill-Mckee ordering algorithm
|
||||
works by a local minimization of the i-th bandwidths. The vertices are
|
||||
basically assigned a breadth-first search order, except that at each
|
||||
step, the adjacent vertices are placed in the queue in order of
|
||||
increasing degree.
|
||||
|
||||
<p>
|
||||
Version 1 of the algorithm lets the user choose the ``starting
|
||||
vertex'', version 2 finds a good starting vertex using the
|
||||
pseudo-peripheral pair heuristic (among each component), while version 3
|
||||
contains the starting nodes for each vertex in the deque. The choice of the
|
||||
``starting vertex'' can have a significant effect on the quality of the
|
||||
ordering. For versions 2 and 3, <tt>find_starting_vertex</tt> will be called
|
||||
for each component in the graph, increasing run time significantly.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The output of the algorithm are the vertices in the new ordering.
|
||||
Depending on what kind of output iterator you use, you can get either
|
||||
the Cuthill-Mckee ordering or the reverse Cuthill-McKee ordering. For
|
||||
example, if you store the output into a vector using the vector's
|
||||
reverse iterator, then you get the reverse Cuthill-McKee ordering.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
std::vector<vertex_descriptor> inv_perm(num_vertices(G));
|
||||
cuthill_mckee_ordering(G, inv_perm.rbegin(), ...);
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Either way, storing the output into a vector gives you the
|
||||
permutation from the new ordering to the old ordering.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
inv_perm[new_index[u]] == u
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Often times, it is the opposite permutation that you want, the
|
||||
permutation from the old index to the new index. This can easily be
|
||||
computed in the following way.
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
for (size_type i = 0; i != inv_perm.size(); ++i)
|
||||
perm[old_index[inv_perm[i]]] = i;
|
||||
</pre>
|
||||
|
||||
|
||||
|
||||
<h3>Parameters</h3>
|
||||
|
||||
For version 1:
|
||||
|
||||
<ul>
|
||||
|
||||
<li> <tt>IncidenceGraph& g</tt> (IN) <br>
|
||||
An undirected graph. The graph's type must be a model of <a
|
||||
href="./IncidenceGraph.html">IncidenceGraph</a>.<br>
|
||||
<b>Python</b>: The parameter is named <tt>graph</tt>.
|
||||
|
||||
<li> <tt>vertex_descriptor s</tt>  (IN) <br>
|
||||
The starting vertex.<br>
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
|
||||
<li> <tt>OutputIterator inverse_permutation</tt>  (OUT) <br>
|
||||
The new vertex ordering. The vertices are written to the <a
|
||||
href="http://www.sgi.com/tech/stl/OutputIterator.html">output
|
||||
iterator</a> in their new order.<br>
|
||||
<b>Python</b>: This parameter is unused in Python. The new vertex
|
||||
ordering is returned as a Python <tt>list</tt>.
|
||||
|
||||
<li> <tt>ColorMap color_map</tt>  (WORK) <br>
|
||||
Used internally to keep track of the progress of the algorithm
|
||||
(to avoid visiting the same vertex twice).<br>
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
|
||||
<li> <tt>DegreeMap degree_map</tt>  (IN) <br>
|
||||
This must map vertices to their degree.<br>
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</ul>
|
||||
|
||||
|
||||
For version 2:
|
||||
|
||||
<ul>
|
||||
|
||||
<li> <tt>VertexListGraph& g</tt> (IN) <br>
|
||||
An undirected graph. The graph's type must be a model of <a
|
||||
href="./VertexListGraph.html">VertexListGraph</a>.<br>
|
||||
<b>Python</b>: The parameter is named <tt>graph</tt>.
|
||||
|
||||
<li> <tt><a href="http://www.sgi.com/tech/stl/OutputIterator.html">
|
||||
OutputIterator</a> inverse_permutation</tt>  (OUT) <br>
|
||||
The new vertex ordering. The vertices are written to the
|
||||
output iterator in their new order.<br>
|
||||
<b>Python</b>: This parameter is unused in Python. The new vertex
|
||||
ordering is returned as a Python <tt>list</tt>.
|
||||
|
||||
<li> <tt>ColorMap color_map</tt>  (WORK) <br>
|
||||
Used internally to keep track of the progress of the algorithm
|
||||
(to avoid visiting the same vertex twice).<br>
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
|
||||
<li> <tt>DegreeMap degree_map</tt>  (IN) <br>
|
||||
This must map vertices to their degree.<br>
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</ul>
|
||||
|
||||
|
||||
For version 3:
|
||||
|
||||
<ul>
|
||||
|
||||
<li> <tt>IncidenceGraph& g</tt> (IN) <br>
|
||||
An undirected graph. The graph's type must be a model of <a
|
||||
href="./IncidenceGraph.html">IncidenceGraph</a>.<br>
|
||||
<b>Python</b>: The parameter is named <tt>graph</tt>.
|
||||
|
||||
<li> <tt> std::deque< typename graph_traits<Graph>::vertex_descriptor > vertex_queue </tt>  (IN) <br>
|
||||
The deque containing the starting vertices for each component.<br>
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
|
||||
<li> <tt>OutputIterator inverse_permutation</tt>  (OUT) <br>
|
||||
The new vertex ordering. The vertices are written to the <a
|
||||
href="http://www.sgi.com/tech/stl/OutputIterator.html">output
|
||||
iterator</a> in their new order.<br>
|
||||
<b>Python</b>: This parameter is unused in Python. The new vertex
|
||||
ordering is returned as a Python <tt>list</tt>.
|
||||
|
||||
<li> <tt>ColorMap color_map</tt>  (WORK) <br>
|
||||
Used internally to keep track of the progress of the algorithm
|
||||
(to avoid visiting the same vertex twice).<br>
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
|
||||
<li> <tt>DegreeMap degree_map</tt>  (IN) <br>
|
||||
This must map vertices to their degree.<br>
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
<h3>Example</h3>
|
||||
|
||||
See <a
|
||||
href="../example/cuthill_mckee_ordering.cpp"><tt>example/cuthill_mckee_ordering.cpp</tt></a>.
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
<a href="./bandwidth.html">bandwidth</tt></a>,
|
||||
and <tt>degree_property_map</tt> in <tt>boost/graph/properties.hpp</tt>.
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -0,0 +1,326 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Directed Acyclic Graph Shortest Paths</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1><A NAME="sec:dag_shortest_paths"></A>
|
||||
<img src="figs/python.gif" alt="(Python)"/>
|
||||
<TT>dag_shortest_paths</TT>
|
||||
</H1>
|
||||
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
<i>// named paramter version</i>
|
||||
template <class VertexListGraph, class Param, class Tag, class Rest>
|
||||
void dag_shortest_paths(const VertexListGraph& g,
|
||||
typename graph_traits<VertexListGraph>::vertex_descriptor s,
|
||||
const bgl_named_params<Param,Tag,Rest>& params)
|
||||
|
||||
<i>// non-named parameter version</i>
|
||||
template <class VertexListGraph, class DijkstraVisitor,
|
||||
class DistanceMap, class WeightMap, class ColorMap,
|
||||
class PredecessorMap,
|
||||
class Compare, class Combine,
|
||||
class DistInf, class DistZero>
|
||||
void dag_shortest_paths(const VertexListGraph& g,
|
||||
typename graph_traits<VertexListGraph>::vertex_descriptor s,
|
||||
DistanceMap distance, WeightMap weight, ColorMap color,
|
||||
PredecessorMap pred, DijkstraVisitor vis,
|
||||
Compare compare, Combine combine, DistInf inf, DistZero zero)
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
This algorithm [<A HREF="bibliography.html#clr90">8</A>] solves
|
||||
the single-source shortest-paths problem on a weighted, directed
|
||||
acyclic graph (DAG). This algorithm is more efficient for DAG's
|
||||
than either the Dijkstra or Bellman-Ford algorithm.
|
||||
Use breadth-first search instead of this algorithm
|
||||
when all edge weights are equal to one. For the definition of the
|
||||
shortest-path problem see Section <A
|
||||
HREF="graph_theory_review.html#sec:shortest-paths-algorithms">Shortest-Paths
|
||||
Algorithms</A> for some background to the shortest-path problem.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
There are two main options for obtaining output from the
|
||||
<tt>dag_shortest_paths()</tt> function. If you provide a
|
||||
distance property map through the <tt>distance_map()</tt> parameter
|
||||
then the shortest distance from the source vertex to every other
|
||||
vertex in the graph will be recorded in the distance map. Also you can
|
||||
record the shortest paths tree in a predecessor map: for each vertex
|
||||
<i>u in V</i>, <i>p[u]</i> will be the predecessor of <i>u</i> in
|
||||
the shortest paths tree (unless <i>p[u] = u</i>, in which case <i>u</i> is
|
||||
either the source or a vertex unreachable from the source). In
|
||||
addition to these two options, the user can provide there own
|
||||
custom-made visitor that can takes actions during any of the
|
||||
algorithm's event points.</P>
|
||||
|
||||
<h3>Where Defined</h3>
|
||||
|
||||
<a href="../../../boost/graph/dag_shortest_paths.hpp"><tt>boost/graph/dag_shortest_paths.hpp</tt></a>
|
||||
|
||||
<h3>Parameters</h3>
|
||||
|
||||
IN: <tt>const VertexListGraph& g</tt>
|
||||
<blockquote>
|
||||
The graph object on which the algorithm will be applied.
|
||||
The type <tt>VertexListGraph</tt> must be a model of \concept{VertexListGraph}.<br>
|
||||
|
||||
<b>Python</b>: The parameter is named <tt>graph</tt>.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>vertex_descriptor s</tt>
|
||||
<blockquote>
|
||||
The source vertex. All distance will be calculated from this vertex,
|
||||
and the shortest paths tree will be rooted at this vertex.<br>
|
||||
|
||||
<b>Python</b>: The parameter is named <tt>root_vertex</tt>.
|
||||
</blockquote>
|
||||
|
||||
<h3>Named Parameters</h3>
|
||||
|
||||
IN: <tt>weight_map(WeightMap w_map)</tt>
|
||||
<blockquote>
|
||||
The weight or ``length'' of each edge in the graph.
|
||||
The type <tt>WeightMap</tt> must be a model of
|
||||
<a href="../../property_map/ReadablePropertyMap.html">Readable Property Map</a>. The edge descriptor type of
|
||||
the graph needs to be usable as the key type for the weight
|
||||
map. The value type for the map must be
|
||||
<i>Addable</i> with the value type of the distance map.<br>
|
||||
<b>Default:</b> <tt>get(edge_weight, g)</tt><br>
|
||||
<b>Python</b>: Must be an <tt>edge_double_map</tt> for the graph.<br>
|
||||
<b>Python default</b>: <tt>graph.get_edge_double_map("weight")</tt>
|
||||
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>vertex_index_map(VertexIndexMap i_map)</tt>
|
||||
<blockquote>
|
||||
This maps each vertex to an integer in the range <tt>[0,
|
||||
num_vertices(g))</tt>. This is necessary for efficient updates of the
|
||||
heap data structure when an edge is relaxed. The type
|
||||
<tt>VertexIndexMap</tt> must be a model of
|
||||
<a href="../../property_map/ReadablePropertyMap.html">Readable Property Map</a>. The value type of the map must be an
|
||||
integer type. The vertex descriptor type of the graph needs to be
|
||||
usable as the key type of the map.<br>
|
||||
<b>Default:</b> <tt>get(vertex_index, g)</tt>.
|
||||
Note: if you use this default, make sure your graph has
|
||||
an internal <tt>vertex_index</tt> property. For example,
|
||||
<tt>adjacenty_list</tt> with <tt>VertexList=listS</tt> does
|
||||
not have an internal <tt>vertex_index</tt> property.<br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
OUT: <tt>predecessor_map(PredecessorMap p_map)</tt>
|
||||
<blockquote>
|
||||
The predecessor map records the edges in the minimum spanning
|
||||
tree. Upon completion of the algorithm, the edges <i>(p[u],u)</i>
|
||||
for all <i>u in V</i> are in the minimum spanning tree. If <i>p[u] =
|
||||
u</i> then <i>u</i> is either the source vertex or a vertex that is
|
||||
not reachable from the source. The <tt>PredecessorMap</tt> type
|
||||
must be a <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a> which key and vertex types the same as the vertex
|
||||
descriptor type of the graph.<br>
|
||||
<b>Default:</b> <tt>dummy_property_map</tt><br>
|
||||
<b>Python</b>: Must be a <tt>vertex_vertex_map</tt> for the graph.<br>
|
||||
</blockquote>
|
||||
|
||||
UTIL/OUT: <tt>distance_map(DistanceMap d_map)</tt>
|
||||
<blockquote>
|
||||
The shortest path weight from the source vertex <tt>s</tt> to each
|
||||
vertex in the graph <tt>g</tt> is recorded in this property map. The
|
||||
shortest path weight is the sum of the edge weights along the
|
||||
shortest path. The type <tt>DistanceMap</tt> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a>. The vertex descriptor type of the graph needs to
|
||||
be usable as the key type of the distance map.
|
||||
|
||||
The value type of the distance map is the element type of a <a
|
||||
href="./Monoid.html">Monoid</tt> formed with the <tt>combine</tt>
|
||||
function object and the <tt>zero</tt> object for the identity
|
||||
element. Also the distance value type must have a <a
|
||||
href="http://www.sgi.com/tech/stl/StrictWeakOrdering.html">
|
||||
StrictWeakOrdering</a> provided by the <tt>compare</tt> function
|
||||
object.<br>
|
||||
<b>Default:</b> <a
|
||||
href="../../property_map/iterator_property_map.html">
|
||||
<tt>iterator_property_map</tt></a> created from a
|
||||
<tt>std::vector</tt> of the <tt>WeightMap</tt>'s value type of size
|
||||
<tt>num_vertices(g)</tt> and using the <tt>i_map</tt> for the index
|
||||
map.<br>
|
||||
|
||||
<b>Python</b>: Must be a <tt>vertex_double_map</tt> for the graph.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>distance_compare(CompareFunction cmp)</tt>
|
||||
<blockquote>
|
||||
This function is use to compare distances to determine which vertex
|
||||
is closer to the source vertex. The <tt>CompareFunction</tt> type
|
||||
must be a model of <a
|
||||
href="http://www.sgi.com/tech/stl/BinaryPredicate.html">Binary
|
||||
Predicate</a> and have argument types that match the value type of
|
||||
the <tt>DistanceMap</tt> property map.<br>
|
||||
|
||||
<b>Default:</b>
|
||||
<tt>std::less<D></tt> with <tt>D=typename
|
||||
property_traits<DistanceMap>::value_type</tt><br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>distance_combine(CombineFunction cmb)</tt>
|
||||
<blockquote>
|
||||
This function is used to combine distances to compute the distance
|
||||
of a path. The <tt>CombineFunction</tt> type must be a model of <a
|
||||
href="http://www.sgi.com/tech/stl/BinaryFunction.html">Binary
|
||||
Function</a>. The first argument type of the binary function must
|
||||
match the value type of the <tt>DistanceMap</tt> property map and
|
||||
the second argument type must match the value type of the
|
||||
<tt>WeightMap</tt> property map. The result type must be the same
|
||||
type as the distance value type.<br>
|
||||
|
||||
<b>Default:</b> <tt>std::plus<D></tt> with
|
||||
<tt>D=typename property_traits<DistanceMap>::value_type</tt><br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>distance_inf(D inf)</tt>
|
||||
<blockquote>
|
||||
The <tt>inf</tt> object must be the greatest value of any <tt>D</tt> object.
|
||||
That is, <tt>compare(d, inf) == true</tt> for any <tt>d != inf</tt>.
|
||||
The type <tt>D</tt> is the value type of the <tt>DistanceMap</tt>.<br>
|
||||
<b>Default:</b> <tt>std::numeric_limits<D>::max()</tt><br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>distance_zero(D zero)</tt>
|
||||
<blockquote>
|
||||
The <tt>zero</tt> value must be the identity element for the
|
||||
<a href="./Monoid.html">Monoid</a> formed by the distance values
|
||||
and the <tt>combine</tt> function object.
|
||||
The type \code{D} is the value type of the \code{DistanceMap}
|
||||
<b>Default:</b> <tt>D()</tt><br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
UTIL/OUT: <tt>color_map(ColorMap c_map)</tt>
|
||||
<blockquote>
|
||||
This is used during the execution of the algorithm to mark the
|
||||
vertices. The vertices start out white and become gray when they are
|
||||
inserted in the queue. They then turn black when they are removed
|
||||
from the queue. At the end of the algorithm, vertices reachable from
|
||||
the source vertex will have been colored black. All other vertices
|
||||
will still be white. The type <tt>ColorMap</tt> must be a model of
|
||||
<a href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a>. A vertex descriptor must be usable as the key type
|
||||
of the map, and the value type of the map must be a model of
|
||||
<a href="./ColorValue.html">Color Value</a>.<br>
|
||||
<b>Default:</b> an <a
|
||||
href="../../property_map/iterator_property_map.html">
|
||||
<tt>iterator_property_map</tt></a> created from a <tt>std::vector</tt>
|
||||
of <tt>default_color_type</tt> of size <tt>num_vertices(g)</tt> and
|
||||
using the <tt>i_map</tt> for the index map.<br>
|
||||
|
||||
<b>Python</b>: The color map must be a <tt>vertex_color_map</tt> for
|
||||
the graph.
|
||||
|
||||
</blockquote>
|
||||
|
||||
OUT: <tt>visitor(DijkstraVisitor v)</tt>
|
||||
<blockquote>
|
||||
Use this to specify actions that you would like to happen
|
||||
during certain event points within the algorithm.
|
||||
The type <tt>DijkstraVisitor</tt> must be a model of the
|
||||
<a href="./DijkstraVisitor.html">Dijkstra Visitor</a> concept.
|
||||
The visitor object is passed by value <a
|
||||
href="#1">[1]</a>.<br>
|
||||
<b>Default:</b> <tt>dijkstra_visitor<null_visitor></tt><br>
|
||||
|
||||
<b>Python</b>: The parameter should be an object that derives from
|
||||
the <a
|
||||
href="DijkstraVisitor.html#python"><tt>DijkstraVisitor</tt></a> type
|
||||
of the graph.
|
||||
</blockquote>
|
||||
|
||||
|
||||
<H3>Complexity</H3>
|
||||
|
||||
<P>
|
||||
The time complexity is <i>O(V + E)</i>.
|
||||
|
||||
<h3>Visitor Event Points</h3>
|
||||
|
||||
<ul>
|
||||
<li><b><tt>vis.initialize_vertex(u, g)</tt></b>
|
||||
is invoked on each vertex in the graph before the start of the
|
||||
algorithm.
|
||||
<li><b><tt>vis.examine_vertex(u, g)</tt></b>
|
||||
is invoked on a vertex as it is added to set <i>S</i>.
|
||||
At this point we know that <i>(p[u],u)</i>
|
||||
is a shortest-paths tree edge so
|
||||
<i>d[u] = delta(s,u) = d[p[u]] + w(p[u],u)</i>. Also, the distances
|
||||
of the examined vertices is monotonically increasing
|
||||
<i>d[u<sub>1</sub>] <= d[u<sub>2</sub>] <= d[u<sub>n</sub>]</i>.
|
||||
<li><b><tt>vis.examine_edge(e, g)</tt></b>
|
||||
is invoked on each out-edge of a vertex immediately after it has
|
||||
been added to set <i>S</i>.
|
||||
<li><b><tt>vis.edge_relaxed(e, g)</tt></b>
|
||||
is invoked on edge <i>(u,v)</i> if <i>d[u] + w(u,v) < d[v]</i>.
|
||||
The edge <i>(u,v)</i> that participated in the last
|
||||
relaxation for vertex <i>v</i> is an edge in the shortest paths tree.
|
||||
<li><b><tt>vis.discover_vertex(v, g)</tt></b>
|
||||
is invoked on vertex <i>v</i> when the edge
|
||||
<i>(u,v)</i> is examined and <i>v</i> is WHITE. Since
|
||||
a vertex is colored GRAY when it is discovered,
|
||||
each reacable vertex is discovered exactly once.
|
||||
<li><b><tt>vis.edge_not_relaxed(e, g)</tt></b>
|
||||
is invoked if the edge is not relaxed (see above).
|
||||
<li><b><tt>vis.finish_vertex(u, g)</tt></b>
|
||||
is invoked on a vertex after all of its out edges have
|
||||
been examined.
|
||||
</ul>
|
||||
|
||||
<H3>Example</H3>
|
||||
|
||||
<P>
|
||||
See <a href="../example/dag_shortest_paths.cpp">
|
||||
<TT>example/dag_shortest_paths.cpp</TT></a> for an example of using this
|
||||
algorithm.
|
||||
|
||||
<H3>Notes</H3>
|
||||
|
||||
<p><a name="1">[1]</a>
|
||||
Since the visitor parameter is passed by value, if your visitor
|
||||
contains state then any changes to the state during the algorithm
|
||||
will be made to a copy of the visitor object, not the visitor object
|
||||
passed in. Therefore you may want the visitor to hold this state by
|
||||
pointer or reference.
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
||||
@@ -0,0 +1,231 @@
|
||||
/*
|
||||
:Author: David Goodger
|
||||
:Contact: goodger@users.sourceforge.net
|
||||
:date: $Date$
|
||||
:version: $Revision$
|
||||
:copyright: This stylesheet has been placed in the public domain.
|
||||
|
||||
Default cascading style sheet for the HTML output of Docutils.
|
||||
|
||||
-- Copyright (c) 2005 Trustees of Indiana University
|
||||
|
||||
Distributed under the Boost Software License, Version 1.0.
|
||||
(See accompanying file LICENSE_1_0.txt or copy at
|
||||
http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
*/
|
||||
|
||||
.first {
|
||||
margin-top: 0 }
|
||||
|
||||
.last {
|
||||
margin-bottom: 0 }
|
||||
|
||||
a.toc-backref {
|
||||
text-decoration: none ;
|
||||
color: black }
|
||||
|
||||
dd {
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
div.abstract {
|
||||
margin: 2em 5em }
|
||||
|
||||
div.abstract p.topic-title {
|
||||
font-weight: bold ;
|
||||
text-align: center }
|
||||
|
||||
div.attention, div.caution, div.danger, div.error, div.hint,
|
||||
div.important, div.note, div.tip, div.warning, div.admonition {
|
||||
margin: 2em ;
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.attention p.admonition-title, div.caution p.admonition-title,
|
||||
div.danger p.admonition-title, div.error p.admonition-title,
|
||||
div.warning p.admonition-title {
|
||||
color: red ;
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
div.hint p.admonition-title, div.important p.admonition-title,
|
||||
div.note p.admonition-title, div.tip p.admonition-title,
|
||||
div.admonition p.admonition-title {
|
||||
font-weight: bold ;
|
||||
font-family: sans-serif }
|
||||
|
||||
div.dedication {
|
||||
margin: 2em 5em ;
|
||||
text-align: center ;
|
||||
font-style: italic }
|
||||
|
||||
div.dedication p.topic-title {
|
||||
font-weight: bold ;
|
||||
font-style: normal }
|
||||
|
||||
div.figure {
|
||||
margin-left: 2em }
|
||||
|
||||
div.footer, div.header {
|
||||
font-size: smaller }
|
||||
|
||||
div.sidebar {
|
||||
margin-left: 1em ;
|
||||
border: medium outset ;
|
||||
padding: 0em 1em ;
|
||||
background-color: #ffffee ;
|
||||
width: 40% ;
|
||||
float: right ;
|
||||
clear: right }
|
||||
|
||||
div.sidebar p.rubric {
|
||||
font-family: sans-serif ;
|
||||
font-size: medium }
|
||||
|
||||
div.system-messages {
|
||||
margin: 5em }
|
||||
|
||||
div.system-messages h1 {
|
||||
color: red }
|
||||
|
||||
div.system-message {
|
||||
border: medium outset ;
|
||||
padding: 1em }
|
||||
|
||||
div.system-message p.system-message-title {
|
||||
color: red ;
|
||||
font-weight: bold }
|
||||
|
||||
div.topic {
|
||||
margin: 2em }
|
||||
|
||||
h1.title {
|
||||
text-align: center }
|
||||
|
||||
h2.subtitle {
|
||||
text-align: center }
|
||||
|
||||
hr {
|
||||
width: 75% }
|
||||
|
||||
ol.simple, ul.simple {
|
||||
margin-bottom: 1em }
|
||||
|
||||
ol.arabic {
|
||||
list-style: decimal }
|
||||
|
||||
ol.loweralpha {
|
||||
list-style: lower-alpha }
|
||||
|
||||
ol.upperalpha {
|
||||
list-style: upper-alpha }
|
||||
|
||||
ol.lowerroman {
|
||||
list-style: lower-roman }
|
||||
|
||||
ol.upperroman {
|
||||
list-style: upper-roman }
|
||||
|
||||
p.attribution {
|
||||
text-align: right ;
|
||||
margin-left: 50% }
|
||||
|
||||
p.caption {
|
||||
font-style: italic }
|
||||
|
||||
p.credits {
|
||||
font-style: italic ;
|
||||
font-size: smaller }
|
||||
|
||||
p.label {
|
||||
white-space: nowrap }
|
||||
|
||||
p.rubric {
|
||||
font-weight: bold ;
|
||||
font-size: larger ;
|
||||
color: maroon ;
|
||||
text-align: center }
|
||||
|
||||
p.sidebar-title {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold ;
|
||||
font-size: larger }
|
||||
|
||||
p.sidebar-subtitle {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
p.topic-title {
|
||||
font-weight: bold }
|
||||
|
||||
pre.address {
|
||||
margin-bottom: 0 ;
|
||||
margin-top: 0 ;
|
||||
font-family: serif ;
|
||||
font-size: 100% }
|
||||
|
||||
pre.line-block {
|
||||
font-family: serif ;
|
||||
font-size: 100% }
|
||||
|
||||
pre.literal-block, pre.doctest-block {
|
||||
margin-left: 2em ;
|
||||
margin-right: 2em ;
|
||||
background-color: #eeeeee }
|
||||
|
||||
span.classifier {
|
||||
font-family: sans-serif ;
|
||||
font-style: oblique }
|
||||
|
||||
span.classifier-delimiter {
|
||||
font-family: sans-serif ;
|
||||
font-weight: bold }
|
||||
|
||||
span.interpreted {
|
||||
font-family: sans-serif }
|
||||
|
||||
span.option {
|
||||
white-space: nowrap }
|
||||
|
||||
span.option-argument {
|
||||
font-style: italic }
|
||||
|
||||
span.pre {
|
||||
white-space: pre }
|
||||
|
||||
span.problematic {
|
||||
color: red }
|
||||
|
||||
table {
|
||||
margin-top: 0.5em ;
|
||||
margin-bottom: 0.5em }
|
||||
|
||||
table.citation {
|
||||
border-left: solid thin gray ;
|
||||
padding-left: 0.5ex }
|
||||
|
||||
table.docinfo {
|
||||
margin: 2em 4em }
|
||||
|
||||
table.footnote {
|
||||
border-left: solid thin black ;
|
||||
padding-left: 0.5ex }
|
||||
|
||||
td, th {
|
||||
padding-left: 0.5em ;
|
||||
padding-right: 0.5em ;
|
||||
vertical-align: top }
|
||||
|
||||
th.docinfo-name, th.field-name {
|
||||
font-weight: bold ;
|
||||
text-align: left ;
|
||||
white-space: nowrap }
|
||||
|
||||
h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
|
||||
font-size: 100% }
|
||||
|
||||
tt {
|
||||
background-color: #eeeeee }
|
||||
|
||||
ul.auto-toc {
|
||||
list-style-type: none }
|
||||
@@ -2,117 +2,232 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. We make no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Depth-First Search</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1><A NAME="sec:depth-first-search"></A>
|
||||
<H1><A NAME="sec:depth-first-search"></A><img src="figs/python.gif" alt="(Python)"/>
|
||||
<TT>depth_first_search</TT>
|
||||
</H1>
|
||||
|
||||
<P>
|
||||
<DIV ALIGN="LEFT">
|
||||
<TABLE CELLPADDING=3 border>
|
||||
|
||||
<TR><TH ALIGN="LEFT"><B>Graphs:</B></TH>
|
||||
<TD ALIGN="LEFT">directed and undirected</TD>
|
||||
</TR>
|
||||
|
||||
<TR><TH ALIGN="LEFT"><B>Properties:</B></TH>
|
||||
<TD ALIGN="LEFT">color</TD>
|
||||
</TR>
|
||||
|
||||
<TR><TH ALIGN="LEFT"><B>Complexity:</B></TH>
|
||||
<TD ALIGN="LEFT">time: <i>O(V + E)</i></TD>
|
||||
</TR>
|
||||
|
||||
<TR><TH ALIGN="LEFT"><B>Where Defined:</B></TH>
|
||||
<TD ALIGN="LEFT">
|
||||
<a href="../../../boost/graph/depth_first_search.hpp"><TT>boost/graph/depth_first_search.hpp</TT></a>
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
</TABLE>
|
||||
</DIV>
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
(1)
|
||||
template <class <a href="./VertexListGraph.html">VertexListGraph</a>, class <a href="./DFSVisitor.html">DFSVisitor</a>>
|
||||
void depth_first_search(VertexListGraph& G, DFSVisitor v);
|
||||
<i>// named parameter version</i>
|
||||
template <class Graph, class class P, class T, class R>
|
||||
void depth_first_search(Graph& G,
|
||||
const bgl_named_params<P, T, R>& params);
|
||||
|
||||
<i>// non-named parameter version</i>
|
||||
template <class Graph, class <a href="DFSVisitor.html">DFSVisitor</a>, class ColorMap>
|
||||
void depth_first_search(const Graph& g, DFSVisitor vis, ColorMap color)
|
||||
|
||||
template <class Graph, class <a href="DFSVisitor.html">DFSVisitor</a>, class ColorMap>
|
||||
void depth_first_search(const Graph& g, DFSVisitor vis, ColorMap color,
|
||||
typename graph_traits<Graph>::vertex_descriptor start)
|
||||
|
||||
(2)
|
||||
template <class <a href="./VertexListGraph.html">VertexListGraph</a>, class <a href="./DFSVisitor.html">DFSVisitor</a>, class <a href="#ColorMap">ColorMap</a>>
|
||||
void depth_first_search(VertexListGraph& G, DFSVisitor v, ColorMap c);
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
The <TT>depth_first_search()</TT> algorithm performs a depth-first
|
||||
search (DFS) on a graph, invoking the methods of the graph search
|
||||
visitor at the appropriate event-points. A depth-first search visits
|
||||
all the vertices in a graph, starting with some arbitrary vertex and
|
||||
then always choosing the next adjacent unvisited vertex. Once the DFS
|
||||
reaches a vertex with no unvisited neighbors it backtracks to one of
|
||||
the previous vertices and continues from there. Once all of the
|
||||
vertices in the same connected component have been visited, another
|
||||
arbitrary unvisited vertex is choosen and the depth-first search
|
||||
resumes. A more detailed explanation of DFS is given in Section <A
|
||||
HREF="./graph_theory_review.html#sec:dfs-algorithm">Depth-First
|
||||
Search</A>. The depth-first exploration of each connected component is
|
||||
implemented by the function <a
|
||||
href="./depth_first_visit.html"><tt>depth_first_visit()</tt></a>.
|
||||
|
||||
<p>
|
||||
The <tt>depth_first_search()</tt> function performs a depth-first
|
||||
traversal of the vertices in a directed graph. When
|
||||
possible, a depth-first traversal chooses a vertex adjacent to the
|
||||
current vertex to visit next. If all adjacent vertices have already
|
||||
been discovered, or there are no adjacent vertices, then the algorithm
|
||||
backtracks to the last vertex that had undiscovered neighbors. Once
|
||||
all reachable vertices have been visited, the algorithm selects from
|
||||
any remaining undiscovered vertices and continues the traversal. The
|
||||
algorithm finishes when all vertices have been visited. Depth-first
|
||||
search is useful for categorizing edges in a graph, and for imposing
|
||||
an ordering on the vertices. Section <a
|
||||
href="./graph_theory_review.html#sec:dfs-algorithm">Depth-First
|
||||
Search</a> describes the various properties of DFS and walks through
|
||||
an example.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The <tt>DFSVisitor</tt> supplied by the user determines what
|
||||
actions are taken at each event-point within the algorithm.
|
||||
Similar to BFS, color markers are used to keep track of which vertices
|
||||
have been discovered. White marks vertices that have yet to be
|
||||
discovered, gray marks a vertex that is discovered but still has
|
||||
vertices adjacent to it that are undiscovered. A black vertex is
|
||||
discovered vertex that is not adjacent to any white vertices.
|
||||
<p>
|
||||
|
||||
<p>
|
||||
The <tt>ColorMap</tt> is used by the algorithm to keep track
|
||||
of which vertices have been visited.
|
||||
The <tt>depth_first_search()</tt> function invokes user-defined
|
||||
actions at certain event-points within the algorithm. This provides a
|
||||
mechanism for adapting the generic DFS algorithm to the many
|
||||
situations in which it can be used. In the pseudo-code below, the
|
||||
event points for DFS are the labels on
|
||||
the right. The user-defined actions must be provided in the form of a
|
||||
visitor object, that is, an object whose type meets the requirements
|
||||
for a <a href="./DFSVisitor.html">DFS Visitor</a>. In the pseudo-code
|
||||
we show the algorithm computing predecessors <i>p</i>, discover time
|
||||
<i>d</i> and finish time <i>t</i>. By default, the
|
||||
<tt>depth_first_search()</tt> function does not compute these
|
||||
properties, however there are pre-defined visitors such as <a
|
||||
href="./predecessor_recorder.html"><tt>predecessor_recorder</tt></a>
|
||||
and <a href="./time_stamper.html"><tt>time_stamper</tt></a> that can
|
||||
be used to do this.
|
||||
</p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>
|
||||
DFS(<i>G</i>)
|
||||
<b>for</b> each vertex <i>u in V</i>
|
||||
<i>color[u] :=</i> WHITE
|
||||
<i>p[u] = u</i>
|
||||
<b>end for</b>
|
||||
<i>time := 0</i>
|
||||
<b>if</b> there is a starting vertex <i>s</i>
|
||||
<b>call</b> DFS-VISIT(<i>G</i>, <i>s</i>)
|
||||
<b>for</b> each vertex <i>u in V</i>
|
||||
<b>if</b> <i>color[u] =</i> WHITE
|
||||
<b>call</b> DFS-VISIT(<i>G</i>, <i>u</i>)
|
||||
<b>end for</b>
|
||||
return (<i>p</i>,<i>d_time</i>,<i>f_time</i>) <br>
|
||||
DFS-VISIT(<i>G</i>, <i>u</i>)
|
||||
<i>color[u] :=</i> GRAY
|
||||
<i>d_time[u] := time := time + 1</i>
|
||||
<b>for</b> each <i>v in Adj[u]</i>
|
||||
<b>if</b> (<i>color[v] =</i> WHITE)
|
||||
<i>p[v] = u</i>
|
||||
<b>call</b> DFS-VISIT(<i>G</i>, <i>v</i>)
|
||||
<b>else if</b> (<i>color[v] =</i> GRAY)
|
||||
<i>...</i>
|
||||
<b>else if</b> (<i>color[v] =</i> BLACK)
|
||||
<i>...</i>
|
||||
<b>end for</b>
|
||||
<i>color[u] :=</i> BLACK
|
||||
<i>f_time[u] := time := time + 1</i>
|
||||
<pre>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<pre>
|
||||
-
|
||||
-
|
||||
initialize vertex <i>u</i>
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
start vertex <i>s</i>
|
||||
-
|
||||
-
|
||||
start vertex <i>u</i>
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
discover vertex <i>u</i>
|
||||
-
|
||||
examine edge <i>(u,v)</i>
|
||||
-
|
||||
<i>(u,v)</i> is a tree edge
|
||||
-
|
||||
-
|
||||
<i>(u,v)</i> is a back edge
|
||||
-
|
||||
<i>(u,v)</i> is a cross or forward edge
|
||||
-
|
||||
finish vertex <i>u</i>
|
||||
-
|
||||
</pre>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
<H3>Where Defined</H3>
|
||||
|
||||
<P>
|
||||
DFS is used as the kernel for several other graph algorithms,
|
||||
including <a
|
||||
href="./topological_sort.html"><tt>topological_sort</tt></a> and two
|
||||
of the connected component algorithms.
|
||||
<a href="../../../boost/graph/depth_first_search.hpp"><TT>boost/graph/depth_first_search.hpp</TT></a>
|
||||
|
||||
<P>
|
||||
<h3>Parameters</h3>
|
||||
|
||||
<H3>Requirements on Types</H3>
|
||||
IN: <tt>Graph& g</tt>
|
||||
<blockquote>
|
||||
A directed graph. The graph type must
|
||||
be a model of <a href="./IncidenceGraph.html">Incidence Graph</a>
|
||||
and <a href="./VertexListGraph.html">Vertex List Graph</a>.<br>
|
||||
|
||||
<P>
|
||||
<b>Python</b>: The parameter is named <tt>graph</tt>.
|
||||
</blockquote>
|
||||
|
||||
<UL>
|
||||
<LI>The type <TT>VertexListGraph</TT> must be a model of <a
|
||||
href="./VertexListGraph.html">VertexListGraph</a>.
|
||||
</LI>
|
||||
<LI>In version (1) of the algorithm the graph must be a model of <a
|
||||
href="./PropertyGraph.html">PropertyGraph</a> for
|
||||
<TT>vertex_color_t</TT> and the color property map for the graph
|
||||
must meet the same requirements as <TT>ColorMap</TT>.
|
||||
</LI>
|
||||
<LI><a name="ColorMap">The type <TT>ColorMap</TT> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">ReadWritePropertyMap</a>. The key type of <tt>ColorMap</tt> must be the vertex descriptor type for the graph and the value type of <TT>ColorMap</TT> must be a model of
|
||||
<a href="./ColorValue.html">ColorValue</a>.</a>
|
||||
</LI>
|
||||
<LI>The <tt>DFSVisitor</tt> type must be a model of <a
|
||||
href="./DFSVisitor.html">DFSVisitor</a>.
|
||||
</LI>
|
||||
</UL>
|
||||
|
||||
<h3>Named Parameters</h3>
|
||||
|
||||
IN: <tt>visitor(DFSVisitor vis)</tt>
|
||||
<blockquote>
|
||||
A visitor object that is invoked inside the algorithm at the
|
||||
event-points specified by the <a href="./DFSVisitor.html">DFS
|
||||
Visitor</a> concept. The visitor object is passed by value <a
|
||||
href="#1">[1]</a>. <br> <b>Default:</b>
|
||||
<tt>dfs_visitor<null_visitor></tt><br>
|
||||
|
||||
<b>Python</b>: The parameter should be an object that derives from
|
||||
the <a href="DFSVisitor.html#python"><tt>DFSVisitor</tt></a> type of
|
||||
the graph.
|
||||
</blockquote>
|
||||
|
||||
UTIL/OUT: <tt>color_map(ColorMap color)</tt>
|
||||
<blockquote>
|
||||
This is used by the algorithm to keep track of its progress through
|
||||
the graph. The type <tt>ColorMap</tt> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a> and its key type must be the graph's vertex
|
||||
descriptor type and the value type of the color map must model
|
||||
<a href="./ColorValue.html">ColorValue</a>.<br>
|
||||
<b>Default:</b> an <a
|
||||
href="../../property_map/iterator_property_map.html">
|
||||
</tt>iterator_property_map</tt></a> created from a
|
||||
<tt>std::vector</tt> of <tt>default_color_type</tt> of size
|
||||
<tt>num_vertices(g)</tt> and using the <tt>i_map</tt> for the index
|
||||
map.<br>
|
||||
|
||||
<b>Python</b>: The color map must be a <tt>vertex_color_map</tt> for
|
||||
the graph.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>root_vertex(typename
|
||||
graph_traits<VertexListGraph>::vertex_descriptor start)</tt>
|
||||
<blockquote>
|
||||
This specifies the vertex that the depth-first search should
|
||||
originate from. The type is the type of a vertex descriptor for the
|
||||
given graph.<br>
|
||||
<b>Default:</b> <tt>*vertices(g).first</tt><br>
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>vertex_index_map(VertexIndexMap i_map)</tt>
|
||||
<blockquote>
|
||||
This maps each vertex to an integer in the range <tt>[0,
|
||||
num_vertices(g))</tt>. This parameter is only necessary when the
|
||||
default color property map is used. The type <tt>VertexIndexMap</tt>
|
||||
must be a model of <a
|
||||
href="../../property_map/ReadablePropertyMap.html">Readable Property
|
||||
Map</a>. The value type of the map must be an integer type. The
|
||||
vertex descriptor type of the graph needs to be usable as the key
|
||||
type of the map.<br>
|
||||
|
||||
<b>Default:</b> <tt>get(vertex_index, g)</tt>.
|
||||
Note: if you use this default, make sure your graph has
|
||||
an internal <tt>vertex_index</tt> property. For example,
|
||||
<tt>adjacenty_list</tt> with <tt>VertexList=listS</tt> does
|
||||
not have an internal <tt>vertex_index</tt> property.<br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
<P>
|
||||
|
||||
@@ -125,98 +240,74 @@ The time complexity is <i>O(E + V)</i>.
|
||||
|
||||
<P>
|
||||
|
||||
<h3>Visitor Event Points</h3>
|
||||
|
||||
<ul>
|
||||
|
||||
<li><b><tt>vis.initialize_vertex(s, g)</tt></b> is invoked on every
|
||||
vertex of the graph before the start of the graph search.
|
||||
|
||||
<li><b><tt>vis.start_vertex(s, g)</tt></b> is invoked on the source
|
||||
vertex once before the start of the search.
|
||||
|
||||
<li><b><tt>vis.discover_vertex(u, g)</tt></b> is invoked when a vertex
|
||||
is encountered for the first time.
|
||||
|
||||
<li><b><tt>vis.examine_edge(e, g)</tt></b> is invoked on every out-edge
|
||||
of each vertex after it is discovered.
|
||||
|
||||
<li><b><tt>vis.tree_edge(e, g)</tt></b> is invoked on each edge as it
|
||||
becomes a member of the edges that form the search tree. If you
|
||||
wish to record predecessors, do so at this event point.
|
||||
|
||||
<li><b><tt>vis.back_edge(e, g)</tt></b> is invoked on the back edges in
|
||||
the graph.
|
||||
|
||||
<li><b><tt>vis.forward_or_cross_edge(e, g)</tt></b> is invoked on
|
||||
forward or cross edges in the graph. In an undirected graph this
|
||||
method is never called.
|
||||
|
||||
<li><b><tt>vis.finish_vertex(u, g)</tt></b> is invoked on a vertex after
|
||||
all of its out edges have been added to the search tree and all of
|
||||
the adjacent vertices have been discovered (but before their
|
||||
out-edges have been examined).
|
||||
|
||||
</ul>
|
||||
|
||||
|
||||
<H3>Example</H3>
|
||||
|
||||
<P>
|
||||
This example shows DFS applied to the graph in <A
|
||||
HREF="./graph_theory_review.html#fig:dfs-example">Figure 1</A>. The
|
||||
source code for this example is in <a
|
||||
href="../example/dfs_basics.cpp"><TT>examples/dfs_basics.cpp</TT></a>.
|
||||
|
||||
<P>
|
||||
<p></p>
|
||||
<DIV ALIGN="CENTER"><A NAME="fig:dfs-example"></A></A>
|
||||
<TABLE>
|
||||
<CAPTION ALIGN="BOTTOM"><STRONG>Figure 1:</STRONG>
|
||||
Depth-first search spreading through a graph.
|
||||
</CAPTION>
|
||||
<TR><TD><IMG SRC="./figs/dfs_example.gif" width="166" height="91"></TD></TR>
|
||||
</TABLE>
|
||||
</DIV>
|
||||
<p></p>
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
// Select the graph type we wish to use
|
||||
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS> Graph;
|
||||
// Set up the vertex names
|
||||
enum { u, v, w, x, y, z, N };
|
||||
char name[] = { 'u', 'v', 'w', 'x', 'y', 'z' };
|
||||
// Specify the edges in the graph
|
||||
typedef std::pair<int,int> E;
|
||||
E edge_array[] = { E(u,v), E(u,x), E(x,v), E(y,x),
|
||||
E(v,y), E(w,y), E(w,z), E(z,z) };
|
||||
Graph G(N, edge_array, edge_array + sizeof(edge_array)/sizeof(E));
|
||||
|
||||
// Some typedef's to save a little typing
|
||||
typedef boost::graph_traits<Graph>::vertex_descriptor Vertex;
|
||||
typedef boost::graph_traits<Graph>::vertices_size_type size_type;
|
||||
typedef std::vector<Vertex>::iterator Piter;
|
||||
typedef std::vector<size_type>::iterator Iiter;
|
||||
|
||||
// color, discover time, and finish time properties
|
||||
std::vector<default_color_type> color(num_vertices(G));
|
||||
std::vector<size_type> dtime(num_vertices(G));
|
||||
std::vector<size_type> ftime(num_vertices(G));
|
||||
|
||||
boost::depth_first_search(G, boost::visit_timestamp(dtime.begin(), ftime.begin()),
|
||||
color.begin());
|
||||
|
||||
// use std::sort to order the vertices by their discover time
|
||||
std::vector<size_type> discover_order(N);
|
||||
boost::iota(discover_order.begin(), discover_order.end(), 0);
|
||||
std::sort(discover_order.begin(), discover_order.end(),
|
||||
boost::indirect_cmp<Iiter, std::less<size_type> >(dtime.begin()));
|
||||
|
||||
std::cout << "order of discovery: ";
|
||||
for (int i = 0; i < N; ++i)
|
||||
std::cout << name[ discover_order[i] ] << " ";
|
||||
|
||||
std::vector<size_type> finish_order(N);
|
||||
boost::iota(finish_order.begin(), finish_order.end(), 0);
|
||||
std::sort(finish_order.begin(), finish_order.end(),
|
||||
boost::indirect_cmp<Iiter, std::less<size_type> >(ftime.begin()));
|
||||
|
||||
std::cout << endl << "order of finish: ";
|
||||
for (size_type i = 0; i < N; ++i)
|
||||
std::cout << name[ finish_order[i] ] << " ";
|
||||
std::cout << std::endl;
|
||||
</PRE>
|
||||
The output is:
|
||||
<PRE>
|
||||
order of discovery: u v y x w z
|
||||
order of finish: x y v u z w
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
The example in <a href="../example/dfs-example.cpp">
|
||||
<TT>examples/dfs-example.cpp</TT></a> shows DFS applied to the graph in
|
||||
<A HREF="./graph_theory_review.html#fig:dfs-example">Figure 1</A>.
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
<a href="./depth_first_visit.html"><tt>depth_first_visit</tt></a>
|
||||
<a href="./undirected_dfs.html"><tt>undirected_dfs</tt></a>
|
||||
|
||||
<h3>Notes</h3>
|
||||
|
||||
<p><a name="1">[1]</a>
|
||||
Since the visitor parameter is passed by value, if your visitor
|
||||
contains state then any changes to the state during the algorithm
|
||||
will be made to a copy of the visitor object, not the visitor object
|
||||
passed in. Therefore you may want the visitor to hold this state by
|
||||
pointer or reference.
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,58 +2,37 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Depth-First Visit</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H2><A NAME="sec:dfs"></A>
|
||||
<img src="figs/python.gif" alt="(Python)"/>
|
||||
<TT>depth_first_visit</TT>
|
||||
</H2>
|
||||
|
||||
<P>
|
||||
<DIV ALIGN="LEFT">
|
||||
<TABLE CELLPADDING=3 border>
|
||||
|
||||
<TR><TH ALIGN="LEFT"><B>Graphs:</B></TH>
|
||||
<TD ALIGN="LEFT">directed and undirected</TD>
|
||||
</TR>
|
||||
|
||||
<TR><TH ALIGN="LEFT"><B>Properties:</B></TH>
|
||||
<TD ALIGN="LEFT">color</TD>
|
||||
</TR>
|
||||
|
||||
<TR><TH ALIGN="LEFT"><B>Complexity:</B></TH>
|
||||
<TD ALIGN="LEFT">time: <i>O(E)</i></TD>
|
||||
</TR>
|
||||
|
||||
<TR><TH ALIGN="LEFT"><B>Where Defined:</B></TH>
|
||||
<TD ALIGN="LEFT">
|
||||
<a href="../../../boost/graph/depth_first_search.hpp"><TT>boost/graph/depth_first_search.hpp</TT></a>
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
</TABLE>
|
||||
</DIV>
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
template <class <a href="./IncidenceGraph.html">IncidenceGraph</a>, class <a href="./DFSVisitor.html">DFSVisitor</a>, class <a href="#ColorMap">ColorMap</a>>
|
||||
template <class <a href="./IncidenceGraph.html">IncidenceGraph</a>, class <a href="./DFSVisitor.html">DFSVisitor</a>, class ColorMap>
|
||||
void depth_first_visit(IncidenceGraph& g,
|
||||
typename graph_traits<IncidenceGraph>::vertex_descriptor s,
|
||||
DFSVisitor& vis, ColorMap color)
|
||||
|
||||
template <class <a href="./IncidenceGraph.html">IncidenceGraph</a>, class <a href="./DFSVisitor.html">DFSVisitor</a>, class ColorMap,
|
||||
class TerminatorFunc>
|
||||
void depth_first_visit(IncidenceGraph& g,
|
||||
typename graph_traits<IncidenceGraph>::vertex_descriptor s,
|
||||
DFSVisitor& vis, ColorMap color, TerminatorFunc func = TerminatorFunc())
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
@@ -72,35 +51,93 @@ actions are taken at each event-point within the algorithm.
|
||||
The <tt>ColorMap</tt> is used by the algorithm to keep track
|
||||
of which vertices have been visited.
|
||||
|
||||
<P>
|
||||
<p>The second variant can be used, for example, to find all marked vertices
|
||||
reachable from a start vertex by a path which does not contain any another
|
||||
marked vertices.
|
||||
|
||||
<H3>Requirements on Types</H3>
|
||||
|
||||
<P>
|
||||
|
||||
<UL>
|
||||
<LI>The type <TT>IncidenceGraph</TT> must be a model of
|
||||
<a href="./IncidenceGraph.html">IncidenceGraph</a>.
|
||||
</LI>
|
||||
<LI>The type <TT>DFSVisitor</TT> must be a model of <a
|
||||
href="./DFSVisitor.html">DFSVisitor</a>.
|
||||
</LI>
|
||||
<LI><a name="ColorMap">The type <TT>ColorMap</TT> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">ReadWritePropertyMap</a>. The key type of <tt>ColorMap</tt> must be the vertex descriptor type for the graph and the value type of <TT>ColorMap</TT> must be a model of
|
||||
<a href="./ColorValue.html">ColorValue</a>.</a>
|
||||
</LI>
|
||||
<h3>Where Defined:</h3>
|
||||
|
||||
</UL>
|
||||
<a href="../../../boost/graph/depth_first_search.hpp"><TT>boost/graph/depth_first_search.hpp</TT></a>
|
||||
|
||||
|
||||
<h3>Parameters</h3>
|
||||
|
||||
IN <tt>IncidenceGraph& g</tt>
|
||||
<blockquote>
|
||||
A directed or undirected graph. The graph's type must be a model of
|
||||
<a href="./IncidenceGraph.html">Incidence Graph</a>.<br>
|
||||
|
||||
<b>Python</b>: The parameter is named <tt>graph</tt>.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>vertex_descriptor s</tt>
|
||||
<blockquote>
|
||||
The source vertex from which to start the search.<br>
|
||||
|
||||
<b>Python</b>: The parameter is named <tt>root_vertex</tt>.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>DFSVisitor visitor</tt>
|
||||
<blockquote>
|
||||
A visitor object that is invoked inside the algorithm at the
|
||||
event-points specified by the <a href="./DFSVisitor.html">DFS
|
||||
Visitor</a> concept. The visitor object is passed by value <a
|
||||
href="#1">[1]</a>.<br>
|
||||
|
||||
<b>Python</b>: The parameter should be an object that derives from
|
||||
the <a href="DFSVisitor.html#python"><tt>DFSVisitor</tt></a> type of
|
||||
the graph.
|
||||
</blockquote>
|
||||
|
||||
UTIL: <tt>ColorMap color</tt>
|
||||
<blockquote>
|
||||
This is used by the algorithm to keep track of its progress through
|
||||
the graph. The type <tt>ColorMap</tt> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a> and its key type must be the graph's vertex
|
||||
descriptor type and the value type of the color map map must model
|
||||
<a href="./ColorValue.html">Color Value</a>.<br>
|
||||
|
||||
<b>Python</b>: The color map must be a <tt>vertex_color_map</tt> for
|
||||
the graph.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>TerminatorFunc func</tt>
|
||||
<blockquote>
|
||||
A function object callable with two parameters - the descriptor of
|
||||
vertex and the graph instance - and returning bool. The call is made
|
||||
immediately after call to 'discover_vertex' visitor
|
||||
event. If <tt>true</tt> is returned, the out edges of the vertex are
|
||||
not examined, as if they don't exist.<br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
<P>
|
||||
|
||||
<h3>Complexity</h3>
|
||||
|
||||
Time complexity is <i>O(E)</i>.
|
||||
|
||||
|
||||
<h3>Notes</h3>
|
||||
|
||||
<p><a name="1">[1]</a>
|
||||
Since the visitor parameter is passed by value, if your visitor
|
||||
contains state then any changes to the state during the algorithm
|
||||
will be made to a copy of the visitor object, not the visitor object
|
||||
passed in. Therefore you may want the visitor to hold this state by
|
||||
pointer or reference.
|
||||
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. We make no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: dfs_visitor</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -101,14 +97,14 @@ and <a href="./property_writer.html"><tt>property_writer</tt></a>.
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,234 +2,441 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Jeremy Siek makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Dijkstra's Shortest Paths</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1><A NAME="sec:dijkstra"></A>
|
||||
<H1><A NAME="sec:dijkstra"></A><img src="figs/python.gif" alt="(Python)"/>
|
||||
<TT>dijkstra_shortest_paths</TT>
|
||||
</H1>
|
||||
|
||||
<P>
|
||||
<DIV ALIGN="left">
|
||||
<TABLE CELLPADDING=3 border>
|
||||
<TR><TH ALIGN="LEFT"><B>Graphs:</B></TH>
|
||||
<TD ALIGN="LEFT">directed and undirected</TD>
|
||||
</TR>
|
||||
<TR><TH ALIGN="LEFT"><B>Properties:</B></TH>
|
||||
<TD ALIGN="LEFT">color, distance, weight, vertex index</TD>
|
||||
</TR>
|
||||
<TR><TH ALIGN="LEFT"><B>Complexity:</B></TH>
|
||||
<TD ALIGN="LEFT"><i>O((V + E) log V)</i>
|
||||
</TD>
|
||||
</TR>
|
||||
<TR><TH ALIGN="LEFT"><B>Where Defined:</B></TH>
|
||||
<TD ALIGN="LEFT">
|
||||
<a href="../../../boost/graph/dijkstra_shortest_paths.hpp"><TT>boost/graph/dijkstra_shortest_paths.hpp</TT></a>
|
||||
</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
</DIV>
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
(1)
|
||||
template <class <a href="./VertexListGraph.html">VertexListGraph</a>>
|
||||
<i>// named parameter version</i>
|
||||
template <typename Graph, typename P, typename T, typename R>
|
||||
void
|
||||
dijkstra_shortest_paths(VertexListGraph& g,
|
||||
typename graph_traits<VertexListGraph>::vertex_descriptor s);
|
||||
dijkstra_shortest_paths(Graph& g,
|
||||
typename graph_traits<Graph>::vertex_descriptor s,
|
||||
const bgl_named_params<P, T, R>& params);
|
||||
|
||||
(2)
|
||||
template <class <a href="./VertexListGraph.html">VertexListGraph</a>, class <a href="#DistanceMap">DistanceMap</a>>
|
||||
void
|
||||
dijkstra_shortest_paths(VertexListGraph& g,
|
||||
typename graph_traits<VertexListGraph>::vertex_descriptor s,
|
||||
DistanceMap d);
|
||||
|
||||
(3)
|
||||
template <class <a href="./VertexListGraph.html">VertexListGraph</a>, class <a href="#DistanceMap">DistanceMap</a>, class <a href="./UniformCostVisitor.html">UniformCostVisitor</a>>
|
||||
void
|
||||
dijkstra_shortest_paths(VertexListGraph& g,
|
||||
typename graph_traits<VertexListGraph>::vertex_descriptor s,
|
||||
DistanceMap d, UniformCostVisitor visit);
|
||||
|
||||
(4)
|
||||
template <class <a href="./VertexListGraph.html">VertexListGraph</a>, class <a href="./UniformCostVisitor.html">UniformCostVisitor</a>,
|
||||
class <a href="#DistanceMap">DistanceMap</a>, class <a href="#WeightMap">WeightMap</a>, class <a href="#ColorMap">ColorMap</a>, class <a href="#VertexIndexMap">VertexIndexMap</a>>
|
||||
void
|
||||
dijkstra_shortest_paths(VertexListGraph& g,
|
||||
typename graph_traits<VertexListGraph>::vertex_descriptor s,
|
||||
DistanceMap distance, WeightMap weight, ColorMap color, VertexIndexMap id,
|
||||
UniformCostVisitor vis);
|
||||
<i>// non-named parameter version</i>
|
||||
template <typename Graph, typename <a href="DijkstraVisitor.html">DijkstraVisitor</a>,
|
||||
typename PredecessorMap, typename DistanceMap,
|
||||
typename WeightMap, typename VertexIndexMap, typename <a href="http://www.sgi.com/tech/stl/BinaryPredicate.html">CompareFunction</a>, typename <a href="http://www.sgi.com/tech/stl/BinaryFunction.html">CombineFunction</a>,
|
||||
typename DistInf, typename DistZero, typename ColorMap = <i>default</i>>
|
||||
void dijkstra_shortest_paths
|
||||
(const Graph& g,
|
||||
typename graph_traits<Graph>::vertex_descriptor s,
|
||||
PredecessorMap predecessor, DistanceMap distance, WeightMap weight,
|
||||
VertexIndexMap index_map,
|
||||
CompareFunction compare, CombineFunction combine, DistInf inf, DistZero zero,
|
||||
DijkstraVisitor vis, ColorMap color = <i>default</i>)
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
This is the modified Dijkstra algorithm [<A
|
||||
HREF="bibliography.html#dijkstra59">10</A>,<A
|
||||
HREF="bibliography.html#clr90">8</A>] which solves the single-source
|
||||
shortest-paths problem on a weighted, directed graph for the case
|
||||
where all edge weights are nonnegative. See Section <A
|
||||
HREF="graph_theory_review.html#sec:shortest-path-algorithms">Shortest-Paths Algorithms</A>
|
||||
for some background to the shortest-path problem. The priority queue
|
||||
used inside the algorithm is implemented with a heap for efficiency.
|
||||
This algorithm [<A HREF="bibliography.html#dijkstra59">10</A>,<A
|
||||
HREF="bibliography.html#clr90">8</A>] solves the single-source
|
||||
shortest-paths problem on a weighted, directed or undirected graph for
|
||||
the case where all edge weights are nonnegative. Use the Bellman-Ford
|
||||
algorithm for the case when some edge weights are negative. Use
|
||||
breadth-first search instead of Dijkstra's algorithm when all edge
|
||||
weights are equal to one. For the definition of the shortest-path
|
||||
problem see Section <A
|
||||
HREF="graph_theory_review.html#sec:shortest-paths-algorithms">Shortest-Paths
|
||||
Algorithms</A> for some background to the shortest-path problem.
|
||||
</P>
|
||||
|
||||
<P>
|
||||
There are four versions of the algorithm to accommodate whether the
|
||||
necessary graph properties will be supplied by the graph object or
|
||||
externally via a argument to this function. The properties needed by
|
||||
the algorithm are distance, weight, color, and vertex index. Version 3
|
||||
and 4 of the algorithm also include a visitor argument for added
|
||||
extensibility.
|
||||
There are two main options for obtaining output from the
|
||||
<tt>dijkstra_shortest_paths()</tt> function. If you provide a
|
||||
distance property map through the <tt>distance_map()</tt> parameter
|
||||
then the shortest distance from the source vertex to every other
|
||||
vertex in the graph will be recorded in the distance map. Also you can
|
||||
record the shortest paths tree in a predecessor map: for each vertex
|
||||
<i>u in V</i>, <i>p[u]</i> will be the predecessor of <i>u</i> in
|
||||
the shortest paths tree (unless <i>p[u] = u</i>, in which case <i>u</i> is
|
||||
either the source or a vertex unreachable from the source). In
|
||||
addition to these two options, the user can provide there own
|
||||
custom-made visitor that can takes actions during any of the
|
||||
algorithm's event points.</P>
|
||||
|
||||
<P>
|
||||
|
||||
<H3>Requirements on Types</H3>
|
||||
|
||||
Dijkstra's algorithm finds all the shortest paths from the source
|
||||
vertex to every other vertex by iteratively ``growing'' the set of
|
||||
vertices <i>S</i> to which it knows the shortest path. At each step of
|
||||
the algorithm, the next vertex added to <i>S</i> is determined by a
|
||||
priority queue. The queue contains the vertices in <i>V - S</i><a
|
||||
href="#1">[1]</a> prioritized by their distance label, which is the
|
||||
length of the shortest path seen so far for each vertex. The vertex
|
||||
<i>u</i> at the top of the priority queue is then added to <i>S</i>,
|
||||
and each of its out-edges is relaxed: if the distance to <i>u</i> plus
|
||||
the weight of the out-edge <i>(u,v)</i> is less than the distance
|
||||
label for <i>v</i> then the estimated distance for vertex <i>v</i> is
|
||||
reduced. The algorithm then loops back, processing the next vertex at
|
||||
the top of the priority queue. The algorithm finishes when the
|
||||
priority queue is empty.
|
||||
</P>
|
||||
<P>
|
||||
The algorithm uses color markers (white, gray, and black) to keep
|
||||
track of which set each vertex is in. Vertices colored black are in
|
||||
<i>S</i>. Vertices colored white or gray are in <i>V-S</i>. White vertices have
|
||||
not yet been discovered and gray vertices are in the priority queue.
|
||||
By default, the algorithm will allocate an array to store a color
|
||||
marker for each vertex in the graph. You can provide you own storage
|
||||
and access for colors with the <tt>color_map()</tt> parameter.
|
||||
</P>
|
||||
<p>
|
||||
The following is the pseudo-code for Dijkstra's single-source shortest
|
||||
paths algorithm. <i>w</i> is the edge weight, <i>d</i> is the distance label,
|
||||
and <i>p</i> is the predecessor of each vertex which is used to encode
|
||||
the shortest paths tree. <i>Q</i> is a priority queue that supports the
|
||||
DECREASE-KEY operation. The visitor event points for the algorithm are
|
||||
indicated by the labels on the right.
|
||||
</p>
|
||||
|
||||
<UL>
|
||||
<LI>The type <TT>VertexListGraph</TT> must be a model of <a href="./VertexListGraph.html">VertexListGraph</a>.
|
||||
</LI>
|
||||
<li>In version (1) of the algorithm, the graph must be a <a href="./PropertyGraph.html">PropertyGraph</a> with respect to <tt>vertex_color_t</tt>,
|
||||
<tt>vertex_distance_t</tt>, <tt>edge_weight_t</tt>, and <tt>vertex_index_t</tt></li>
|
||||
<table>
|
||||
<tr>
|
||||
<td valign="top">
|
||||
<pre>
|
||||
DIJKSTRA(<i>G</i>, <i>s</i>, <i>w</i>)
|
||||
<b>for</b> each vertex <i>u in V</i>
|
||||
<i>d[u] := infinity</i>
|
||||
<i>p[u] := u</i>
|
||||
<i>color[u] :=</i> WHITE
|
||||
<b>end for</b>
|
||||
<i>color[s] := </i>GRAY
|
||||
<i>d[s] := 0</i>
|
||||
INSERT(<i>Q</i>, <i>s</i>)
|
||||
<b>while</b> (<i>Q != Ø</i>)
|
||||
<i>u :=</i> EXTRACT-MIN(<i>Q</i>)
|
||||
<i>S := S U { u }</i>
|
||||
<b>for</b> each vertex <i>v in Adj[u]</i>
|
||||
<b>if</b> (<i>w(u,v) + d[u] < d[v]</i>)
|
||||
<i>d[v] := w(u,v) + d[u]</i>
|
||||
<i>p[v] := u</i>
|
||||
<b>if</b> (<i>color[v] =</i> WHITE)
|
||||
<i>color[v] :=</i> GRAY
|
||||
INSERT(<i>Q</i>, <i>v</i>)
|
||||
<b>else if</b> (<i>color[v] =</i> GRAY)
|
||||
DECREASE-KEY(<i>Q</i>, <i>v</i>)
|
||||
<b>else</b>
|
||||
<i>...</i>
|
||||
<b>end for</b>
|
||||
<i>color[u] :=</i> BLACK
|
||||
<b>end while</b>
|
||||
return (<i>d</i>, <i>p</i>)
|
||||
</pre>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<pre>
|
||||
|
||||
<li>In version (2) of the algorithm, the graph must be a <a href="./PropertyGraph.html">PropertyGraph</a> with respect to <tt>vertex_color_t</tt>,
|
||||
<tt>edge_weight_t</tt>, and <tt>vertex_index_t</tt></li>
|
||||
initialize vertex <i>u</i>
|
||||
|
||||
<li>In version (3) of the algorithm, the graph must be a <a href="./PropertyGraph.html">PropertyGraph</a> with respect to <tt>vertex_color_t</tt>,
|
||||
<tt>edge_weight_t</tt>, and <tt>vertex_index_t</tt></li>
|
||||
|
||||
<LI>The type <TT>UniformCostVisitor</TT> must be a model of <a href="./UniformCostVisitor.html">UniformCostVisitor</a>.
|
||||
</LI>
|
||||
<LI><a name="DistanceMap">The type <TT>DistanceMap</TT> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">ReadWritePropertyMap</a>. The
|
||||
vertex descriptor type of the graph needs to be usable as the key
|
||||
type of the distance map. The value type of the distance
|
||||
map must be <a href="http://www.sgi.com/Technology/STL/LessThanComparable.html">LessThanComparable</a>.</a>
|
||||
</LI>
|
||||
<LI><a name="WeightMap">The type <TT>WeightMap</TT> must be a model of <a
|
||||
href="../../property_map/ReadablePropertyMap.html">ReadablePropertyMap</a>. The
|
||||
edge descriptor type of the graph needs to be usable as the key
|
||||
type for the weight map. The value type for the map
|
||||
must be <I>Addable</I> with the value type of the distance
|
||||
map.</a>
|
||||
</LI>
|
||||
<LI><a name="ColorMap">The type <TT>ColorMap</TT> must be a model of
|
||||
<a href="../../property_map/ReadWritePropertyMap.html">ReadWritePropertyMap</a>. A vertex descriptor must be
|
||||
usable as the key type of the map, and the value type of the
|
||||
map must be a model of <a href="./ColorValue.html">ColorValue</a>.</a>
|
||||
</LI>
|
||||
<LI><a name="VertexIndexMap">The type <TT>VertexIndexMap</TT> must be a model of <a
|
||||
href="../../property_map/ReadablePropertyMap.html">ReadablePropertyMap</a>. The
|
||||
value type of <TT>VertexIndexMap</TT> must be an integer type. The
|
||||
integers must map vertex descriptors to the integers zero through
|
||||
<tt>num_vertices(g) - 1</tt>. The vertex
|
||||
descriptor type of the graph needs to be usable as the key type
|
||||
of the vertex index map.</a>
|
||||
</LI>
|
||||
</UL>
|
||||
|
||||
<P>
|
||||
|
||||
|
||||
|
||||
discover vertex <i>s</i>
|
||||
|
||||
examine vertex <i>u</i>
|
||||
|
||||
examine edge <i>(u,v)</i>
|
||||
|
||||
edge <i>(u,v)</i> relaxed
|
||||
|
||||
|
||||
|
||||
discover vertex <i>v</i>
|
||||
|
||||
|
||||
|
||||
edge <i>(u,v)</i> not relaxed
|
||||
|
||||
finish vertex <i>u</i>
|
||||
</pre>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<h3>Where Defined</h3>
|
||||
|
||||
<a href="../../../boost/graph/dijkstra_shortest_paths.hpp"><tt>boost/graph/dijkstra_shortest_paths.hpp</tt></a>
|
||||
|
||||
<h3>Parameters</h3>
|
||||
|
||||
IN: <tt>const Graph& g</tt>
|
||||
<blockquote>
|
||||
The graph object on which the algorithm will be applied.
|
||||
The type <tt>Graph</tt> must be a model of
|
||||
<a href="./VertexListGraph.html">Vertex List Graph</a>
|
||||
and <a href="./IncidenceGraph.html">Incidence Graph</a>.<br>
|
||||
|
||||
<b>Python</b>: The parameter is named <tt>graph</tt>.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>vertex_descriptor s</tt>
|
||||
<blockquote>
|
||||
The source vertex. All distance will be calculated from this vertex,
|
||||
and the shortest paths tree will be rooted at this vertex.<br>
|
||||
|
||||
<b>Python</b>: The parameter is named <tt>root_vertex</tt>.
|
||||
</blockquote>
|
||||
|
||||
<h3>Named Parameters</h3>
|
||||
|
||||
IN: <tt>weight_map(WeightMap w_map)</tt>
|
||||
<blockquote>
|
||||
The weight or ``length'' of each edge in the graph. The weights
|
||||
must all be non-negative, and the algorithm will throw a
|
||||
<a href="./exception.html#negative_edge"><tt>negative_edge</tt></a>
|
||||
exception is one of the edges is negative.
|
||||
The type <tt>WeightMap</tt> must be a model of
|
||||
<a href="../../property_map/ReadablePropertyMap.html">Readable Property Map</a>. The edge descriptor type of
|
||||
the graph needs to be usable as the key type for the weight
|
||||
map. The value type for this map must be
|
||||
the same as the value type of the distance map.<br>
|
||||
<b>Default:</b> <tt>get(edge_weight, g)</tt><br>
|
||||
|
||||
<b>Python</b>: Must be an <tt>edge_double_map</tt> for the graph.<br>
|
||||
<b>Python default</b>: <tt>graph.get_edge_double_map("weight")</tt>
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>vertex_index_map(VertexIndexMap i_map)</tt>
|
||||
<blockquote>
|
||||
This maps each vertex to an integer in the range <tt>[0,
|
||||
num_vertices(g))</tt>. This is necessary for efficient updates of the
|
||||
heap data structure [<A
|
||||
HREF="bibliography.html#driscoll88">61</A>] when an edge is relaxed.
|
||||
The type
|
||||
<tt>VertexIndexMap</tt> must be a model of
|
||||
<a href="../../property_map/ReadablePropertyMap.html">Readable Property Map</a>. The value type of the map must be an
|
||||
integer type. The vertex descriptor type of the graph needs to be
|
||||
usable as the key type of the map.<br>
|
||||
<b>Default:</b> <tt>get(vertex_index, g)</tt>.
|
||||
Note: if you use this default, make sure your graph has
|
||||
an internal <tt>vertex_index</tt> property. For example,
|
||||
<tt>adjacenty_list</tt> with <tt>VertexList=listS</tt> does
|
||||
not have an internal <tt>vertex_index</tt> property.
|
||||
<br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
OUT: <tt>predecessor_map(PredecessorMap p_map)</tt>
|
||||
<blockquote>
|
||||
The predecessor map records the edges in the minimum spanning
|
||||
tree. Upon completion of the algorithm, the edges <i>(p[u],u)</i>
|
||||
for all <i>u in V</i> are in the minimum spanning tree. If <i>p[u] =
|
||||
u</i> then <i>u</i> is either the source vertex or a vertex that is
|
||||
not reachable from the source. The <tt>PredecessorMap</tt> type
|
||||
must be a <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a> whose key and value types are the same as the vertex
|
||||
descriptor type of the graph.<br>
|
||||
<b>Default:</b> <tt>dummy_property_map</tt><br>
|
||||
|
||||
<b>Python</b>: Must be a <tt>vertex_vertex_map</tt> for the graph.<br>
|
||||
</blockquote>
|
||||
|
||||
UTIL/OUT: <tt>distance_map(DistanceMap d_map)</tt>
|
||||
<blockquote>
|
||||
The shortest path weight from the source vertex <tt>s</tt> to each
|
||||
vertex in the graph <tt>g</tt> is recorded in this property map. The
|
||||
shortest path weight is the sum of the edge weights along the
|
||||
shortest path. The type <tt>DistanceMap</tt> must be a model of <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a>. The vertex descriptor type of the graph needs to
|
||||
be usable as the key type of the distance map.
|
||||
|
||||
The value type of the distance map is the element type of a <a
|
||||
href="./Monoid.html">Monoid</a> formed with the <tt>combine</tt>
|
||||
function object and the <tt>zero</tt> object for the identity
|
||||
element. Also the distance value type must have a <a
|
||||
href="http://www.sgi.com/tech/stl/StrictWeakOrdering.html">
|
||||
StrictWeakOrdering</a> provided by the <tt>compare</tt> function
|
||||
object.<br>
|
||||
<b>Default:</b> <a
|
||||
href="../../property_map/iterator_property_map.html">
|
||||
<tt>iterator_property_map</tt></a> created from a
|
||||
<tt>std::vector</tt> of the <tt>WeightMap</tt>'s value type of size
|
||||
<tt>num_vertices(g)</tt> and using the <tt>i_map</tt> for the index
|
||||
map.<br>
|
||||
|
||||
<b>Python</b>: Must be a <tt>vertex_double_map</tt> for the graph.<br>
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>distance_compare(CompareFunction cmp)</tt>
|
||||
<blockquote>
|
||||
This function is use to compare distances to determine which vertex
|
||||
is closer to the source vertex. The <tt>CompareFunction</tt> type
|
||||
must be a model of <a
|
||||
href="http://www.sgi.com/tech/stl/BinaryPredicate.html">Binary
|
||||
Predicate</a> and have argument types that match the value type of
|
||||
the <tt>DistanceMap</tt> property map.<br>
|
||||
|
||||
<b>Default:</b>
|
||||
<tt>std::less<D></tt> with <tt>D=typename
|
||||
property_traits<DistanceMap>::value_type</tt><br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>distance_combine(CombineFunction cmb)</tt>
|
||||
<blockquote>
|
||||
This function is used to combine distances to compute the distance
|
||||
of a path. The <tt>CombineFunction</tt> type must be a model of <a
|
||||
href="http://www.sgi.com/tech/stl/BinaryFunction.html">Binary
|
||||
Function</a>. The first argument type of the binary function must
|
||||
match the value type of the <tt>DistanceMap</tt> property map and
|
||||
the second argument type must match the value type of the
|
||||
<tt>WeightMap</tt> property map. The result type must be the same
|
||||
type as the distance value type.<br>
|
||||
|
||||
<b>Default:</b> <tt>std::plus<D></tt> with
|
||||
<tt>D=typename property_traits<DistanceMap>::value_type</tt><br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>distance_inf(D inf)</tt>
|
||||
<blockquote>
|
||||
The <tt>inf</tt> object must be the greatest value of any <tt>D</tt> object.
|
||||
That is, <tt>compare(d, inf) == true</tt> for any <tt>d != inf</tt>.
|
||||
The type <tt>D</tt> is the value type of the <tt>DistanceMap</tt>.<br>
|
||||
<b>Default:</b> <tt>std::numeric_limits<D>::max()</tt><br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>distance_zero(D zero)</tt>
|
||||
<blockquote>
|
||||
The <tt>zero</tt> value must be the identity element for the
|
||||
<a href="./Monoid.html">Monoid</a> formed by the distance values
|
||||
and the <tt>combine</tt> function object.
|
||||
The type <tt>D</tt> is the value type of the <tt>DistanceMap</tt>.<br>
|
||||
<b>Default:</b> <tt>D()</tt>with
|
||||
<tt>D=typename property_traits<DistanceMap>::value_type</tt><br>
|
||||
|
||||
<b>Python</b>: Unsupported parameter.
|
||||
</blockquote>
|
||||
|
||||
UTIL/OUT: <tt>color_map(ColorMap c_map)</tt>
|
||||
<blockquote>
|
||||
This is used during the execution of the algorithm to mark the
|
||||
vertices. The vertices start out white and become gray when they are
|
||||
inserted in the queue. They then turn black when they are removed
|
||||
from the queue. At the end of the algorithm, vertices reachable from
|
||||
the source vertex will have been colored black. All other vertices
|
||||
will still be white. The type <tt>ColorMap</tt> must be a model of
|
||||
<a href="../../property_map/ReadWritePropertyMap.html">Read/Write
|
||||
Property Map</a>. A vertex descriptor must be usable as the key type
|
||||
of the map, and the value type of the map must be a model of
|
||||
<a href="./ColorValue.html">Color Value</a>.<br>
|
||||
<b>Default:</b> an <a
|
||||
href="../../property_map/iterator_property_map.html">
|
||||
<tt>iterator_property_map</tt></a> created from a <tt>std::vector</tt>
|
||||
of <tt>default_color_type</tt> of size <tt>num_vertices(g)</tt> and
|
||||
using the <tt>i_map</tt> for the index map.<br>
|
||||
|
||||
<b>Python</b>: The color map must be a <tt>vertex_color_map</tt> for
|
||||
the graph.
|
||||
</blockquote>
|
||||
|
||||
OUT: <tt>visitor(DijkstraVisitor v)</tt>
|
||||
<blockquote>
|
||||
Use this to specify actions that you would like to happen
|
||||
during certain event points within the algorithm.
|
||||
The type <tt>DijkstraVisitor</tt> must be a model of the
|
||||
<a href="./DijkstraVisitor.html">Dijkstra Visitor</a> concept.
|
||||
The visitor object is passed by value <a
|
||||
href="#2">[2]</a>.<br>
|
||||
<b>Default:</b> <tt>dijkstra_visitor<null_visitor></tt><br>
|
||||
|
||||
<b>Python</b>: The parameter should be an object that derives from
|
||||
the <a
|
||||
href="DijkstraVisitor.html#python"><tt>DijkstraVisitor</tt></a> type
|
||||
of the graph.
|
||||
</blockquote>
|
||||
|
||||
|
||||
<H3>Complexity</H3>
|
||||
|
||||
<P>
|
||||
The time complexity is <i>O((V + E) log V)</i>, or just <i>O(E log V)</i>
|
||||
if all vertices are reachable from the source.
|
||||
The time complexity is <i>O(V log V)</i>.
|
||||
|
||||
|
||||
<h3>Visitor Event Points</h3>
|
||||
|
||||
<ul>
|
||||
<li><b><tt>vis.initialize_vertex(u, g)</tt></b>
|
||||
is invoked on each vertex in the graph before the start of the
|
||||
algorithm.
|
||||
<li><b><tt>vis.examine_vertex(u, g)</tt></b>
|
||||
is invoked on a vertex as it is removed from the priority queue
|
||||
and added to set <i>S</i>. At this point we know that <i>(p[u],u)</i>
|
||||
is a shortest-paths tree edge so
|
||||
<i>d[u] = delta(s,u) = d[p[u]] + w(p[u],u)</i>. Also, the distances
|
||||
of the examined vertices is monotonically increasing
|
||||
<i>d[u<sub>1</sub>] <= d[u<sub>2</sub>] <= d[u<sub>n</sub>]</i>.
|
||||
<li><b><tt>vis.examine_edge(e, g)</tt></b>
|
||||
is invoked on each out-edge of a vertex immediately after it has
|
||||
been added to set <i>S</i>.
|
||||
<li><b><tt>vis.edge_relaxed(e, g)</tt></b>
|
||||
is invoked on edge <i>(u,v)</i> if <i>d[u] + w(u,v) < d[v]</i>.
|
||||
The edge <i>(u,v)</i> that participated in the last
|
||||
relaxation for vertex <i>v</i> is an edge in the shortest paths tree.
|
||||
<li><b><tt>vis.discover_vertex(v, g)</tt></b>
|
||||
is invoked on vertex <i>v</i> when the edge
|
||||
<i>(u,v)</i> is examined and <i>v</i> is WHITE. Since
|
||||
a vertex is colored GRAY when it is discovered,
|
||||
each reacable vertex is discovered exactly once. This
|
||||
is also when the vertex is inserted into the priority queue.
|
||||
<li><b><tt>vis.edge_not_relaxed(e, g)</tt></b>
|
||||
is invoked if the edge is not relaxed (see above).
|
||||
<li><b><tt>vis.finish_vertex(u, g)</tt></b>
|
||||
is invoked on a vertex after all of its out edges have
|
||||
been examined.
|
||||
</ul>
|
||||
|
||||
<H3>Example</H3>
|
||||
|
||||
<P>
|
||||
The source code for this example is in <a
|
||||
href="../example/dijkstra.cpp"><TT>examples/dijkstra.cpp</TT></a>.
|
||||
See <a href="../example/dijkstra-example.cpp">
|
||||
<TT>example/dijkstra-example.cpp</TT></a> for an example of using Dijkstra's
|
||||
algorithm.
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
int
|
||||
main(int , char* [])
|
||||
{
|
||||
using namespace boost;
|
||||
<H3>Notes</H3>
|
||||
|
||||
typedef property<edge_weight_t, int> weightp;
|
||||
typedef adjacency_list< listS, vecS, directedS,
|
||||
property<vertex_color_t,default_color_type>, weightp > Graph;
|
||||
typedef graph_traits<Graph>::vertex_descriptor Vertex;
|
||||
|
||||
typedef std::pair<int,int> E;
|
||||
|
||||
const int num_nodes = 5;
|
||||
E edges[] = { E(0,2),
|
||||
E(1,1), E(1,3), E(1,4),
|
||||
E(2,1), E(2,3),
|
||||
E(3,4),
|
||||
E(4,0), E(4,1) };
|
||||
int weights[] = { 1, 2, 1, 2, 7, 3, 1, 1, 1};
|
||||
|
||||
Graph G(num_nodes, edges, edges + sizeof(edges)/sizeof(E), weights);
|
||||
|
||||
std::vector<Vertex> p(num_vertices(G));
|
||||
std::vector<int> d(num_vertices(G));
|
||||
|
||||
Vertex s = *(vertices(G).first);
|
||||
p[s] = s;
|
||||
dijkstra_shortest_paths(G, s, &d[0],
|
||||
make_ucs_visitor(record_predecessors(&p[0], on_edge_relaxed())));
|
||||
|
||||
std::cout << "distances from start vertex:" << std::endl;
|
||||
graph_traits<Graph>::vertex_iterator vi, vend;
|
||||
for(tie(vi,vend) = vertices(G); vi != vend; ++vi)
|
||||
std::cout << "distance(" << *vi << ") = " << d[*vi] << std::endl;
|
||||
std::cout << std::endl;
|
||||
|
||||
std::cout << "shortest paths tree" << std::endl;
|
||||
adjacency_list<> tree(num_nodes);
|
||||
|
||||
for(tie(vi,vend) = vertices(G); vi != vend; ++vi)
|
||||
if (*vi != p[*vi])
|
||||
add_edge(p[*vi], *vi, tree);
|
||||
|
||||
print_graph(tree);
|
||||
|
||||
return 0;
|
||||
}
|
||||
</PRE>
|
||||
The output is:
|
||||
<PRE>
|
||||
distances from start vertex:
|
||||
distance(0) = 0
|
||||
distance(1) = 6
|
||||
distance(2) = 1
|
||||
distance(3) = 4
|
||||
distance(4) = 5
|
||||
|
||||
shortest paths tree
|
||||
0 --> 2
|
||||
1 -->
|
||||
2 --> 3
|
||||
3 --> 4
|
||||
4 --> 1
|
||||
</PRE>
|
||||
<a name="1">[1]</a>
|
||||
The algorithm used here saves a little space by not putting all <i>V -
|
||||
S</i> vertices in the priority queue at once, but instead only those
|
||||
vertices in <i>V - S</i> that are discovered and therefore have a
|
||||
distance less than infinity.
|
||||
|
||||
<p><a name="2">[2]</a>
|
||||
Since the visitor parameter is passed by value, if your visitor
|
||||
contains state then any changes to the state during the algorithm
|
||||
will be made to a copy of the visitor object, not the visitor object
|
||||
passed in. Therefore you may want the visitor to hold this state by
|
||||
pointer or reference.
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: dijkstra_visitor</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1>
|
||||
<pre>
|
||||
dijkstra_visitor<EventVisitorList>
|
||||
</pre>
|
||||
</H1>
|
||||
|
||||
This class is an adapter that converts a list of <a
|
||||
href="./EventVisitor.html">EventVisitor</a>'s (constructed using
|
||||
<tt>std::pair</tt>) into a <a
|
||||
href="./DijkstraVisitor.html">DijkstraVisitor</a>.
|
||||
|
||||
|
||||
<h3>Example</h3>
|
||||
|
||||
This is an excerpt from <a
|
||||
href="../example/dave.cpp"><tt>examples/dave.cpp</tt></a>
|
||||
where the <tt>copy_graph</tt> single-event visitor
|
||||
is used to create a copy the shortest-paths search-tree calculated
|
||||
by Dijkstra's algorithm.
|
||||
|
||||
<pre>
|
||||
boost::dijkstra_shortest_paths
|
||||
(G, vertex(a, G),
|
||||
distance_map(make_iterator_property_map(distance.begin(), vertex_id, distance[0])).
|
||||
predecessor_map(make_iterator_property_map(parent.begin(), vertex_id, parent[0])).
|
||||
visitor(make_dijkstra_visitor(copy_graph(G_copy, on_examine_edge()))));
|
||||
</pre>
|
||||
|
||||
|
||||
<h3>Model of</h3>
|
||||
|
||||
<a href="./DijkstraVisitor.html">Dijkstra Visitor</a>
|
||||
|
||||
<H3>Template Parameters</H3>
|
||||
|
||||
<P>
|
||||
<TABLE border>
|
||||
<TR>
|
||||
<th>Parameter</th><th>Description</th><th>Default</th>
|
||||
</tr>
|
||||
|
||||
<TR><TD><TT>EventVisitorList</TT></TD>
|
||||
<TD>
|
||||
A list of <a href="./EventVisitor.html">EventVisitor</a>'s created
|
||||
with <tt>std::pair</tt>.
|
||||
</TD>
|
||||
<TD><TT><a href="./null_visitor.html"><tt>null_visitor</tt></a></TT></TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<H3>Where Defined</H3>
|
||||
|
||||
<P>
|
||||
<a href="../../../boost/graph/dijkstra_shortest_paths.hpp">
|
||||
<TT>boost/graph/dijkstra_shortest_paths.hpp</TT></a>
|
||||
|
||||
<h3>Member Functions</h3>
|
||||
|
||||
This class implements all of the member functions required by <a
|
||||
href="./DijkstraVisitor.html">DijkstraVisitor</a>. In each
|
||||
function the appropriate event is dispatched to the <a
|
||||
href="./EventVisitor.html">EventVisitor</a>'s in the EventVisitorList.
|
||||
|
||||
<h3>Non-Member Functions</h3>
|
||||
|
||||
<table border>
|
||||
<tr>
|
||||
<th>Function</th><th>Description</th>
|
||||
</tr>
|
||||
|
||||
<tr><td><tt>
|
||||
template <class EventVisitorList><br>
|
||||
dijkstra_visitor<EventVisitorList><br>
|
||||
make_dijkstra_visitor(EventVisitorList ev_list);
|
||||
</tt></td><td>
|
||||
Returns the event visitor list adapted to be a Dijkstra Visitor.
|
||||
</td></tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
<a href="./visitor_concepts.html">Visitor concepts</a>
|
||||
<p>
|
||||
The following are event visitors: <a
|
||||
href="./predecessor_recorder.html"><tt>predecessor_recorder</tt></a>,
|
||||
<a href="./distance_recorder.html"><tt>distance_recorder</tt></a>
|
||||
<a href="./time_stamper.html"><tt>time_stamper</tt></a>,
|
||||
and <a href="./property_writer.html"><tt>property_writer</tt></a>.
|
||||
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. We make no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: distance_recorder</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -166,14 +162,14 @@ and <a href="./property_writer.html"><tt>property_writer</tt></a>.
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -2,19 +2,15 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. Silicon Graphics makes no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Edge List Class</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
@@ -108,7 +104,7 @@ of each vertex in the shortest paths tree.
|
||||
</tr>
|
||||
|
||||
<TR><TD><TT>EdgeIterator</TT></TD> <TD>Must be model of <a
|
||||
href="http://www.sgi.com/Technology/STL/InputIterator.html">InputIterator</a>
|
||||
href="http://www.sgi.com/tech/stl/InputIterator.html">InputIterator</a>
|
||||
who's <TT>value_type</TT> must be a pair of vertex descriptors.</TD>
|
||||
</TR>
|
||||
|
||||
@@ -211,14 +207,14 @@ Returns the target vertex of edge <TT>e</TT>.
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000</TD><TD>
|
||||
<A HREF="../../../people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)<br>
|
||||
<A HREF="../../../people/liequan_lee.htm">Lie-Quan Lee</A>, Univ.of Notre Dame (<A HREF="mailto:llee1@lsc.nd.edu">llee1@lsc.nd.edu</A>)<br>
|
||||
<A HREF=http://www.lsc.nd.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Univ.of Notre Dame (<A
|
||||
HREF="mailto:lums@lsc.nd.edu">lums@lsc.nd.edu</A>)
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)<br>
|
||||
<A HREF="http://www.boost.org/people/liequan_lee.htm">Lie-Quan Lee</A>, Indiana University (<A HREF="mailto:llee@cs.indiana.edu">llee@cs.indiana.edu</A>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<A
|
||||
HREF="mailto:lums@osl.iu.edu">lums@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
|
||||
@@ -0,0 +1,247 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2000
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Edmunds-Karp Maximum Flow</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<H1><A NAME="sec:edmunds_karp_max_flow">
|
||||
<TT>edmunds_karp_max_flow</TT>
|
||||
</H1>
|
||||
|
||||
<PRE>
|
||||
<i>// named paramter version</i>
|
||||
template <class <a href="./Graph.html">Graph</a>, class P, class T, class R>
|
||||
typename detail::edge_capacity_value<Graph, P, T, R>::value_type
|
||||
edmunds_karp_max_flow(Graph& g,
|
||||
typename graph_traits<Graph>::vertex_descriptor src,
|
||||
typename graph_traits<Graph>::vertex_descriptor sink,
|
||||
const bgl_named_params<P, T, R>& params = <i>all defaults</i>)
|
||||
|
||||
<i>// non-named parameter version</i>
|
||||
template <class <a href="./Graph.html">Graph</a>,
|
||||
class CapacityEdgeMap, class ResidualCapacityEdgeMap,
|
||||
class ReverseEdgeMap, class ColorMap, class PredEdgeMap>
|
||||
typename property_traits<CapacityEdgeMap>::value_type
|
||||
edmunds_karp_max_flow(Graph& g,
|
||||
typename graph_traits<Graph>::vertex_descriptor src,
|
||||
typename graph_traits<Graph>::vertex_descriptor sink,
|
||||
CapacityEdgeMap cap, ResidualCapacityEdgeMap res, ReverseEdgeMap rev,
|
||||
ColorMap color, PredEdgeMap pred)
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
The <tt>edmunds_karp_max_flow()</tt> function calculates the maximum flow
|
||||
of a network. See Section <a
|
||||
href="./graph_theory_review.html#sec:network-flow-algorithms">Network
|
||||
Flow Algorithms</a> for a description of maximum flow. The calculated
|
||||
maximum flow will be the return value of the function. The function
|
||||
also calculates the flow values <i>f(u,v)</i> for all <i>(u,v)</i> in
|
||||
<i>E</i>, which are returned in the form of the residual capacity
|
||||
<i>r(u,v) = c(u,v) - f(u,v)</i>.
|
||||
|
||||
<p>
|
||||
There are several special requirements on the input graph and property
|
||||
map parameters for this algorithm. First, the directed graph
|
||||
<i>G=(V,E)</i> that represents the network must be augmented to
|
||||
include the reverse edge for every edge in <i>E</i>. That is, the
|
||||
input graph should be <i>G<sub>in</sub> = (V,{E U
|
||||
E<sup>T</sup>})</i>. The <tt>ReverseEdgeMap</tt> argument <tt>rev</tt>
|
||||
must map each edge in the original graph to its reverse edge, that is
|
||||
<i>(u,v) -> (v,u)</i> for all <i>(u,v)</i> in <i>E</i>. The
|
||||
<tt>CapacityEdgeMap</tt> argument <tt>cap</tt> must map each edge in
|
||||
<i>E</i> to a positive number, and each edge in <i>E<sup>T</sup></i>
|
||||
to 0.
|
||||
|
||||
<p>
|
||||
The algorithm is due to <a
|
||||
href="./bibliography.html#edmonds72:_improvements_netflow">Edmonds and
|
||||
Karp</a>, though we are using the variation called the ``labeling
|
||||
algorithm'' described in <a
|
||||
href="./bibliography.html#ahuja93:_network_flows">Network Flows</a>.
|
||||
|
||||
<p>
|
||||
This algorithm provides a very simple and easy to implement solution to
|
||||
the maximum flow problem. However, there are several reasons why this
|
||||
algorithm is not as good as the <a
|
||||
href="./push_relabel_max_flow.html"><tt>push_relabel_max_flow()</tt></a>
|
||||
or the <a
|
||||
href="./kolmogorov_max_flow.html"><tt>kolmogorov_max_flow()</tt></a>
|
||||
algorithm.
|
||||
|
||||
<ul>
|
||||
<li>In the non-integer capacity case, the time complexity is <i>O(V
|
||||
E<sup>2</sup>)</i> which is worse than the time complexity of the
|
||||
push-relabel algorithm <i>O(V<sup>2</sup>E<sup>1/2</sup>)</i>
|
||||
for all but the sparsest of graphs.</li>
|
||||
|
||||
<li>In the integer capacity case, if the capacity bound <i>U</i> is
|
||||
very large then the algorithm will take a long time.</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<H3>Where Defined</H3>
|
||||
|
||||
<P>
|
||||
<a href="../../../boost/graph/edmunds_karp_max_flow.hpp"><TT>boost/graph/edmunds_karp_max_flow.hpp</TT></a>
|
||||
|
||||
<P>
|
||||
|
||||
<h3>Parameters</h3>
|
||||
|
||||
IN: <tt>Graph& g</tt>
|
||||
<blockquote>
|
||||
A directed graph. The
|
||||
graph's type must be a model of <a
|
||||
href="./VertexListGraph.html">VertexListGraph</a> and <a href="./IncidenceGraph.html">IncidenceGraph</a> For each edge
|
||||
<i>(u,v)</i> in the graph, the reverse edge <i>(v,u)</i> must also
|
||||
be in the graph.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>vertex_descriptor src</tt>
|
||||
<blockquote>
|
||||
The source vertex for the flow network graph.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>vertex_descriptor sink</tt>
|
||||
<blockquote>
|
||||
The sink vertex for the flow network graph.
|
||||
</blockquote>
|
||||
|
||||
<h3>Named Parameters</h3>
|
||||
|
||||
|
||||
IN: <tt>capacity_map(CapacityEdgeMap cap)</tt>
|
||||
<blockquote>
|
||||
The edge capacity property map. The type must be a model of a
|
||||
constant <a
|
||||
href="../../property_map/LvaluePropertyMap.html">Lvalue Property Map</a>. The
|
||||
key type of the map must be the graph's edge descriptor type.<br>
|
||||
<b>Default:</b> <tt>get(edge_capacity, g)</tt>
|
||||
</blockquote>
|
||||
|
||||
OUT: <tt>residual_capacity_map(ResidualCapacityEdgeMap res)</tt>
|
||||
<blockquote>
|
||||
This maps edges to their residual capacity. The type must be a model
|
||||
of a mutable <a
|
||||
href="../../property_map/LvaluePropertyMap.html">Lvalue Property
|
||||
Map</a>. The key type of the map must be the graph's edge descriptor
|
||||
type.<br>
|
||||
<b>Default:</b> <tt>get(edge_residual_capacity, g)</tt>
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>reverse_edge_map(ReverseEdgeMap rev)</tt>
|
||||
<blockquote>
|
||||
An edge property map that maps every edge <i>(u,v)</i> in the graph
|
||||
to the reverse edge <i>(v,u)</i>. The map must be a model of
|
||||
constant <a href="../../property_map/LvaluePropertyMap.html">Lvalue
|
||||
Property Map</a>. The key type of the map must be the graph's edge
|
||||
descriptor type.<br>
|
||||
<b>Default:</b> <tt>get(edge_reverse, g)</tt>
|
||||
</blockquote>
|
||||
|
||||
UTIL: <tt>color_map(ColorMap color)</tt>
|
||||
<blockquote>
|
||||
Used by the algorithm to keep track of progress during the
|
||||
breadth-first search stage. At the end of the algorithm, the white
|
||||
vertices define the minimum cut set. The map must be a model of
|
||||
mutable <a
|
||||
href="../../property_map/LvaluePropertyMap.html">Lvalue Property Map</a>.
|
||||
The key type of the map should be the graph's vertex descriptor type, and
|
||||
the value type must be a model of <a
|
||||
href="./ColorValue.html">ColorValue</a>.<br>
|
||||
|
||||
<b>Default:</b> an <a
|
||||
href="../../property_map/iterator_property_map.html">
|
||||
<tt>iterator_property_map</tt></a> created from a <tt>std::vector</tt>
|
||||
of <tt>default_color_type</tt> of size <tt>num_vertices(g)</tt> and
|
||||
using the <tt>i_map</tt> for the index map.
|
||||
</blockquote>
|
||||
|
||||
UTIL: <tt>predecessor_map(PredEdgeMap pred)</tt>
|
||||
<blockquote>
|
||||
Use by the algorithm to store augmenting paths. The map must be a
|
||||
model of mutable <a
|
||||
href="../../property_map/LvaluePropertyMap.html">Lvalue Property Map</a>.
|
||||
The key type must be the graph's vertex descriptor type and the
|
||||
value type must be the graph's edge descriptor type.<br>
|
||||
|
||||
<b>Default:</b> an <a
|
||||
href="../../property_map/iterator_property_map.html">
|
||||
<tt>iterator_property_map</tt></a> created from a <tt>std::vector</tt>
|
||||
of edge descriptors of size <tt>num_vertices(g)</tt> and
|
||||
using the <tt>i_map</tt> for the index map.
|
||||
</blockquote>
|
||||
|
||||
IN: <tt>vertex_index_map(VertexIndexMap i_map)</tt>
|
||||
<blockquote>
|
||||
Maps each vertex of the graph to a unique integer in the range
|
||||
<tt>[0, num_vertices(g))</tt>. This property map is only needed
|
||||
if the default for the color or predecessor map is used.
|
||||
The vertex index map must be a model of <a
|
||||
href="../../property_map/ReadablePropertyMap.html">Readable Property
|
||||
Map</a>. The key type of the map must be the graph's vertex
|
||||
descriptor type.<br>
|
||||
<b>Default:</b> <tt>get(vertex_index, g)</tt>
|
||||
Note: if you use this default, make sure your graph has
|
||||
an internal <tt>vertex_index</tt> property. For example,
|
||||
<tt>adjacenty_list</tt> with <tt>VertexList=listS</tt> does
|
||||
not have an internal <tt>vertex_index</tt> property.
|
||||
</blockquote>
|
||||
|
||||
|
||||
<h3>Complexity</h3>
|
||||
|
||||
The time complexity is <i>O(V E<sup>2</sup>)</i> in the general case
|
||||
or <i>O(V E U)</i> if capacity values are integers bounded by
|
||||
some constant <i>U</i>.
|
||||
|
||||
<h3>Example</h3>
|
||||
|
||||
The program in <a
|
||||
href="../example/edmunds-karp-eg.cpp"><tt>example/edmunds-karp-eg.cpp</tt></a>
|
||||
reads an example maximum flow problem (a graph with edge capacities)
|
||||
from a file in the DIMACS format and computes the maximum flow.
|
||||
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
<a href="./push_relabel_max_flow.html"><tt>push_relabel_max_flow()</tt></a><br>
|
||||
<a href="./kolmogorov_max_flow.html"><tt>kolmogorov_max_flow()</tt></a>.
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2000-2001</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</A>, Indiana University (<A HREF="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
<!-- LocalWords: HTML Siek Edmunds BGCOLOR ffffff ee VLINK ALINK ff IMG SRC
|
||||
-->
|
||||
<!-- LocalWords: gif ALT BR sec edmunds karp TT DIV CELLPADDING TR TD PRE lt
|
||||
-->
|
||||
<!-- LocalWords: typename VertexListGraph CapacityEdgeMap ReverseEdgeMap gt
|
||||
-->
|
||||
<!-- LocalWords: ResidualCapacityEdgeMap VertexIndexMap src rev ColorMap pred
|
||||
-->
|
||||
<!-- LocalWords: PredEdgeMap tt href html hpp ul li nbsp br LvaluePropertyMap
|
||||
-->
|
||||
<!-- LocalWords: num ColorValue DIMACS cpp pre config iostream dimacs int std
|
||||
-->
|
||||
<!-- LocalWords: namespace vecS directedS cout endl iter ei HR valign nowrap
|
||||
-->
|
||||
<!-- LocalWords: jeremy siek htm Univ mailto jsiek lsc edu
|
||||
p -->
|
||||
@@ -0,0 +1,106 @@
|
||||
// Boost.Graph library isomorphism test
|
||||
|
||||
// Copyright (C) 2001 Douglas Gregor (gregod@cs.rpi.edu)
|
||||
//
|
||||
// Distributed under the Boost Software License, Version 1.0. (See
|
||||
// accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// For more information, see http://www.boost.org
|
||||
//
|
||||
// Revision History:
|
||||
//
|
||||
// 29 Nov 2001 Jeremy Siek
|
||||
// Changed to use Boost.Random.
|
||||
// 29 Nov 2001 Doug Gregor
|
||||
// Initial checkin.
|
||||
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
#include <boost/graph/adjacency_list.hpp>
|
||||
#include <boost/graph/isomorphism.hpp>
|
||||
//#include "isomorphism-v3.hpp"
|
||||
#include <boost/property_map.hpp>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <map>
|
||||
#include <algorithm>
|
||||
#include <cstdlib>
|
||||
#include <ctime>
|
||||
|
||||
using namespace boost;
|
||||
|
||||
|
||||
enum { a, b, c, d, e, f, g, h };
|
||||
enum { _1, _2, _3, _4, _5, _6, _7, _8 };
|
||||
|
||||
void test_isomorphism()
|
||||
{
|
||||
typedef adjacency_list<vecS, vecS, bidirectionalS> GraphA;
|
||||
typedef adjacency_list<vecS, vecS, bidirectionalS> GraphB;
|
||||
|
||||
char a_names[] = "abcdefgh";
|
||||
char b_names[] = "12345678";
|
||||
|
||||
GraphA Ga(8);
|
||||
add_edge(a, d, Ga);
|
||||
add_edge(a, h, Ga);
|
||||
add_edge(b, c, Ga);
|
||||
add_edge(b, e, Ga);
|
||||
add_edge(c, f, Ga);
|
||||
add_edge(d, a, Ga);
|
||||
add_edge(d, h, Ga);
|
||||
add_edge(e, b, Ga);
|
||||
add_edge(f, b, Ga);
|
||||
add_edge(f, e, Ga);
|
||||
add_edge(g, d, Ga);
|
||||
add_edge(g, f, Ga);
|
||||
add_edge(h, c, Ga);
|
||||
add_edge(h, g, Ga);
|
||||
|
||||
GraphB Gb(8);
|
||||
add_edge(_1, _6, Gb);
|
||||
add_edge(_2, _1, Gb);
|
||||
add_edge(_2, _5, Gb);
|
||||
add_edge(_3, _2, Gb);
|
||||
add_edge(_3, _4, Gb);
|
||||
add_edge(_4, _2, Gb);
|
||||
add_edge(_4, _3, Gb);
|
||||
add_edge(_5, _4, Gb);
|
||||
add_edge(_5, _6, Gb);
|
||||
add_edge(_6, _7, Gb);
|
||||
add_edge(_6, _8, Gb);
|
||||
add_edge(_7, _8, Gb);
|
||||
add_edge(_8, _1, Gb);
|
||||
add_edge(_8, _7, Gb);
|
||||
|
||||
|
||||
std::vector<std::size_t> in_degree_A(num_vertices(Ga));
|
||||
boost::detail::compute_in_degree(Ga, &in_degree_A[0]);
|
||||
|
||||
std::vector<std::size_t> in_degree_B(num_vertices(Gb));
|
||||
boost::detail::compute_in_degree(Gb, &in_degree_B[0]);
|
||||
|
||||
degree_vertex_invariant<std::size_t*, GraphA>
|
||||
invariantA(&in_degree_A[0], Ga);
|
||||
degree_vertex_invariant<std::size_t*, GraphB>
|
||||
invariantB(&in_degree_B[0], Gb);
|
||||
|
||||
std::vector<graph_traits<GraphB>::vertex_descriptor> f(num_vertices(Ga));
|
||||
|
||||
bool ret = isomorphism(Ga, Gb, &f[0], invariantA, invariantB,
|
||||
(invariantB.max)(),
|
||||
get(vertex_index, Ga), get(vertex_index, Gb));
|
||||
assert(ret == true);
|
||||
|
||||
for (std::size_t i = 0; i < num_vertices(Ga); ++i)
|
||||
std::cout << "f(" << a_names[i] << ")=" << b_names[f[i]] << std::endl;
|
||||
|
||||
BOOST_TEST(verify_isomorphism(Ga, Gb, &f[0]));
|
||||
}
|
||||
|
||||
int test_main(int, char* [])
|
||||
{
|
||||
test_isomorphism();
|
||||
return boost::report_errors();
|
||||
}
|
||||
@@ -0,0 +1,152 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) 2004, 2005 The Trustees of Indiana University
|
||||
--
|
||||
-- Use, modification and distribution is subject to the Boost Software
|
||||
-- License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
--
|
||||
-- Authors: Douglas Gregor
|
||||
-- Jeremiah Willcock
|
||||
-- Andrew Lumsdaine
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Erdös-Renyi Generator</Title>
|
||||
<script language="JavaScript" type="text/JavaScript">
|
||||
<!--
|
||||
function address(host, user) {
|
||||
var atchar = '@';
|
||||
var thingy = user+atchar+host;
|
||||
thingy = '<a hre' + 'f=' + "mai" + "lto:" + thingy + '>' + user+atchar+host + '</a>';
|
||||
document.write(thingy);
|
||||
}
|
||||
//-->
|
||||
</script>
|
||||
</head>
|
||||
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<tt>erdos_renyi_iterator</tt>
|
||||
|
||||
<br>
|
||||
|
||||
<PRE>
|
||||
template<typename RandomGenerator, typename Graph>
|
||||
class erdos_renyi_iterator
|
||||
{
|
||||
public:
|
||||
typedef std::input_iterator_tag iterator_category;
|
||||
typedef std::pair<vertices_size_type, vertices_size_type> value_type;
|
||||
typedef const value_type& reference;
|
||||
typedef const value_type* pointer;
|
||||
typedef void difference_type;
|
||||
|
||||
erdos_renyi_iterator();
|
||||
erdos_renyi_iterator(RandomGenerator& gen, vertices_size_type n,
|
||||
double fraction = 0.0, bool allow_self_loops = false);
|
||||
erdos_renyi_iterator(RandomGenerator& gen, vertices_size_type n,
|
||||
edges_size_type m, bool allow_self_loops = false);
|
||||
|
||||
// Iterator operations
|
||||
reference operator*() const;
|
||||
pointer operator->() const;
|
||||
erdos_renyi_iterator& operator++();
|
||||
erdos_renyi_iterator operator++(int);
|
||||
bool operator==(const erdos_renyi_iterator& other) const;
|
||||
bool operator!=(const erdos_renyi_iterator& other) const;
|
||||
};
|
||||
</PRE>
|
||||
|
||||
<p> This class template implements a generator for Erdös-Renyi
|
||||
graphs, suitable for initializing an <a
|
||||
href="adjacency_list.html"><tt>adjacency_list</tt></a> or other graph
|
||||
structure with iterator-based initialization. An Erdös-Renyi
|
||||
graph <em>G = (n, p)</em> is a graph with <em>n</em> vertices
|
||||
that. The probability of having an edge <em>(u, v)</em> in <em>G</em>
|
||||
is <em>p</em> for any vertices <em>u</em> and <em>v</em>. Typically,
|
||||
there are no self-loops, but the generator can optionally introduce
|
||||
self-loops with probability <em>p</em>. This generator will not
|
||||
produce any parallel edges and will produce edges in sorted order (as
|
||||
required by, e.g., the <a
|
||||
href="compressed_sparse_row.html"><tt>compressed_sparse_row_graph</tt></a>).</p>
|
||||
|
||||
<p>Erdös-Renyi graphs typically exhibit very little
|
||||
structure. For this reason, they are rarely useful in modeling
|
||||
real-world problems. However, they are often used when determining
|
||||
the theoretical complexity of complex graph algorithms.</p>
|
||||
|
||||
<p>If you want the possibility of generating parallel edges and don't
|
||||
care about sorted order, use the <a
|
||||
href="erdos_renyi_generator.html"><tt>erdos_renyi_iterator</tt></a>.</p>
|
||||
|
||||
<h3>Where Defined</h3>
|
||||
|
||||
<a href="../../../boost/graph/erdos_renyi_generator.hpp"><tt>boost/graph/erdos_renyi_generator.hpp</tt></a>
|
||||
|
||||
<h3>Constructors</h3>
|
||||
|
||||
<a name="default-constructor"/>
|
||||
<pre>erdos_renyi_iterator();</pre>
|
||||
<blockquote>
|
||||
Constructs a past-the-end iterator.
|
||||
</blockquote>
|
||||
|
||||
<pre>
|
||||
erdos_renyi_iterator(RandomGenerator& gen, vertices_size_type n,
|
||||
double fraction = 0.0, bool allow_self_loops = false);
|
||||
</pre>
|
||||
<blockquote>
|
||||
Constructs an Erdös-Renyi generator iterator that creates a
|
||||
graph with <tt>n</tt> vertices and a given <tt>fraction</tt> of the
|
||||
total number of edges that a simple graph may have.
|
||||
<tt>probability</tt>. Random vertices and edges are selected using the
|
||||
random number generator <tt>gen</tt>. Self-loops are permitted only when
|
||||
<tt>allow_self_loops</tt> is <tt>true</tt>.
|
||||
</blockquote>
|
||||
|
||||
<pre>
|
||||
erdos_renyi_iterator(RandomGenerator& gen, vertices_size_type n,
|
||||
edges_size_type m, bool allow_self_loops = false);
|
||||
</pre>
|
||||
<blockquote>
|
||||
Constructs an Erdös-Renyi generator iterator that creates a
|
||||
graph with <tt>n</tt> vertices and <tt>m</tt> edges.
|
||||
<tt>probability</tt>. Random vertices and edges are selected using the
|
||||
random number generator <tt>gen</tt>. Self-loops are permitted only when
|
||||
<tt>allow_self_loops</tt> is <tt>true</tt>.
|
||||
</blockquote>
|
||||
|
||||
<H3>Example</H3>
|
||||
|
||||
<pre>
|
||||
#include <boost/graph/adjacency_list.hpp>
|
||||
#include <boost/graph/erdos_renyi_generator.hpp>
|
||||
#include <boost/random/linear_congruential.hpp>
|
||||
|
||||
typedef boost::adjacency_list<> Graph;
|
||||
typedef boost::erdos_renyi_iterator<boost::minstd_rand, Graph> ERGen;
|
||||
|
||||
int main()
|
||||
{
|
||||
boost::minstd_rand gen;
|
||||
// Create graph with 100 nodes and edges with probability 0.05
|
||||
Graph g(ERGen(gen, 100, 0.05), ERGen(), 100);
|
||||
return 0;
|
||||
}
|
||||
</pre>
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2005</TD><TD>
|
||||
<A HREF="http://www.boost.org/people/doug_gregor.html">Doug Gregor</A>, Indiana University (<script language="Javascript">address("cs.indiana.edu", "dgregor")</script>)<br>
|
||||
<A HREF=http://www.osl.iu.edu/~lums>Andrew Lumsdaine</A>,
|
||||
Indiana University (<script language="Javascript">address("osl.iu.edu", "lums")</script>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -0,0 +1,46 @@
|
||||
<HTML>
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek 2002
|
||||
--
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: Exceptions</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<h1><a href="../../../boost/graph/exception.hpp"><tt>boost/graph/exception.hpp</tt></a></h1>
|
||||
|
||||
<P>
|
||||
The BGL defines several exception classes for reporting errors from
|
||||
BGL algorithms. Many of the BGL algorithms place certain requirements
|
||||
on the input graph. If these requirements are not met then the
|
||||
algorithm can not successfully complete, and instead throws the
|
||||
appropriate exception.
|
||||
</P>
|
||||
|
||||
<h3>Synopsis</h3>
|
||||
|
||||
<pre>
|
||||
struct <a name="bad_graph">bad_graph</a> : public invalid_argument {
|
||||
bad_graph(const string& what_arg);
|
||||
};
|
||||
struct <a name="not_a_dag">not_a_dag</a> : public bad_graph {
|
||||
not_a_dag();
|
||||
};
|
||||
struct <a name="negative_edge">negative_edge</a> : public bad_graph {
|
||||
negative_edge();
|
||||
};
|
||||
struct <a name="negative_cycle">negative_cycle</a> : public bad_graph {
|
||||
negative_cycle();
|
||||
};
|
||||
struct <a name="not_connected">not_connected</a> : public bad_graph {
|
||||
not_connected();
|
||||
};
|
||||
</pre>
|
||||
@@ -2,28 +2,96 @@
|
||||
<!--
|
||||
-- Copyright (c) Jeremy Siek, Lie-Quan Lee, and Andrew Lumsdaine 2000
|
||||
--
|
||||
-- Permission to use, copy, modify, distribute and sell this software
|
||||
-- and its documentation for any purpose is hereby granted without fee,
|
||||
-- provided that the above copyright notice appears in all copies and
|
||||
-- that both that copyright notice and this permission notice appear
|
||||
-- in supporting documentation. We make no
|
||||
-- representations about the suitability of this software for any
|
||||
-- purpose. It is provided "as is" without express or implied warranty.
|
||||
-- Distributed under the Boost Software License, Version 1.0.
|
||||
-- (See accompanying file LICENSE_1_0.txt or copy at
|
||||
-- http://www.boost.org/LICENSE_1_0.txt)
|
||||
-->
|
||||
<Head>
|
||||
<Title>Boost Graph Library: FAQ</Title>
|
||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
||||
ALINK="#ff0000">
|
||||
<IMG SRC="../../../c++boost.gif"
|
||||
<IMG SRC="../../../boost.png"
|
||||
ALT="C++ Boost" width="277" height="86">
|
||||
|
||||
<BR Clear>
|
||||
|
||||
<h1>Frequently Asked Questions</h1>
|
||||
|
||||
|
||||
<ol>
|
||||
|
||||
<li>
|
||||
How do I perform an early exit from an algorithm such as BFS?<br>
|
||||
|
||||
<p>
|
||||
Create a visitor that throws an exception when you want to cut off the
|
||||
search, then put your call to <tt>breadth_first_search</tt> inside of
|
||||
an appropriate try/catch block. This strikes many programmers as a
|
||||
misuse of exceptions, however, much thought was put into the decision
|
||||
to have exceptions has the preferred way to exit early. See boost
|
||||
email discussions for more details.
|
||||
</p>
|
||||
|
||||
<li>
|
||||
Why is the visitor parameter passed by value rather than reference
|
||||
in the various BGL algorithms?<br>
|
||||
|
||||
<p>
|
||||
One of the usage scenarios that we wanted to support with the
|
||||
algorithms was creating visitor objects on the fly, within the
|
||||
argument list of the call to the graph algorithm. In this situation,
|
||||
the visitor object is a temporary object. Now there is a truly
|
||||
unfortunate rule in the C++ standard that says a temporary cannot be
|
||||
bound to a non-const reference parameter. So we had to decide whether
|
||||
we wanted to support this kind of usage and call-by-value, or not and
|
||||
call-by-reference. We chose call-by-value, following in the footsteps
|
||||
of the STL (which passes functors by value). The disadvantage of this
|
||||
decision is that if your visitor contains state and changes that state
|
||||
during the algorithm, the change will be made to a copy of the visitor
|
||||
object, not the visitor object passed in. Therefore you may want the
|
||||
visitor to hold this state by pointer or reference.
|
||||
</p>
|
||||
|
||||
<li>Why does the BGL interface use friend functions (or free functions)
|
||||
instead of member functions?<br>
|
||||
<p>
|
||||
For the most part, the differences between member functions and free
|
||||
functions are syntactic, and not very important, though people can get
|
||||
religious about them. However, we had one technical reason for
|
||||
favoring free functions. A programmer can overload a free function for
|
||||
a type coming from a 3rd party without modifying the source
|
||||
code/definition of that type. There are several uses of this in the
|
||||
BGL. For example, Stanford GraphBase and LEDA graphs can both be used
|
||||
in BGL algorithms because of overloads in <tt>stanford_graph.hpp</tt>
|
||||
and <tt>leda_graph.hpp</tt>. One can even use
|
||||
<tt>std::vector<std::list></tt> as a graph due to the overloads
|
||||
in <tt>vector_as_graph.hpp</tt>.
|
||||
</p>
|
||||
<p>
|
||||
Of course, there is a way to adapt 3rd party classes into an interface
|
||||
with member functions. You create an adaptor class. However, the
|
||||
disadvantage of an adaptor class (compared to overloaded functions) is
|
||||
that one has to physically wrap and unwrap the objects as they go
|
||||
into/out of BGL algorithms. So the overloaded function route is more
|
||||
convenient. Granted, this is not a huge difference, but since there
|
||||
weren't other strong reasons, it was enough for us to choose free
|
||||
functions.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Our religious reason for choosing free functions is to send the message
|
||||
that BGL is a generic library, and not a traditional object-oriented
|
||||
library. OO was hip in the 80s and 90s, but its time we moved beyond!
|
||||
</p>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li>How do I create a graph where the edges are sorted/ordered? <br>
|
||||
<p>The example <a href="../example/ordered_out_edges.cpp">
|
||||
<tt>ordered_out_edges.cpp</tt></a> shows how to do this.</p>
|
||||
</li>
|
||||
|
||||
<li>Why does the algorithm X work with <tt>adjacency_list</tt> where
|
||||
<tt>VertexList=vecS</tt> but not when <tt>VertexList=listS</tt>? <br><br>
|
||||
Often the reason is that the algorithm expects to find the
|
||||
@@ -76,3 +144,9 @@ argument to the algorithm.</li>
|
||||
|
||||
|
||||
</ol>
|
||||
<!-- LocalWords: gif ALT BGL std const STL GraphBase LEDA BFS stanford hpp OO
|
||||
-->
|
||||
<!-- LocalWords: leda cpp VertexList vecS listS undirectedS num cnt struct
|
||||
-->
|
||||
<!-- LocalWords: enum
|
||||
-->
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
# -*- makefile -*-
|
||||
# Copyright (c) 2002 Trustees of Indiana University
|
||||
#
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||
# http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
.SUFFIXES: .fig .gif .tif .jpeg
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 613 B |
|
After Width: | Height: | Size: 613 B |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 968 B |
|
After Width: | Height: | Size: 492 B |
@@ -0,0 +1,17 @@
|
||||
graph A {
|
||||
node[shape="circle"]
|
||||
B [ style="filled", fillcolor="red" ];
|
||||
G [ style="filled", fillcolor="red" ];
|
||||
A [ style="filled", fillcolor="red" ];
|
||||
A -- F[label="1"]
|
||||
A -- B[label="1"]
|
||||
A -- G[label="3"]
|
||||
B -- C[label="0"]
|
||||
B -- D[label="0"]
|
||||
B -- E[label="1"]
|
||||
C -- D[label="0"]
|
||||
E -- F[label="1"]
|
||||
G -- I[label="2"]
|
||||
G -- H[label="2"]
|
||||
H -- I[label="2"]
|
||||
}
|
||||
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 786 B |
@@ -10,9 +10,6 @@ Single
|
||||
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 1.00 60.00 120.00
|
||||
6975 3150 7500 3000
|
||||
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 1.00 60.00 120.00
|
||||
6525 3825 7650 3075
|
||||
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 1.00 60.00 120.00
|
||||
6975 2175 7575 2775
|
||||
@@ -22,23 +19,23 @@ Single
|
||||
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 1.00 60.00 120.00
|
||||
6975 2625 7575 2850
|
||||
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 1.00 60.00 120.00
|
||||
4350 2625 4800 2625
|
||||
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 1.00 60.00 120.00
|
||||
4350 2550 5175 2100
|
||||
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 1.00 60.00 120.00
|
||||
2250 3075 2850 2700
|
||||
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 1.00 60.00 120.00
|
||||
3900 3225 4875 3225
|
||||
4 0 0 100 0 19 18 0.0000 4 255 2070 4350 3900 AdacencyMatrix\001
|
||||
2 1 0 1 0 7 100 0 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 1.00 60.00 120.00
|
||||
6525 4350 7650 3150
|
||||
2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 1.00 60.00 120.00
|
||||
3900 3225 4575 3825
|
||||
2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
|
||||
1 1 1.00 60.00 120.00
|
||||
6525 3900 7575 3075
|
||||
4 0 0 100 0 19 18 0.0000 4 255 2040 5175 2100 IncidenceGraph\001
|
||||
4 0 0 100 0 19 18 0.0000 4 255 2430 900 2100 BidirectionalGraph\001
|
||||
4 0 0 100 0 19 18 0.0000 4 255 1935 4950 3300 EdgeListGraph\001
|
||||
4 0 0 100 0 19 18 0.0000 4 255 795 7575 3000 Graph\001
|
||||
4 0 0 100 0 19 18 0.0000 4 255 2145 4800 2700 AdjacencyGraph\001
|
||||
4 0 0 100 0 19 18 0.0000 4 255 2100 2175 2700 VertexListGraph\001
|
||||
4 0 0 100 0 19 18 0.0000 4 255 3285 600 3300 VertexAndEdgeListGraph\001
|
||||
4 0 0 100 0 19 18 0.0000 4 255 1935 4575 3975 EdgeListGraph\001
|
||||
4 0 0 100 0 19 18 0.0000 4 255 2100 4800 3300 VertexListGraph\001
|
||||
4 0 0 100 0 19 18 0.0000 4 255 2145 4350 4500 AdjacencyMatrix\001
|
||||
|
||||
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 121 KiB |