mirror of
https://github.com/boostorg/graph.git
synced 2026-07-21 13:23:42 +00:00
Compare commits
1802 Commits
boost-1.39.0
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 6c04b5e4ac | |||
| 170eeb7157 | |||
| 3898362db3 | |||
| 108c02bbe3 | |||
| 3109027d88 | |||
| c9ff9d496a | |||
| da9891445f | |||
| b1c09b7c98 | |||
| 42dedb70dc | |||
| 8306d6917c | |||
| de2bffe7b0 | |||
| a77dec6feb | |||
| 1349344269 | |||
| bd10fa6f46 | |||
| 7012e975eb | |||
| 4df6881bee | |||
| fa19c3bfe8 | |||
| 6103fa5010 | |||
| 29be624016 | |||
| 30013adff1 | |||
| 505d1ca260 | |||
| 476e3791a2 | |||
| 32fe89d9ca | |||
| 8ed6e4148b | |||
| b70604ba98 | |||
| 434eba8377 | |||
| 1de0d5cb4a | |||
| cf1839a3dc | |||
| 41e64b12a9 | |||
| dae20d5a36 | |||
| da8ff0f6ce | |||
| 02cb1797fb | |||
| 5c61bd0bb0 | |||
| d064024368 | |||
| a1ac74112e | |||
| 0d3e577658 | |||
| 8ad0ef8519 | |||
| fe3ac077b1 | |||
| d86a207a6b | |||
| e6fa04062f | |||
| 7ac2ddff07 | |||
| 85d048a629 | |||
| 35c7a0956d | |||
| 21cd4df091 | |||
| bc69cb4ed8 | |||
| f3ea278844 | |||
| 2dd06ac7a7 | |||
| de9a2f6d5e | |||
| a80891754a | |||
| 95e3a3c6a2 | |||
| c1ed7eca2a | |||
| 5a86742db1 | |||
| 6039644bea | |||
| 6efc6b60d0 | |||
| 223223ac9e | |||
| d112309ea9 | |||
| 439351a7ed | |||
| 6c1b24d488 | |||
| 3ba1ef9b4e | |||
| b448bf3ae3 | |||
| 7f10bfb0d9 | |||
| 65c691f726 | |||
| 2c30cd95d4 | |||
| 6800e76199 | |||
| 7304e54dca | |||
| f51204ef1a | |||
| 3f972d6a4f | |||
| 14264f3a74 | |||
| 672f6f06f8 | |||
| 8790022347 | |||
| d8371c7ed0 | |||
| 5b19b1dadc | |||
| b2ceaae8a6 | |||
| 57b7cba59c | |||
| c1f4786e11 | |||
| 288c626c32 | |||
| ae8e08d88f | |||
| 1d06b64f49 | |||
| 4bc376279a | |||
| 90a58597d1 | |||
| 6b7ca26148 | |||
| 7e7a17aa3b | |||
| 559b68b8ba | |||
| 4aab9289c2 | |||
| ca2c6a6dd7 | |||
| 4c32a93dad | |||
| 4801103ac4 | |||
| 2e528f290a | |||
| 2edd46503e | |||
| 4c8b05e074 | |||
| 3ff238675e | |||
| 0b37a0cbaf | |||
| 3de2a688fa | |||
| 8c0d42b5e9 | |||
| 73190bf898 | |||
| 7e1812ed51 | |||
| 1dc557406c | |||
| 394bea9ca9 | |||
| 372dd21037 | |||
| e8799c4edf | |||
| 9bdc4a85c9 | |||
| 1a254b7e72 | |||
| 53189be2bb | |||
| 3480acd1a3 | |||
| f9ec2bd17a | |||
| 3d1dcb3b4d | |||
| b7a2acd12f | |||
| 8f2e44c9c0 | |||
| 65c234fdaf | |||
| 76c33f6ff5 | |||
| 8acad90b83 | |||
| 4188686303 | |||
| 4e51deab5b | |||
| a466abb35a | |||
| 7fd07d770e | |||
| 422ba537e0 | |||
| a6404c8555 | |||
| d2c82c8e66 | |||
| a7f7a1498b | |||
| 1e9d083125 | |||
| 47f3767fc8 | |||
| a409705ae6 | |||
| b9ad3a887b | |||
| 79523b647f | |||
| ef7933eae1 | |||
| a846cdece1 | |||
| 3728c4d943 | |||
| 85f017427f | |||
| ca528f54d7 | |||
| a4e2ada51b | |||
| 39c486396a | |||
| f04a9cc67c | |||
| 4b8a584b8e | |||
| bdedea7e63 | |||
| 967f47bf08 | |||
| af23880ebd | |||
| 024ee8f87a | |||
| fb6105197c | |||
| 7180cd69a3 | |||
| e8760cfd89 | |||
| 0034d3f133 | |||
| a02bc0fa75 | |||
| 24002dbbb9 | |||
| c5c9ac48ef | |||
| 28721e1cd0 | |||
| 6b278b8e64 | |||
| 422d376e92 | |||
| 78d9225ad9 | |||
| 385e8c813b | |||
| de9b6a8c04 | |||
| 76efd88f1d | |||
| 6ef3267a9d | |||
| 374db7bc1a | |||
| d1b08acfbe | |||
| e792cf1494 | |||
| 4caed4cae3 | |||
| 19e08a76bd | |||
| eaf8cc19be | |||
| 2d894ebe64 | |||
| 630590035d | |||
| f593e09b3d | |||
| 7850cff75f | |||
| 3131c24630 | |||
| ac16714397 | |||
| 0cdf8dd014 | |||
| 6c78c84156 | |||
| a94c7056e2 | |||
| 2eb59d35a7 | |||
| 4b521fe624 | |||
| 46559d7a6e | |||
| d10b83cedd | |||
| 35f6a2dc27 | |||
| 1cfeb9ad6b | |||
| 6df9717c84 | |||
| 7e1863ae10 | |||
| 3784692731 | |||
| 4697f3fb19 | |||
| 4aec705625 | |||
| acc19514d7 | |||
| f2f55c2062 | |||
| 4951181a2e | |||
| 7b7ab3f917 | |||
| 7b9640389c | |||
| f434208542 | |||
| 34f3587678 | |||
| e9a12bb577 | |||
| 823e17fb44 | |||
| be7434e584 | |||
| 258f47a3b1 | |||
| cbae97953a | |||
| 9bed95c45c | |||
| d93f67d804 | |||
| 6ebdc2c8fd | |||
| 4792e04be7 | |||
| 7b04334601 | |||
| 57058f091a | |||
| e936b09340 | |||
| 38b4f317a8 | |||
| 561e377199 | |||
| e121340571 | |||
| 3de9380d48 | |||
| 8119d0e169 | |||
| 9237081239 | |||
| 50d26818e0 | |||
| 8f05ca23fa | |||
| 8a2d0439e4 | |||
| d5531e24dc | |||
| 2d182cff02 | |||
| 4aadc91f5c | |||
| 5dbdc5546a | |||
| 54a94911e6 | |||
| 167ac18ae7 | |||
| 84eaec81ec | |||
| 6d9f2391b8 | |||
| dc9886b1cd | |||
| ef60a858a5 | |||
| cbcefb2db0 | |||
| 8600b33b5a | |||
| 3db393b6fd | |||
| 8696a1fdc2 | |||
| 69f393a08b | |||
| 6396f826d3 | |||
| cbb91297ca | |||
| 1c295e6830 | |||
| 254d7cbb24 | |||
| f4d50aa424 | |||
| 88a4f855f2 | |||
| 13c5fd7011 | |||
| f29296306f | |||
| 84c36ca5f9 | |||
| 26efe6629e | |||
| fa388e2784 | |||
| c8bd42dd53 | |||
| 80e00c358d | |||
| df1666e57a | |||
| a372a07f0a | |||
| 15b587adb8 | |||
| 9096f61b27 | |||
| 5fa8626155 | |||
| 059365ffe8 | |||
| fb66ac492f | |||
| f30ba13a24 | |||
| 9176040132 | |||
| 3244b38788 | |||
| 4d701e74f2 | |||
| ce1daebc3d | |||
| 68b08e32a0 | |||
| ca7741a8d8 | |||
| 87b862c191 | |||
| 350e8d74c4 | |||
| c3868dcdb7 | |||
| b0be1f7087 | |||
| bdeaf549ec | |||
| ce24b257ca | |||
| f98edae416 | |||
| 33b6802023 | |||
| 98e541c930 | |||
| f1e51a0857 | |||
| fdc6199b6d | |||
| 5c753bedae | |||
| 4d6a196d04 | |||
| 8a60b5a259 | |||
| bda28c863a | |||
| dabe257fda | |||
| b671e3d5e6 | |||
| 0b63c6896a | |||
| 6f2e223c7d | |||
| d108c967a1 | |||
| ba3022a97d | |||
| 8a52339716 | |||
| ab1d87b956 | |||
| 41c1c56860 | |||
| e0e3731ca6 | |||
| f76084c5b8 | |||
| 98019df3fd | |||
| 41d39a5162 | |||
| 3184d9a084 | |||
| 212451425d | |||
| df399ee1ed | |||
| a9516ad819 | |||
| 82a4c4e9ca | |||
| a40316edea | |||
| 325f5b7921 | |||
| 198616d896 | |||
| 6b09e7b7e3 | |||
| 5557ccf921 | |||
| 17acf25da7 | |||
| 64a3bae4f2 | |||
| 05aa9fd816 | |||
| c71ceb8486 | |||
| 9c0ceda4c8 | |||
| 5007b01ad5 | |||
| 8126d97989 | |||
| 2154398906 | |||
| 41e8999121 | |||
| a5b6c4aeec | |||
| b8150fac82 | |||
| 06339d6f44 | |||
| e7d0adb472 | |||
| 4857f12f7a | |||
| 3f2414abd2 | |||
| e0d11417c5 | |||
| a3fffa9c2b | |||
| 6caa0baaec | |||
| 044c7d65a5 | |||
| 2e7d74b1a0 | |||
| 71cea99db3 | |||
| b9fbc47bbb | |||
| 2c36c0f819 | |||
| 2f5a3c2ccc | |||
| db7b3736d6 | |||
| 8f3139bed4 | |||
| 0be4c876bd | |||
| 5ec4327816 | |||
| 4375631fa6 | |||
| 81ead6e595 | |||
| fe90a5b067 | |||
| 158eebd082 | |||
| fa8caeeffa | |||
| e2547c2137 | |||
| 33a2510c54 | |||
| 57fdbf4093 | |||
| 3fd626fa71 | |||
| 46a2823a94 | |||
| 3d5eba2410 | |||
| 46ddc517a2 | |||
| 9c9f9f4b49 | |||
| a052dcdd06 | |||
| 72cad02a0b | |||
| a7c3845f28 | |||
| e522561485 | |||
| 1f6bb4adfa | |||
| a63690ac60 | |||
| 3d6b1d4c9b | |||
| 5235d7dd49 | |||
| 372355b045 | |||
| fa2636d69d | |||
| e94408cf41 | |||
| 8dc51f8bdc | |||
| 52c216c0aa | |||
| f3158683b5 | |||
| 77c07d131e | |||
| 2e63766abb | |||
| f2d0ae7827 | |||
| d09128fc7b | |||
| 0fd61671ae | |||
| c3574b1f2d | |||
| e5ccf7977e | |||
| 3e2b86ab81 | |||
| 2cff7c5207 | |||
| 7a469ec47a | |||
| 1a3dab98cd | |||
| b48bf93057 | |||
| 942829ee68 | |||
| 4fc6b0b65e | |||
| 9f36ca3a1d | |||
| 047fff647f | |||
| 2097d8ffed | |||
| 98e7bfa10a | |||
| ec28611026 | |||
| b14f16b472 | |||
| 41aa91891d | |||
| 38efd9dc1d | |||
| 8c9f2dcaf5 | |||
| ee2cdcc805 | |||
| e56883f789 | |||
| 0182f7490e | |||
| 05e099335a | |||
| 5ef6a074e7 | |||
| 2573812229 | |||
| b5fa4d9758 | |||
| 12a57f9c01 | |||
| 985bfbd765 | |||
| 634f5fb1dd | |||
| a981db8b1f | |||
| a3001ec2e6 | |||
| 5308f29b6a | |||
| eb0ab8bd4b | |||
| 0714892239 | |||
| 0fb5562d43 | |||
| 088714f052 | |||
| 4d968a2972 | |||
| 1cf87d5558 | |||
| b460995095 | |||
| 2eea120320 | |||
| 21a9c6588f | |||
| aa0a4d3c93 | |||
| e8e47eacbb | |||
| 68ee7972df | |||
| 04a213038c | |||
| d95b3d477d | |||
| 5a9e2aa794 | |||
| a07f3532ad | |||
| e17d6f9ff8 | |||
| b9509fd9a8 | |||
| 00028767d8 | |||
| 1cf05f2b3f | |||
| b33c1eb37d | |||
| 5ccd0852b7 | |||
| a3148837c2 | |||
| 231de4c573 | |||
| f58f3df2bf | |||
| 3f75ea7aa3 | |||
| c9f515347b | |||
| 6f1f605ac8 | |||
| dd77077747 | |||
| ed75fd3e03 | |||
| a487ba019d | |||
| e9852ef6a0 | |||
| a649be53bd | |||
| 2862644154 | |||
| f62a1839bd | |||
| 3600dbc226 | |||
| 01020b0265 | |||
| fcfc152f85 | |||
| ea24532da5 | |||
| 944d9fc836 | |||
| 446dc15cf8 | |||
| 44632af1a9 | |||
| 5f4ce096f8 | |||
| 393c31d148 | |||
| 73149e556b | |||
| 3b6d40011b | |||
| 797530d23a | |||
| 2e4b9c461a | |||
| 3b6825958a | |||
| fa6aa57529 | |||
| 430f61f696 | |||
| 51f7f20cb6 | |||
| 71fed2fda8 | |||
| 76aed24add | |||
| c583bfa197 | |||
| fa3bd05312 | |||
| 99d0414416 | |||
| 31026c4a5a | |||
| 5f6e128c16 | |||
| 1e200701f8 | |||
| 8543c8ad78 | |||
| f2e5ef1b40 | |||
| f6fc9c8157 | |||
| 0486e91d1b | |||
| 0defbbc323 | |||
| b657cf3901 | |||
| 5ff3645af6 | |||
| 84232b46c0 | |||
| b76ffc7f2a | |||
| 972bde3031 | |||
| 8c76c8aa01 | |||
| 4879e70593 | |||
| 27202068ea | |||
| cea3ee8225 | |||
| 6e1f68ef22 | |||
| af22c9bcde | |||
| 7a6ceb3cd2 | |||
| 2bc8d0490e | |||
| 5bb73cd899 | |||
| 6bae630c38 | |||
| bb4fbd6494 | |||
| 64aa4a822a | |||
| d865589d62 | |||
| 03318bfb5f | |||
| 97f51d8180 | |||
| 35d3e15a47 | |||
| c2c341c12d | |||
| 685f9e091a | |||
| 2247005473 | |||
| 1fd5fc12a4 | |||
| 58b6f3640a | |||
| 63135f59b5 | |||
| 0c38817632 | |||
| 5842a766b6 | |||
| 5f1bbdb941 | |||
| 9b425a037c | |||
| 2bcd634112 | |||
| 7cccda8854 | |||
| f4aa9658fe | |||
| b3751605e4 | |||
| d63a380343 | |||
| 46702c45ac | |||
| 487459712b | |||
| cb342d159b | |||
| b05b379492 | |||
| 099f965f24 | |||
| d4160d52ba | |||
| 50e9e7a692 | |||
| d2ae80b7db | |||
| 0cfb1b8895 | |||
| 493e7b53a5 | |||
| f0c469b8e6 | |||
| bbc499708c | |||
| e4e12158e7 | |||
| 0c9dbd7808 | |||
| 83646b1913 | |||
| 56ce18a75d | |||
| 1b2c9d8d3f | |||
| f364ee7be2 | |||
| 910445584a | |||
| 4149230e27 | |||
| 7f77c3563b | |||
| 14c2bf17b4 | |||
| ecbd271eb1 | |||
| e5f9471984 | |||
| 70d7fca2ce | |||
| ca17604dca | |||
| 274a05f630 | |||
| 554da2950e | |||
| be1a8fdebc | |||
| 2159a9ec62 | |||
| 99b9fd190a | |||
| d26f6acc17 | |||
| dc7b450dea | |||
| 27a28047d8 | |||
| 7c0a9d2998 | |||
| c1803bbb4f | |||
| 545428a4d0 | |||
| 53d0e93e43 | |||
| 1eb8c16a76 | |||
| b9c3b14d39 | |||
| 80b88a32e9 | |||
| ed8b0bb007 | |||
| 318920a132 | |||
| c188da1fac | |||
| fa6871ef4d | |||
| d3b157f465 | |||
| 1134c88ee6 | |||
| daec2ee5e0 | |||
| b6ff20c1a5 | |||
| d497c3731c | |||
| 66d8827926 | |||
| 3fb1a64bd1 | |||
| 8747675e12 | |||
| b3f9fa1284 | |||
| a7896a7e97 | |||
| 8f5e1f1bf9 | |||
| 0978691c1f | |||
| 5c7e174ae1 | |||
| a2f6aa7317 | |||
| d483524c83 | |||
| 146f6f7b3d | |||
| 3a388e5843 | |||
| 887e63d34e | |||
| 15ffe0e5cf | |||
| e694fc7e9e | |||
| 338f917cfb | |||
| 487347fc08 | |||
| 36a395a14c | |||
| a7a78f0df8 | |||
| 32bc0e1dff | |||
| c314b5518b | |||
| 0310bbee74 | |||
| ac0a340d0b | |||
| 4d45af8b80 | |||
| 4e270bd62b | |||
| 1dfbbe2a16 | |||
| 32087dd0b6 | |||
| ee71134160 | |||
| a0d87b4467 | |||
| bf217327df | |||
| aa7f76d79d | |||
| 002c56a108 | |||
| 12be045f8d | |||
| 1324532d83 | |||
| 04f8155cbb | |||
| d73f1d2a76 | |||
| 32a83a7479 | |||
| e2851a6b8c | |||
| cec1b39f43 | |||
| 0048ae1b7e | |||
| 972f3c49d0 | |||
| 40f15af259 | |||
| 0157743b8e | |||
| 31375672d7 | |||
| 977560b917 | |||
| 1b177b75a8 | |||
| 44663dd46f | |||
| 48af7e0237 | |||
| 833589ebdf | |||
| 174ed2ed11 | |||
| f234920446 | |||
| 8a2381f9c2 | |||
| d81e8612d3 | |||
| 0201705aa3 | |||
| cb8e9738b6 | |||
| 9aff046cb5 | |||
| f2bd3d1be7 | |||
| ec34a721b3 | |||
| 91291eab78 | |||
| df1d52790c | |||
| 484ccb08c9 | |||
| b3cefefb76 | |||
| a62de4ae41 | |||
| 52978e2ac1 | |||
| 392b280fc7 | |||
| 038fe2890a | |||
| c1e69486d6 | |||
| 6a46e45fee | |||
| d05622a677 | |||
| f7dfafb5af | |||
| 741bff6b7c | |||
| 023bca04f6 | |||
| c731e2a29c | |||
| 4f937d1617 | |||
| 5d17aeb1ae | |||
| fa7fe4d622 | |||
| b27d731c1e | |||
| 8f11f4b51f | |||
| 8934754552 | |||
| f30f9ca2b3 | |||
| 6bfc5b5b79 | |||
| 8c7ea35cc8 | |||
| 9cc83d86d8 | |||
| d51ba76e20 | |||
| 38b65d2afd | |||
| 948eb2455a | |||
| bdccbcdde2 | |||
| 650291caf6 | |||
| affdd15565 | |||
| 462d4bbc9b | |||
| 10242dd583 | |||
| 71f544d41d | |||
| 79b32f5d6e | |||
| 5fd3b3d078 | |||
| 400eed8f02 | |||
| 3d737c34af | |||
| 5809e70e60 | |||
| 48aff2213e | |||
| 084e55f5d5 | |||
| a01537012d | |||
| b7c9394c22 | |||
| 1e2a8ccf03 | |||
| 0d56559460 | |||
| 6f9a4a9468 | |||
| 0fcc4dd80e | |||
| 0a0b58c6bb | |||
| 785306781f | |||
| dd85022178 | |||
| 5f1edca51c | |||
| 6039d918eb | |||
| 183a67fdc4 | |||
| d31aa184af | |||
| 878d6f6b22 | |||
| a65f604d54 | |||
| 23b26724c2 | |||
| 2e54007e75 | |||
| 80806fdfb7 | |||
| 5dd748307c | |||
| 5d6c7f6695 | |||
| ab9299f9c6 | |||
| 5d0f5a6b03 | |||
| 9cfddda9cf | |||
| 21bdac5709 | |||
| 6808062c07 | |||
| a10f17eb99 | |||
| 8551039ae3 | |||
| 3cc890e854 | |||
| 037af4db54 | |||
| 82fa79e783 | |||
| 283675d792 | |||
| 2f430a19e1 | |||
| 98164bf937 | |||
| 19c23ca255 | |||
| 4aaf5307db | |||
| f36a7bab16 | |||
| 458594d43a | |||
| 84122c8049 | |||
| c0450496a8 | |||
| 19dd94ee70 | |||
| e2f742d584 | |||
| 03b6e8acd6 | |||
| a499be87cb | |||
| e8d7c9fe9b | |||
| e2db737d1b | |||
| 94b4c662f8 | |||
| bcc8ed65b5 | |||
| 30d0faa665 | |||
| 815268534f | |||
| cb43ad3a45 | |||
| 32d5b35e2e | |||
| 93cfa18f3d | |||
| 4c752ee2f1 | |||
| e0b46b934e | |||
| 1643881cac | |||
| 98899a640a | |||
| a651ecf6ab | |||
| da6e2b5efb | |||
| 85b3f9746a | |||
| 50dcb5528d | |||
| a5ff4ea80e | |||
| 2a9ef82c35 | |||
| 07e902d8e7 | |||
| bbb74d5a71 | |||
| 58f550a361 | |||
| 726e9530d6 | |||
| 2999dc735b | |||
| 67a32c26b2 | |||
| faef224193 | |||
| 74115a2a1e | |||
| eda383e91d | |||
| 9886e3fef2 | |||
| 9697b20826 | |||
| 87bf61ced3 | |||
| a45e3de9b7 | |||
| 9757b9e44c | |||
| ac70119f9f | |||
| bc21e6426e | |||
| b6594e17e7 | |||
| c88a459d8c | |||
| 00ad80ec84 | |||
| 7913228c9d | |||
| 45b600b665 | |||
| 41dc6bc8ec | |||
| 09914913d8 | |||
| 38c0346d50 | |||
| d59e865d77 | |||
| 06184c0bfe | |||
| 15d1ce3c5b | |||
| 96e152f8e5 | |||
| 10035bd207 | |||
| d311ba1ccf | |||
| 3977e06d83 | |||
| e758310566 | |||
| 3b503707ad | |||
| 03b9b5bdfd | |||
| da0610c99b | |||
| db5c1b317c | |||
| 05a9ed31da | |||
| c1ccf73891 | |||
| 281bb94e51 | |||
| c48c80f51f | |||
| f07d91397c | |||
| cf6e8efdf4 | |||
| db0f694531 | |||
| d4ae9d1e3f | |||
| f3939dcef2 | |||
| af40fc7f8c | |||
| 3d5d6b70f1 | |||
| 2f18f795a2 | |||
| 10a5b5182f | |||
| a915aa0ade | |||
| 090527e0fd | |||
| d396eb771e | |||
| b48a9cd5a4 | |||
| 8b5d16c7b0 | |||
| f5bc5e8504 | |||
| 387bcb3d72 | |||
| f3b89e9f19 | |||
| 8dd8cd945e | |||
| 8f15303620 | |||
| 7cb9113a61 | |||
| 0d3be12b42 | |||
| 54589358a4 | |||
| 56d3e72155 | |||
| 7e54f9997d | |||
| 2796c0a147 | |||
| 2f8b0897aa | |||
| a9c0fa9495 | |||
| 2f257fa083 | |||
| b50fe850a2 | |||
| 529934f827 | |||
| caa8fd4568 | |||
| c7a6fdc418 | |||
| 0ce03767a8 | |||
| 8321c79d20 | |||
| 589584b4e4 | |||
| f0faaabca1 | |||
| 4b07d0b469 | |||
| cdc7f4f75b | |||
| 9249b640e4 | |||
| c0756b5ebf | |||
| a14f8df86c | |||
| 7f94230dca | |||
| ecf83843e7 | |||
| 13cea9c32b | |||
| 50cb642e94 | |||
| c112afbbad | |||
| b1a4f32b1f | |||
| f9e930f006 | |||
| a4e6f4dd78 | |||
| 753c88c484 | |||
| fa7ef591c2 | |||
| eec98072db | |||
| 48b63adf44 | |||
| b0214ec131 | |||
| ba0cf281c9 | |||
| b5171962bf | |||
| 5d8c6fd1d3 | |||
| 59aba774bc | |||
| 0eabc7ceb5 | |||
| 8729cc8a7c | |||
| 5bfc793f06 | |||
| b357a88ecd | |||
| a089d3bc35 | |||
| 04c1c99051 | |||
| d6b7a717db | |||
| b6d9a72999 | |||
| 6f5964a6bd | |||
| d155583ac2 | |||
| 6a2d45ae20 | |||
| 0e1414f46e | |||
| 189c113f04 | |||
| add3546f94 | |||
| 6416fecc90 | |||
| 8ca2084c9d | |||
| 5b84005bac | |||
| 6a33285342 | |||
| 379383b62a | |||
| a5b6a097e6 | |||
| e24fe39546 | |||
| e4aa48bc4b | |||
| 316445d7c9 | |||
| 15872fe070 | |||
| 976e524b59 | |||
| ded3042cd2 | |||
| 677ba4b1e6 | |||
| 400e8b5904 | |||
| 06f304656c | |||
| ee8b7c377d | |||
| ed98931118 | |||
| 08453c109a | |||
| 655ce30eb3 | |||
| a61ae7153e | |||
| 6fc1f4a924 | |||
| 73136fa215 | |||
| 89b694c3f5 | |||
| b2526fbd16 | |||
| 12737ab552 | |||
| 50bfd8dad0 | |||
| 06f9e27fdf | |||
| d84651c9ad | |||
| 05dc4222ee | |||
| d69fcd93c5 | |||
| 702c1110ad | |||
| 6197b9c549 | |||
| 8cad3dfa4b | |||
| daa2e69db1 | |||
| 6a559d3b73 | |||
| b31f6de077 | |||
| 1d5f43d9f6 | |||
| 7c95f6ebcd | |||
| 3921923880 | |||
| 66f5121309 | |||
| dfe2156c16 | |||
| 7492a04210 | |||
| 60fcab11ca | |||
| 4aa40f807a | |||
| 3c25ef6717 | |||
| c0b8ef85fb | |||
| 0fc1749bd7 | |||
| b326f2cdb6 | |||
| 69db10b6ef | |||
| 56a9c5e5c3 | |||
| 2573fbb9f0 | |||
| ffb6218f07 | |||
| 8c7c546942 | |||
| 9d35801154 | |||
| efa9fbd904 | |||
| 713ee03efc | |||
| 441edc8e1c | |||
| 9cd237093c | |||
| 221ac5d6f0 | |||
| f13ec6fa32 | |||
| 8ece8fac15 | |||
| 63dd92da72 | |||
| eb9c64626c | |||
| 183a74d213 | |||
| 1740916e42 | |||
| aba24ae80a | |||
| cad7851624 | |||
| 6e1ed79cbc | |||
| bc60e27f75 | |||
| 3afa03dcd0 | |||
| 3a663cddc3 | |||
| 02fbda4272 | |||
| c07183ad71 | |||
| 292fb84421 | |||
| 290e9fc3d1 | |||
| 70a2630932 | |||
| 7d7eca4a38 | |||
| 03dbf02a5a | |||
| da78b282b4 | |||
| 612b42c7b2 | |||
| 73c4e2e36c | |||
| 0f4ecbcd4b | |||
| 9160fdb45e | |||
| 4210b6aa84 | |||
| d6314a81bb | |||
| 9ce26cf6ea | |||
| 235064c63c | |||
| 1b88c5bc8b | |||
| 887de5e2e3 | |||
| 12d334fff6 | |||
| e2da814588 | |||
| 9b7fbc1a76 | |||
| 1f2dc47fdd | |||
| fcaef7c4e3 | |||
| 07c47bca51 | |||
| b77deb851a | |||
| 86bbbf563d | |||
| f1fe4a9132 | |||
| cb26ccf2ba | |||
| cec654dedb | |||
| 983be4b9e7 | |||
| 332b49261c | |||
| a9b0657fd3 | |||
| 4af610830b | |||
| 031ce8084b | |||
| db6e8b7981 | |||
| 74564d5a1c | |||
| 91a21a559c | |||
| 73b68e32ba | |||
| 0464915a7f | |||
| 4ebf7f60fc | |||
| 4fc3cbfaae | |||
| da59145176 | |||
| bed19d5c25 | |||
| f0f1251da7 | |||
| 4f8a34090e | |||
| e096e7e5cc | |||
| 51d3fe8aed | |||
| 5922324c2b | |||
| f97c2ee746 | |||
| c40148ee94 | |||
| fdd8e41b47 | |||
| 93f232252e | |||
| 93f4a862c3 | |||
| e1bcb667b6 | |||
| 405e21d011 | |||
| a3efa1c030 | |||
| bd107e4ab5 | |||
| 85b45da7c8 | |||
| 8aa602b40d | |||
| 915b70ec05 | |||
| 5297423229 | |||
| 01a683d8ce | |||
| 5ba855f46e | |||
| d983ea89a5 | |||
| cd267de654 | |||
| 130f7129c3 | |||
| be2fc043d1 | |||
| a5a29bd065 | |||
| 73d2d7500e | |||
| d53729083f | |||
| 37bd777094 | |||
| ca70cdaa2c | |||
| 5e88d92265 | |||
| 61296c352a | |||
| 2cd57a4180 | |||
| df1a183214 | |||
| bf00bbe4f0 | |||
| b98f225d0d | |||
| 1311d1b035 | |||
| 966aa0cf48 | |||
| 67f7bcfa96 | |||
| 2c62f35e46 | |||
| 67aacbe6ef | |||
| 53bdf1db9c | |||
| 7e9b77f5fb | |||
| 535e593810 | |||
| c40a522362 | |||
| 32fa162931 | |||
| 65c9ef22c6 | |||
| 44912cc2be | |||
| f9dbc3ffb3 | |||
| 3e770e171e | |||
| 4f3e758c9c | |||
| 0e4f022d9d | |||
| 393c072c18 | |||
| 2539ea8bca | |||
| 02aaeccae5 | |||
| 3ebad4bc01 | |||
| 057a718a39 | |||
| 51a28ac04b | |||
| e8eba95d4a | |||
| afd2ee41bd | |||
| e41d96177f | |||
| 1c54f431ca | |||
| 7ea6373369 | |||
| 8caf6fc368 | |||
| f10ad0650a | |||
| 2f12c59529 | |||
| 086cd12a7e | |||
| 22b521ecf4 | |||
| 31cf899da9 | |||
| ebd636bfc0 | |||
| 8a1913f804 | |||
| f53d02e0eb | |||
| 233cc514c5 | |||
| 5f6963e0f0 | |||
| 25852f92af | |||
| 36d3d83375 | |||
| 867f8cf495 | |||
| add307aafc | |||
| 0c2db206d3 | |||
| fd7f84560b | |||
| 6aed0a5a45 | |||
| 1a9533422d | |||
| 56223ce7b0 | |||
| e39be516c2 | |||
| 55047c74c1 | |||
| d1bd08f2a3 | |||
| 74dc17ee94 | |||
| 942d3430f1 | |||
| eefb7a3d47 | |||
| 923877b3c5 | |||
| 4495a409e5 | |||
| 1bb17dab63 | |||
| f95e102060 | |||
| 0df5824004 | |||
| 3419d42acc | |||
| b5b07e13a8 | |||
| 2275b3019b | |||
| 0a990db1c5 | |||
| b4e1fe7a66 | |||
| 8c4d0b33cd | |||
| 0d1769a27c | |||
| 8f37c21e99 | |||
| 34ddb83a49 | |||
| c964747407 | |||
| b214ef2f4d | |||
| 607d866854 | |||
| f95abaa83c | |||
| ddf8a5e07e | |||
| 3009b2303c | |||
| b9e9ed2067 | |||
| f16a1b114d | |||
| 8afe81608c | |||
| 3be269ba35 | |||
| 58829e019b | |||
| 663127c3b7 | |||
| 9002628f15 | |||
| 076085fd29 | |||
| adaa84d861 | |||
| 8c83132ef7 | |||
| 60b5e07027 | |||
| 58ff2364ba | |||
| fecccdd81c | |||
| b52e49730b | |||
| 9dcbb861d6 | |||
| d2d880b4e0 | |||
| 88101e0ab0 | |||
| 4672f4d430 | |||
| 6dc5eb1d6a | |||
| 48f4d92a38 | |||
| ff872bad11 | |||
| 245e36feba | |||
| 1cdce524a2 | |||
| ba9155f89c | |||
| df80876475 | |||
| 6604e3a013 | |||
| 408469afcf | |||
| 20ab0ffec3 | |||
| 71f0ab997d | |||
| 708d8b62a5 | |||
| 616b9e7134 | |||
| 849d1538ed | |||
| 215359117a | |||
| 5cab2dcf61 | |||
| 30dd4d8f69 | |||
| 0cbdd0a40f | |||
| 38ad939f37 | |||
| cbe70511cd | |||
| 0b30767da0 | |||
| 8ff9b6c510 | |||
| b37570381b | |||
| 34ba5d36d7 | |||
| 856e0fb3ab | |||
| 48860d938c | |||
| 4e5382d828 | |||
| 2d70ac7254 | |||
| 1eb950d630 | |||
| 1441c15255 | |||
| 8e40b350e3 | |||
| 429112df7c | |||
| 0586ac290f | |||
| d42d54b54e | |||
| bec6cb4dda | |||
| 117689a3f9 | |||
| 6ea899f7ed | |||
| a64981a983 | |||
| 2a4350905b | |||
| ebdec45c4b | |||
| 97bea429fc | |||
| 01832f76c2 | |||
| 0aaf3858a0 | |||
| efd4b992cc | |||
| 706859b595 | |||
| 3d43c1a8ec | |||
| eeaee30dd3 | |||
| a4806bed3b | |||
| 8400e599ca | |||
| 28cf285c4d | |||
| 7d3b9f0b4b | |||
| aaedb9bac7 | |||
| ce845156b8 | |||
| 755c77e7c1 | |||
| 30026490ee | |||
| 63200dc0ea | |||
| 8ecd3a986c | |||
| d70d07b0ba | |||
| eaebaf87a6 | |||
| 428762da2b | |||
| 5d1e1ce628 | |||
| 771d9307cc | |||
| 7fccfd1f42 | |||
| 9092da0b8f | |||
| 118a055bc4 | |||
| 068b2916b3 | |||
| e77cd87de1 | |||
| e0c11b3116 | |||
| 8f8cd154e6 | |||
| 5aa2be67b0 | |||
| 7a2ec7c4dc | |||
| 035fac705c | |||
| 6f4b8bf204 | |||
| 57121513a7 | |||
| 7e59864546 | |||
| bbab01b9c3 | |||
| 3b7250f736 | |||
| e315856b1b | |||
| b838adfa32 | |||
| cae4628d7e | |||
| a3d25c5521 | |||
| 7cddb8febf | |||
| 908ebf506f | |||
| fee51b8cdc | |||
| 00ae7b7e72 | |||
| 5476d8d70a | |||
| c49c05f502 | |||
| e7d2639f6e | |||
| fdc5f76aca | |||
| 761f792ed4 | |||
| c1b4a409a5 | |||
| 2d41bea1c8 | |||
| ce88df48fd | |||
| 0a31d3c76b | |||
| cdef2804ea | |||
| b42b71824b | |||
| cd1186205d | |||
| 9d353c53e2 | |||
| a1fc58cc93 | |||
| f63ebe9a8b | |||
| 1c7c456e18 | |||
| e761a6b4d0 | |||
| cddab52a7b | |||
| 3af4b053be | |||
| 210e7857b2 | |||
| a4dc3d7b23 | |||
| 4b95dcfbe9 | |||
| f761059ecd | |||
| a439c48425 | |||
| 99f7ed91af | |||
| cd1fee5f7d | |||
| 231bb5dbfb | |||
| 456f4006cb | |||
| 52d7bc8d5e | |||
| 8f3dd3a4f9 | |||
| 79573b5dbd | |||
| fc1619d91e | |||
| 17f92dd61e | |||
| 2a5874c7b9 | |||
| 03193c2fb4 | |||
| 345a6b964b | |||
| 366cd32060 | |||
| a88250f76f | |||
| 2b2f2d464e | |||
| 3619e54948 | |||
| d6643f50f3 | |||
| 63249fa231 | |||
| 6f91f83d2e | |||
| 2edbcb500f | |||
| ffff89b1a2 | |||
| 3a546c9418 | |||
| 27e5672047 | |||
| 4a19d6d288 | |||
| 4778a4b359 | |||
| fd37deb67b | |||
| 90678ab0fa | |||
| 48b3020f7d | |||
| 9f29ef1a83 | |||
| b156db0c9e | |||
| 9c7f42c58a | |||
| c0bc3e3aea | |||
| fee2e45a8c | |||
| f0343d2264 | |||
| fcf6446201 | |||
| 1180386ac1 | |||
| b021084901 | |||
| c416132bfe | |||
| fec3bd2314 | |||
| 8b4ac5cc39 | |||
| b6c54fa390 | |||
| 6edd466d86 | |||
| f98a8afdd6 | |||
| 9cf1345871 | |||
| 55b82bd1f2 | |||
| 2c3505aec9 | |||
| c5780610c6 | |||
| 081b1f90bf | |||
| a4af894285 | |||
| b407ea9309 | |||
| 19b05b0cae | |||
| 3131ffa454 | |||
| 1fa0cd9a26 | |||
| 5a5b35b154 | |||
| 4b1c5fe438 | |||
| 03510b4a6e | |||
| 30e9f22af4 | |||
| 06bdbbcbba | |||
| f52b7df417 | |||
| 2e4073a8b7 | |||
| 516c833574 | |||
| fd549fe0fa | |||
| b52d4724c2 | |||
| 66cd415568 | |||
| d44293d8a8 | |||
| a0c90983ab | |||
| bb1ce866f8 | |||
| ac4b12107f | |||
| a4452c3539 | |||
| 074277924a | |||
| 6e73c470a4 | |||
| 1963179514 | |||
| bd69c0c5cf | |||
| dcd9920780 | |||
| 8b4eb672e0 | |||
| ec5f6a655c | |||
| e5341acc43 | |||
| 19679d3851 | |||
| 3624e74d13 | |||
| ae33127eed | |||
| 43386bca5c | |||
| 287529480f | |||
| 6fb2f7edec | |||
| 4a5c105654 | |||
| f132fd060f | |||
| 595b9abbdc | |||
| 0415ceffe0 | |||
| 4000bccb3d | |||
| 2e5db3d026 | |||
| ff1775df18 | |||
| b76015210d | |||
| cf1943fb84 | |||
| 086a94c8a5 | |||
| 0ec513eab1 | |||
| 10b41afc0f | |||
| c3aad6b27e | |||
| cc07f4c201 | |||
| 904b4cc924 | |||
| e864071546 | |||
| 979e02a617 | |||
| 9bcc1b9a69 | |||
| 11d2d38a51 | |||
| db812aa773 | |||
| 6c48845da8 | |||
| fb567057df | |||
| 8e365de488 | |||
| a934539462 | |||
| f5b408ef7f | |||
| 7d02f7dd6b | |||
| dbd5774482 | |||
| 11187e5a25 | |||
| aef49c1b8b | |||
| 55dec7c079 | |||
| a3786d7f7e | |||
| 94b48cea30 | |||
| 822fc80494 | |||
| 24a2de892f | |||
| 61d37fe743 | |||
| 43ff6aef6d | |||
| 7ba05ec487 | |||
| f66d119969 | |||
| adc6eb0f0d | |||
| 4673c796aa | |||
| 7b97cbf393 | |||
| e13fcab1e8 | |||
| f095156c22 | |||
| 2aeecada2a | |||
| 00d076b2f8 | |||
| b71896f622 | |||
| 89cd3d8a8a | |||
| bada2e9b7a | |||
| 7e2b915b14 | |||
| ff2980b121 | |||
| 3a01fc7f4e | |||
| 17af2e739a | |||
| 4963f676dc | |||
| 2ba8f21b13 | |||
| c6399e2baf | |||
| c07518f7d1 | |||
| 80378ca2dc | |||
| 0f78fd6710 | |||
| b3809b0910 | |||
| 398ea401df | |||
| 3edc92eebc | |||
| 286c831903 | |||
| 590f8fca52 | |||
| 8a38567538 | |||
| 862c7637cd | |||
| bd4c4438ba | |||
| a84b41c331 | |||
| eae116a598 | |||
| 53edba6e31 | |||
| 892677e57e | |||
| 8d013dc58a | |||
| c573261f24 | |||
| c44888396b | |||
| 724773b517 | |||
| 7c0a0f2da7 | |||
| 954b8066bc | |||
| 88a4583d32 | |||
| ea9d3f00eb | |||
| 3233baf282 | |||
| a942726d30 | |||
| d4865f0d49 | |||
| 57cb8046b1 | |||
| 08f2f509b0 | |||
| 0d4b7e6b7b | |||
| 367e31c08b | |||
| 4d852e33af | |||
| 835b65bd17 | |||
| e6576abc28 | |||
| 326b4ab542 | |||
| 06f8e40a12 | |||
| 51d0b63c54 | |||
| 783d79bba3 | |||
| f86b056a60 | |||
| b383f407a6 | |||
| 1f2789531e | |||
| 9ff5074af0 | |||
| fab9ffcb37 | |||
| 6e96d8e2f4 | |||
| e896bf8a41 | |||
| 033b0735eb | |||
| 4e1009cac7 | |||
| 78c4cc350b | |||
| 97f72f10fe | |||
| 0b69e667f0 | |||
| 753900a4a0 | |||
| 6e72c1f445 | |||
| b474768cd0 | |||
| b6161b1cb2 | |||
| ac874068dd | |||
| 26f16eb0e2 | |||
| b90204bf75 | |||
| 6d7c351c5b | |||
| f562f8061f | |||
| 4078644f3a | |||
| 6e86b10353 | |||
| 9196ee6cfd | |||
| 75a0bd67a0 | |||
| 917fb11348 | |||
| 90a71f990e | |||
| 7330452212 | |||
| 706f23a02d | |||
| d6eb198e36 | |||
| cb2d8619c5 | |||
| a0d982cdb4 | |||
| c048688bfa | |||
| 87b7eb047d | |||
| d6a48882b1 | |||
| 3db3c55bf4 | |||
| e98b1efd21 | |||
| 1a51b383ff | |||
| b1e8eeacd7 | |||
| 61109b6b34 | |||
| b99db562e3 | |||
| 725a5910d7 | |||
| 6af93735fd | |||
| 21c9b6e553 | |||
| 53842df1cb | |||
| 00dcf87246 | |||
| 69fb3ed70c | |||
| 71ecfa425e | |||
| eb36987fec | |||
| e9fcb04d9f | |||
| e66d822b25 | |||
| a74dac8d15 | |||
| 0dd699a355 | |||
| c19fbafcf6 | |||
| ce5aba9799 | |||
| 904819f886 | |||
| a3fa432c9f | |||
| 0c75ddee03 | |||
| ae1242ca4a | |||
| b13d8ec429 | |||
| 7b548b372f | |||
| 14a8a21105 | |||
| 109cdf39be | |||
| 1a52f5132f | |||
| a9e93bfe92 | |||
| 373aabbf5b | |||
| 1d882adf30 | |||
| 3ca99558ff | |||
| 1ba64f82ec | |||
| 0f4d9c80a1 | |||
| b76090ad8d | |||
| fad45bcb1b | |||
| dababea605 | |||
| c03ffc7c3e | |||
| 8dc3d67377 | |||
| 319cbc4947 | |||
| 205d3176a7 | |||
| 32d2dd1124 | |||
| 63bca89427 | |||
| 5e3a6a954a | |||
| 19a0adaf64 | |||
| c1164d8bb9 | |||
| c793b7a9ec | |||
| 6810d4167d | |||
| 5e9cac2ed6 | |||
| afab978e75 | |||
| c170e069ae | |||
| 6d19c10ed6 | |||
| aec5b30a0f | |||
| b5138b89ac | |||
| 9d0640b614 | |||
| 1917131f0f | |||
| 93b0fbf23e | |||
| c0b6e0933d | |||
| 8cccc3c027 | |||
| 2eca482bec | |||
| f3af4d1a4e | |||
| 4a3a1b5b70 | |||
| 77be6de60e | |||
| 744a588308 | |||
| 0737b42364 | |||
| 0ccfbb5754 | |||
| 97e1916248 | |||
| ba2d8eeffc | |||
| a4af699063 | |||
| 10135eeab5 | |||
| dd07cb4c5a | |||
| e5aebbcc97 | |||
| d00948cef3 | |||
| 8431fde428 | |||
| e47d3c4c5a | |||
| fa50529664 | |||
| 4124f2c7ff | |||
| 1d018bbeab | |||
| 08d4597f35 | |||
| 616543e629 | |||
| ab3e981794 | |||
| 2d7c00159e | |||
| 09496c3696 | |||
| b2636ec3ea | |||
| 5478788f98 | |||
| dfb0e1ab90 | |||
| 88cc021588 | |||
| 770ce8cf86 | |||
| f9cc40283c | |||
| 42cf78c555 | |||
| bf679e7e19 | |||
| 9355c68e52 | |||
| c1f12a21b0 | |||
| e553d1acf8 | |||
| 4279beb707 | |||
| 76083c7e67 | |||
| b237a6ee82 | |||
| 6a287972d4 | |||
| bc3a645196 | |||
| dced37cf67 | |||
| 801a11bf4a | |||
| e5936c730d | |||
| f41358a7ee | |||
| 93fae3dece | |||
| a880fcbde7 | |||
| 07671f91e3 | |||
| f2d850e4f9 | |||
| 53221f13ab | |||
| 1d66d04fc1 | |||
| ab16f809a0 | |||
| 51182ecec6 | |||
| 0899a49611 | |||
| d2d80c64da | |||
| 5c1a27890c | |||
| 5810b885a7 | |||
| 35a3b60e5d | |||
| fe10254f0c | |||
| 1768443b87 | |||
| 454cc349a1 | |||
| f0d4890326 | |||
| 818124bc40 | |||
| c12358b15b | |||
| 50bc92b159 | |||
| 722e0c6cc6 | |||
| b1231d3469 | |||
| a7a18787e9 | |||
| f9341ebe86 | |||
| 8258ae5b51 | |||
| 4e015739c4 | |||
| 5fe4310658 | |||
| a04721f0ed | |||
| e54ede1993 | |||
| 027f256b52 | |||
| ab7510ba75 | |||
| 02891de03f | |||
| f20a8aa9b5 | |||
| c9c6f4b631 | |||
| 1ef53b2d50 | |||
| 600bb3f37c | |||
| 1a4e9ef4ad | |||
| f87613ea1b | |||
| 20fd0bef2d | |||
| 24c0b6db9d | |||
| 33af3494f7 | |||
| fd3a5f46f5 | |||
| a1d6cf2106 | |||
| c748a400e9 | |||
| 4af9462b74 | |||
| 5eee5fa952 | |||
| 3b3977cd3e | |||
| 2566623af3 | |||
| eede6c1338 | |||
| 27e1fe603f | |||
| 1acdecb32f | |||
| 483310f08a | |||
| 30d0e0ea2a | |||
| 0b53b0b00a | |||
| 083d6b83aa | |||
| 925fd6a2d6 | |||
| 9a9bd728e7 | |||
| 0b60534904 | |||
| 06c0e7e505 | |||
| 883beb8102 | |||
| 7552f02d05 | |||
| 394757f512 | |||
| cdcb54e084 | |||
| 38dd3d15fa | |||
| d4078044ad | |||
| b0e4e9fa01 | |||
| 2e70900dce | |||
| de12ad6911 | |||
| 414f2b1af0 | |||
| 82c88cb90e | |||
| 30602358e9 | |||
| 1645bd1bb9 | |||
| 2641f77ab6 | |||
| b1554dfafb | |||
| c1979501bb | |||
| d5e29e90c1 | |||
| 5a01455ca3 | |||
| 9574e5a490 | |||
| 90a8d79f4d | |||
| 71830942e6 | |||
| 8be1112040 | |||
| 8ca5d4e494 | |||
| 3a4213ff02 | |||
| 5f402c0c31 | |||
| 84a790d954 | |||
| 872308b277 | |||
| 5a3490da07 | |||
| 711e647fd2 | |||
| fdfba32734 | |||
| 9d5036e580 | |||
| c5e0a6acd0 | |||
| a5bbe074a6 | |||
| 78a0de9f63 | |||
| c21d244bbb | |||
| eacf5f1c6d | |||
| d380695958 | |||
| 6d6048c9a1 | |||
| c523b99ddf | |||
| 4a03e4c700 | |||
| cdf526c24d | |||
| d249df4521 | |||
| 012d41e6a5 | |||
| 37f5ad4a5f | |||
| 97e86ebe5f | |||
| 84c7f22f11 | |||
| d819683bf3 | |||
| 5d033cb991 | |||
| cef1982db1 | |||
| 9daa48bff4 | |||
| dd5da5d657 | |||
| 54d8958f9c | |||
| 217e527cb3 | |||
| e006f8ff04 | |||
| 016779276c | |||
| 93dc2b2c0d | |||
| 43b99f3fbe | |||
| 77b148e6db | |||
| 3d07d486b2 | |||
| ee35a986a7 | |||
| 8b185359ef | |||
| c9ac66d0d8 | |||
| 360e769758 | |||
| c4715738db | |||
| b35856b2f3 | |||
| dafc6fbb2b | |||
| 1a184e4e2e | |||
| f789831ba9 | |||
| dfb88dedb4 | |||
| 686376231a | |||
| 791a5f0e72 | |||
| 863b976726 | |||
| f72b7b9d1d | |||
| bec5451742 | |||
| f8960081b2 | |||
| 186d6baaaa | |||
| e7054fb090 | |||
| e9709979de | |||
| c5bcc31f22 | |||
| 1b46340737 | |||
| 8dd497a9f1 | |||
| 39eda77bb0 | |||
| 0fe3f9f7d7 | |||
| 025ae1f7b1 | |||
| 268d57b5f8 | |||
| 5279b7e743 | |||
| e18f677885 | |||
| 615f47676b | |||
| bdf6e6c832 | |||
| be6033bbb8 | |||
| c2b83032f8 | |||
| f925853bb5 | |||
| 00211e9135 | |||
| 5080ba19df | |||
| 6fd494aec2 | |||
| 72769b9017 | |||
| 71c8ff92a2 | |||
| 31b9be10a4 | |||
| 754f3b92ed | |||
| a1d00ed07b | |||
| c4167010e3 | |||
| 92e58bf5eb | |||
| c9fc501377 | |||
| cf6051cbfe | |||
| 3808741d30 | |||
| 3217880ec2 | |||
| f1c6d7b56f | |||
| 6365853620 | |||
| ebc735f49e | |||
| acfe2b5d90 | |||
| c0baa8282c | |||
| 827270f597 | |||
| da1172f268 | |||
| 21526c830a | |||
| ecdbf602d9 | |||
| c192807ea7 | |||
| 817f324a13 | |||
| c8f3f9b06b | |||
| d119620775 | |||
| 863b23408c | |||
| f6b51a43a2 | |||
| c09fa80aca | |||
| 7ade369d3e | |||
| c6f5a9b984 | |||
| b43a2ff6cc | |||
| e7914b3b7a | |||
| f8f08b8d46 | |||
| 450b60114c | |||
| 534e7f6acd | |||
| 16e79e3bc5 | |||
| ce04079e62 | |||
| ee18592d0f | |||
| 549db6db29 | |||
| c57722a10f | |||
| a18ee8efa5 | |||
| 6995f7fb7e | |||
| d0aeb0072c | |||
| 5e86165add | |||
| b4b0ec400b | |||
| 2b2061df1d | |||
| 7895ca9e8f | |||
| 9b25481ac8 | |||
| 704e2a0894 | |||
| 01b30ee264 | |||
| 519192a2b8 | |||
| 44a6ffef17 | |||
| a836552002 | |||
| faeb40f7c4 | |||
| f09e7ab08c | |||
| 0d65535a49 | |||
| e674c8b9c7 | |||
| 954100837b | |||
| 809904f268 | |||
| 39ffc159eb | |||
| 0f708da558 | |||
| cbbfe23b81 | |||
| cd2f3a3a5c | |||
| 03532e0d20 | |||
| 0cb233c412 | |||
| 8d4c3cc7d6 | |||
| a2843c2352 | |||
| 1c52b10253 | |||
| 0960281a15 | |||
| 891cf5584c | |||
| 0dfbf04a75 | |||
| 0185fdf67e | |||
| aec4a0f301 | |||
| cdde244b46 | |||
| 63fae9d658 | |||
| 803a8be664 | |||
| 43eed0a3ba | |||
| f1677c439a | |||
| 8803f55af9 | |||
| 3e3b80e5c1 | |||
| bae3f3950a | |||
| c6035b97e6 | |||
| 5b53e4e6e8 | |||
| 7ce44fc213 | |||
| cef7692b91 | |||
| 5a3b472a50 | |||
| eaf4275c61 | |||
| dd5aff7029 | |||
| 71e23c2304 | |||
| d7e37c7b56 | |||
| 7777457d50 | |||
| 670d4d5029 | |||
| 7a9822f533 | |||
| e26020a782 | |||
| b9d8262153 | |||
| 0767d8a8bb | |||
| 288af2017a | |||
| 6f50bbc49d | |||
| 4358d99cb0 | |||
| 6a7fc39328 | |||
| 4f9ff68348 | |||
| aed5fa9949 | |||
| 77d5bf7b80 | |||
| 6671008f35 | |||
| 0596637103 | |||
| 70d7e52335 | |||
| afa1569043 | |||
| 292aea9404 | |||
| 8a9558f06f | |||
| bac69f84de | |||
| 78b6d375a7 | |||
| 17f6ae8dbb | |||
| 23e75246cb | |||
| e27b8977b4 | |||
| 2ed4a27395 | |||
| 83e3ee4b6c | |||
| 50fba1d79f | |||
| 9572d48a03 | |||
| 51d8d9f6be | |||
| b0e70a45d0 | |||
| 4b61796e41 | |||
| 4844c47f6a | |||
| 968edbe972 | |||
| 69d72805be | |||
| 1eba2f9cc5 | |||
| 6641c154ac | |||
| 6fdfca7d38 | |||
| 62427b821f | |||
| 4a16dd2717 | |||
| 9a15c9fb1e | |||
| 86fb16b3b8 | |||
| db5bab4b99 | |||
| aff71f6147 | |||
| 275e1cb92b | |||
| a3ee4eb038 | |||
| af7369b6b0 | |||
| 3fbb14a5cf | |||
| 372c7e5740 | |||
| 70e103d1b9 | |||
| 6b4635c403 | |||
| b2724beb09 | |||
| a6daa83472 | |||
| 7f9306dec9 | |||
| 9ad0c6a23c | |||
| 3fdea479bd | |||
| 4a2994c9d7 | |||
| bc707a8f67 | |||
| 597d89ead2 | |||
| bafd8ea248 | |||
| 4f9ce0c88d | |||
| 5c899afa22 | |||
| 1562d2b1ab | |||
| 8bde5765ab | |||
| 2fbbd52a0e | |||
| 10d71f2365 | |||
| 7db8d06fbf | |||
| ebde55caab | |||
| 71f20dd7b6 | |||
| b267aee59c | |||
| b7a5fe292b | |||
| 33640c6bf3 | |||
| f7585c91af | |||
| 9b902b614d | |||
| 7218c1ba66 | |||
| 19dd79f771 | |||
| e9d6adeab1 | |||
| 3a894a9a5f | |||
| 424e529aba | |||
| d73b792b6c | |||
| b39dd26509 | |||
| 7e088fd0ec | |||
| 6d2a97d97c | |||
| f9dcab79b2 | |||
| 3644e4d51a | |||
| ae53d6cbbc | |||
| c6c6be7ae0 | |||
| b98298ab98 | |||
| ccf09ceddf | |||
| bb1977b17a | |||
| 476e8dd7d1 | |||
| ecedcaa5a3 | |||
| 07eee8a2a1 | |||
| e45cfb0ee3 | |||
| 231f4c3573 | |||
| 40af610e8f |
@@ -0,0 +1,16 @@
|
||||
BasedOnStyle: WebKit
|
||||
Standard: Cpp03
|
||||
AlignAfterOpenBracket: false
|
||||
AlignEscapedNewlinesLeft: true
|
||||
AlwaysBreakAfterDefinitionReturnType: None
|
||||
BreakBeforeBraces: Allman
|
||||
BreakConstructorInitializersBeforeComma: false
|
||||
BreakTemplateDeclarations: Yes
|
||||
ColumnLimit: 80
|
||||
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||
ConstructorInitializerIndentWidth: 0
|
||||
IndentCaseLabels: false
|
||||
SortIncludes: false
|
||||
AlignTrailingComments: false
|
||||
|
||||
SpacesInAngles: true
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
# Use, modification, and distribution are
|
||||
# subject to the Boost Software License, Version 1.0. (See accompanying
|
||||
# file LICENSE.txt)
|
||||
#
|
||||
# Copyright Rene Rivera 2020.
|
||||
|
||||
# For Drone CI we use the Starlark scripting language to reduce duplication.
|
||||
# As the yaml syntax for Drone CI is rather limited.
|
||||
#
|
||||
#
|
||||
globalenv={'ADD_UBUNTU_TOOLCHAIN_PPA': 'true'}
|
||||
linuxglobalimage="cppalliance/droneubuntu1604:1"
|
||||
windowsglobalimage="cppalliance/dronevs2019"
|
||||
|
||||
def main(ctx):
|
||||
return [
|
||||
linux_cxx("g++-7 14", "g++-7", packages="g++-7", buildtype="boost", image=linuxglobalimage, environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-7', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
linux_cxx("g++-7 17", "g++-7", packages="g++-7", buildtype="boost", image=linuxglobalimage, environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-7', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
|
||||
linux_cxx("g++-8 14", "g++-8", packages="g++-8", buildtype="boost", image=linuxglobalimage, environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
linux_cxx("g++-8 17", "g++-8", packages="g++-8", buildtype="boost", image=linuxglobalimage, environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-8', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
|
||||
linux_cxx("g++-9 14", "g++-9", packages="g++-9", buildtype="boost", image="cppalliance/droneubuntu1404:1", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
linux_cxx("g++-9 17", "g++-9", packages="g++-9", buildtype="boost", image="cppalliance/droneubuntu1404:1", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
linux_cxx("g++-9 2a", "g++-9", packages="g++-9", buildtype="boost", image="cppalliance/droneubuntu1404:1", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-9', 'CXXSTD': '2a', }, globalenv=globalenv),
|
||||
|
||||
linux_cxx("g++-10 14", "g++-10", packages="g++-10", image="cppalliance/droneubuntu2004:1", buildtype="boost", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
linux_cxx("g++-10 17", "g++-10", packages="g++-10", image="cppalliance/droneubuntu2004:1", buildtype="boost", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
linux_cxx("g++-10 20", "g++-10", packages="g++-10", image="cppalliance/droneubuntu2004:1", buildtype="boost", environment={'TOOLSET': 'gcc', 'COMPILER': 'g++-10', 'CXXSTD': '20', }, globalenv=globalenv),
|
||||
|
||||
linux_cxx("clang++-7 14", "clang++-7", packages="clang-7", llvm_os="xenial", llvm_ver="7", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-7', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
linux_cxx("clang++-7 17", "clang++-7", packages="clang-7", llvm_os="xenial", llvm_ver="7", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-7', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
|
||||
linux_cxx("clang++-8 14", "clang++-8", packages="clang-8", llvm_os="xenial", llvm_ver="8", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-8', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
linux_cxx("clang++-8 17", "clang++-8", packages="clang-8", llvm_os="xenial", llvm_ver="8", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-8', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
|
||||
linux_cxx("clang++-9 14", "clang++-9", packages="clang-9", llvm_os="xenial", llvm_ver="9", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
linux_cxx("clang++-9 17", "clang++-9", packages="clang-9", llvm_os="xenial", llvm_ver="9", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-9', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
|
||||
linux_cxx("clang++-10 14", "clang++-10", packages="clang-10", llvm_os="xenial", llvm_ver="10", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
linux_cxx("clang++-10 17", "clang++-10", packages="clang-10", llvm_os="xenial", llvm_ver="10", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
linux_cxx("clang++-10 20", "clang++-10", packages="clang-10", llvm_os="xenial", llvm_ver="10", buildtype="boost", image="cppalliance/droneubuntu1804:1", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++-10', 'CXXSTD': '20', }, globalenv=globalenv),
|
||||
|
||||
osx_cxx("XCode-11.7 14", "clang++", packages="", buildtype="boost", xcode_version="11.7", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': '14', }, globalenv=globalenv),
|
||||
osx_cxx("XCode-11.7 17", "clang++", packages="", buildtype="boost", xcode_version="11.7", environment={'TOOLSET': 'clang', 'COMPILER': 'clang++', 'CXXSTD': '17', }, globalenv=globalenv),
|
||||
]
|
||||
|
||||
# from https://github.com/boostorg/boost-ci
|
||||
load("@boost_ci//ci/drone/:functions.star", "linux_cxx","windows_cxx","osx_cxx","freebsd_cxx")
|
||||
Executable
+3
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
Executable
+3
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
Executable
+3
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
Executable
+42
@@ -0,0 +1,42 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -ex
|
||||
export TRAVIS_BUILD_DIR=$(pwd)
|
||||
export DRONE_BUILD_DIR=$(pwd)
|
||||
export TRAVIS_BRANCH=$DRONE_BRANCH
|
||||
export VCS_COMMIT_ID=$DRONE_COMMIT
|
||||
export GIT_COMMIT=$DRONE_COMMIT
|
||||
export PATH=~/.local/bin:/usr/local/bin:$PATH
|
||||
|
||||
echo '==================================> BEFORE_INSTALL'
|
||||
|
||||
. .drone/before-install.sh
|
||||
|
||||
echo '==================================> INSTALL'
|
||||
|
||||
cd ..
|
||||
git clone -b $TRAVIS_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
cd boost-root
|
||||
git submodule update --init tools/build
|
||||
git submodule update --init libs/config
|
||||
git submodule update --init tools/boost_install
|
||||
git submodule update --init libs/headers
|
||||
git submodule update --init tools/boostdep
|
||||
cp -r $TRAVIS_BUILD_DIR/* libs/graph
|
||||
python tools/boostdep/depinst/depinst.py graph
|
||||
./bootstrap.sh
|
||||
./b2 headers
|
||||
|
||||
echo '==================================> BEFORE_SCRIPT'
|
||||
|
||||
. $DRONE_BUILD_DIR/.drone/before-script.sh
|
||||
|
||||
echo '==================================> SCRIPT'
|
||||
|
||||
echo "using $TOOLSET : : $COMPILER : $OPTIONS ;" > ~/user-config.jam
|
||||
(cd libs/config/test && ../../../b2 cxxstd=$CXXSTD config_info_travis_install toolset=$TOOLSET && ./config_info_travis)
|
||||
(cd libs/graph/test && ../../../b2 -j3 cxxstd=$CXXSTD toolset=$TOOLSET define=CI_SUPPRESS_KNOWN_ISSUES)
|
||||
|
||||
echo '==================================> AFTER_SUCCESS'
|
||||
|
||||
. $DRONE_BUILD_DIR/.drone/after-success.sh
|
||||
Executable
+42
@@ -0,0 +1,42 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -ex
|
||||
export TRAVIS_BUILD_DIR=$(pwd)
|
||||
export DRONE_BUILD_DIR=$(pwd)
|
||||
export TRAVIS_BRANCH=$DRONE_BRANCH
|
||||
export VCS_COMMIT_ID=$DRONE_COMMIT
|
||||
export GIT_COMMIT=$DRONE_COMMIT
|
||||
export PATH=~/.local/bin:/usr/local/bin:$PATH
|
||||
|
||||
echo '==================================> BEFORE_INSTALL'
|
||||
|
||||
. .drone/before-install.sh
|
||||
|
||||
echo '==================================> INSTALL'
|
||||
|
||||
cd ..
|
||||
git clone -b $TRAVIS_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
cd boost-root
|
||||
git submodule update --init tools/build
|
||||
git submodule update --init libs/config
|
||||
git submodule update --init tools/boost_install
|
||||
git submodule update --init libs/headers
|
||||
git submodule update --init tools/boostdep
|
||||
cp -r $TRAVIS_BUILD_DIR/* libs/graph
|
||||
python tools/boostdep/depinst/depinst.py graph
|
||||
./bootstrap.sh
|
||||
./b2 headers
|
||||
|
||||
echo '==================================> BEFORE_SCRIPT'
|
||||
|
||||
. $DRONE_BUILD_DIR/.drone/before-script.sh
|
||||
|
||||
echo '==================================> SCRIPT'
|
||||
|
||||
echo "using $TOOLSET : : $COMPILER : $OPTIONS ;" > ~/user-config.jam
|
||||
(cd libs/config/test && ../../../b2 cxxstd=$CXXSTD config_info_travis_install toolset=$TOOLSET && ./config_info_travis)
|
||||
(cd libs/graph/test && ../../../b2 -j3 cxxstd=$CXXSTD toolset=$TOOLSET define=CI_SUPPRESS_KNOWN_ISSUES)
|
||||
|
||||
echo '==================================> AFTER_SUCCESS'
|
||||
|
||||
. $DRONE_BUILD_DIR/.drone/after-success.sh
|
||||
@@ -0,0 +1,19 @@
|
||||
# Code owners for Boost.Graph
|
||||
#
|
||||
# When a PR is opened, GitHub automatically requests review from the matching
|
||||
# owners listed below. The order of rules matters: later, more specific rules
|
||||
# override earlier, more general ones.
|
||||
#
|
||||
# Authoritative maintainer list: meta/libraries.json
|
||||
# Contact details: CONTRIBUTING.md#maintainers
|
||||
|
||||
# Default reviewers for everything
|
||||
* @jeremy-murphy @becheler
|
||||
|
||||
# Documentation, contributor-facing files, and CI configuration
|
||||
/doc/ @becheler
|
||||
/README.md @becheler
|
||||
/CONTRIBUTING.md @becheler
|
||||
/SECURITY.md @becheler
|
||||
/CODE_OF_CONDUCT.md @becheler
|
||||
/.github/ @becheler
|
||||
@@ -0,0 +1,84 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Report a defect or unexpected behavior in Boost.Graph
|
||||
title: ''
|
||||
labels: ''
|
||||
type: Bug
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
<!--
|
||||
Thank you for taking the time to file a bug report. Please fill in as much
|
||||
of the template below as you can. Reports without a reproducer or
|
||||
environment details are very hard to triage.
|
||||
-->
|
||||
|
||||
### Before filing
|
||||
|
||||
- [ ] I searched the [existing issues](https://github.com/boostorg/graph/issues?q=is%3Aissue) and did not find a duplicate.
|
||||
- [ ] I have reproduced the bug against the `develop` branch or the latest Boost release.
|
||||
- [ ] I have a minimal reproducer (or I will paste my full failing code below).
|
||||
|
||||
### Boost version
|
||||
|
||||
<!--
|
||||
You can find the version number in `<boost/version.hpp>`, or by running
|
||||
`git log -1` in your local Boost.Graph checkout.
|
||||
-->
|
||||
|
||||
### Compiler family
|
||||
|
||||
- [ ] GCC / g++
|
||||
- [ ] Clang / clang++
|
||||
- [ ] MSVC (Visual Studio)
|
||||
- [ ] Intel / oneAPI
|
||||
- [ ] Other (specify below)
|
||||
|
||||
Exact compiler version: <!-- e.g. g++ 13.2.0, clang 17.0.6, MSVC 19.39 -->
|
||||
|
||||
### Standard library
|
||||
|
||||
- [ ] libstdc++
|
||||
- [ ] libc++
|
||||
- [ ] MSVC STL
|
||||
- [ ] Other (specify below)
|
||||
|
||||
### Operating system
|
||||
|
||||
- [ ] Linux
|
||||
- [ ] macOS
|
||||
- [ ] Windows
|
||||
- [ ] Other (specify below)
|
||||
|
||||
### Kind of component affected
|
||||
|
||||
- [ ] Graph data structure (e.g. `adjacency_list`, `adjacency_matrix`)
|
||||
- [ ] Algorithm (e.g. `dijkstra_shortest_paths`, `breadth_first_search`)
|
||||
- [ ] Property map
|
||||
- [ ] I/O or file-format reader (e.g. `read_graphml`, `read_graphviz`)
|
||||
- [ ] Visitor / event hooks
|
||||
- [ ] Other (specify below)
|
||||
|
||||
Exact name of the affected component: <!-- e.g. dijkstra_shortest_paths -->
|
||||
|
||||
### Steps to reproduce
|
||||
|
||||
<!--
|
||||
A minimal compiling program that demonstrates the problem is ideal.
|
||||
A [Compiler Explorer](https://godbolt.org/z/9Esszr9Ga) link is even better.
|
||||
-->
|
||||
|
||||
### Expected behavior
|
||||
|
||||
### Actual behavior
|
||||
|
||||
<!--
|
||||
Include compiler error messages or runtime output verbatim, with file and
|
||||
line numbers where applicable.
|
||||
-->
|
||||
|
||||
### Are you willing to help?
|
||||
|
||||
- [ ] I'd like to submit a fix as a pull request.
|
||||
- [ ] I can help diagnose or test a candidate fix.
|
||||
- [ ] I'm only reporting the issue.
|
||||
@@ -0,0 +1,9 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Design discussion or open-ended question
|
||||
url: https://github.com/boostorg/graph/discussions
|
||||
about: |
|
||||
For "should we...?" questions, design exploration, or anything not
|
||||
yet a concrete proposal, please start a GitHub Discussion. Issues
|
||||
are reserved for bugs, feature requests with a concrete proposal,
|
||||
and documentation problems.
|
||||
@@ -0,0 +1,59 @@
|
||||
---
|
||||
name: Documentation issue
|
||||
about: Report missing, incorrect, or unclear documentation
|
||||
title: ''
|
||||
labels: docs
|
||||
type: Task
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
<!--
|
||||
Documentation problems are real issues. Thanks for taking the time to
|
||||
report one.
|
||||
-->
|
||||
|
||||
### Before filing
|
||||
|
||||
- [ ] I searched the [existing issues](https://github.com/boostorg/graph/issues?q=is%3Aissue+label%3Adocs) and did not find a duplicate.
|
||||
- [ ] I checked the latest version of the documentation on `develop`.
|
||||
|
||||
### Kind of problem
|
||||
|
||||
- [ ] Documentation is missing entirely
|
||||
- [ ] Documentation is incorrect or out of date
|
||||
- [ ] Explanation is unclear or confusing
|
||||
- [ ] Example does not compile
|
||||
- [ ] Example compiles but does not produce the documented result
|
||||
- [ ] Dead link or broken cross-reference
|
||||
- [ ] Other (specify below)
|
||||
|
||||
### Where is the issue?
|
||||
|
||||
<!--
|
||||
A link to the page, or the path to the file (for example,
|
||||
`doc/quick_tour.html` or `include/boost/graph/dijkstra_shortest_paths.hpp`).
|
||||
-->
|
||||
|
||||
### What is wrong, missing, or unclear?
|
||||
|
||||
<!--
|
||||
For example: an example does not compile, an algorithm's complexity is
|
||||
not stated, a parameter is undocumented, an explanation is confusing.
|
||||
-->
|
||||
|
||||
### What did you expect to find?
|
||||
|
||||
<!-- What information would have helped you? -->
|
||||
|
||||
### Suggested wording (optional)
|
||||
|
||||
<!--
|
||||
If you already have an idea of what the docs should say, paste a draft
|
||||
here.
|
||||
-->
|
||||
|
||||
### Are you willing to help?
|
||||
|
||||
- [ ] I'd like to submit a docs pull request.
|
||||
- [ ] I can review a candidate fix.
|
||||
- [ ] I'm only reporting the issue.
|
||||
@@ -0,0 +1,72 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest a new algorithm, API addition, or enhancement
|
||||
title: ''
|
||||
labels: ''
|
||||
type: Feature
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
<!--
|
||||
Thanks for proposing an addition to Boost.Graph.
|
||||
|
||||
If you want to explore an idea or discuss whether a feature would be
|
||||
worthwhile before committing to a concrete proposal, please start a
|
||||
GitHub Discussion instead:
|
||||
https://github.com/boostorg/graph/discussions
|
||||
|
||||
This template is for requests with a clear, actionable proposal: a
|
||||
specific algorithm, API, or enhancement that a maintainer could
|
||||
reasonably implement or review.
|
||||
-->
|
||||
|
||||
### Before filing
|
||||
|
||||
- [ ] I searched the [existing issues](https://github.com/boostorg/graph/issues?q=is%3Aissue) and did not find a duplicate.
|
||||
- [ ] This is a concrete proposal, not an open-ended design question.
|
||||
|
||||
### Kind of addition
|
||||
|
||||
- [ ] New algorithm
|
||||
- [ ] New data structure
|
||||
- [ ] New property map or utility
|
||||
- [ ] New I/O format reader or writer
|
||||
- [ ] Extension to an existing component
|
||||
- [ ] Performance improvement
|
||||
- [ ] Other (specify below)
|
||||
|
||||
### Motivation
|
||||
|
||||
<!--
|
||||
What problem does this feature solve? Who would use it, and in what
|
||||
context?
|
||||
-->
|
||||
|
||||
### Proposed addition
|
||||
|
||||
<!--
|
||||
A new algorithm, a new data structure, an extension to an existing
|
||||
component, or something else? If you have a rough API sketch, paste it
|
||||
here.
|
||||
-->
|
||||
|
||||
### Relation to existing Boost.Graph components
|
||||
|
||||
<!--
|
||||
Does this overlap with or build on something that already exists in the
|
||||
library (for example, an existing algorithm or property map)?
|
||||
-->
|
||||
|
||||
### Prior art
|
||||
|
||||
- [ ] Reference paper or textbook (cite below)
|
||||
- [ ] Implementation in another library (link below)
|
||||
- [ ] None / original idea
|
||||
|
||||
References: <!-- paste DOI, ISBN, or URL -->
|
||||
|
||||
### Are you willing to contribute?
|
||||
|
||||
- [ ] I'd like to submit the implementation as a pull request.
|
||||
- [ ] I can help with review or testing, but not the implementation.
|
||||
- [ ] I'm only proposing the idea.
|
||||
@@ -0,0 +1,50 @@
|
||||
<!--
|
||||
Thanks for contributing to Boost.Graph! A few notes before you fill this in:
|
||||
|
||||
* Target the `develop` branch.
|
||||
* New contributions must be licensed under the
|
||||
[Boost Software License 1.0](https://www.boost.org/LICENSE_1_0.txt).
|
||||
* Please link any related issue with `Fixes #N` or `Refs #N`.
|
||||
-->
|
||||
|
||||
### Before submitting
|
||||
|
||||
- [ ] This PR targets the `develop` branch.
|
||||
- [ ] I searched for an existing PR or issue covering the same change.
|
||||
- [ ] My contribution is licensed under the Boost Software License 1.0.
|
||||
|
||||
### Type of change
|
||||
|
||||
- [ ] Bug fix
|
||||
- [ ] New feature or API addition
|
||||
- [ ] Refactor (no behavior change)
|
||||
- [ ] Documentation
|
||||
- [ ] Build, CI, or tooling
|
||||
- [ ] Other (specify below)
|
||||
|
||||
### Does this PR introduce a breaking change?
|
||||
|
||||
- [ ] Yes (describe migration impact below)
|
||||
- [ ] No
|
||||
|
||||
### What this PR does
|
||||
|
||||
<!-- A short summary of the change. -->
|
||||
|
||||
### Motivation
|
||||
|
||||
<!-- Why is this needed? Link related issue with `Fixes #N` or `Refs #N`. -->
|
||||
|
||||
### Testing
|
||||
|
||||
<!--
|
||||
How did you verify the change? Which compilers and standard libraries did
|
||||
you build against? Were new tests added under `test/`?
|
||||
-->
|
||||
|
||||
### Checklist
|
||||
|
||||
- [ ] Existing tests pass (`b2` in the `test/` directory).
|
||||
- [ ] New behavior is covered by a test, or this is a docs / build / refactor change.
|
||||
- [ ] Documentation was updated if user-facing behavior changed.
|
||||
- [ ] No new compiler warnings on the platforms I built against.
|
||||
@@ -0,0 +1,48 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Print a markdown table comparing compiler-warning counts between two CI log archives.
|
||||
|
||||
Usage: warn_table.py BASELINE.zip AFTER.zip
|
||||
|
||||
A warning is a line matching 'file:line:col: warning:' (clang/gcc) or 'warning Cxxxx'
|
||||
(msvc). Linker, "N warnings generated" summary, and CI-runner lines are not counted.
|
||||
"""
|
||||
import re
|
||||
import sys
|
||||
import zipfile
|
||||
|
||||
WARNING = re.compile(r":\d+:\d+: warning:|warning C\d+")
|
||||
|
||||
|
||||
def counts(zip_path):
|
||||
"""Map each CI job to its warning count, read from the run's log archive."""
|
||||
result = {}
|
||||
with zipfile.ZipFile(zip_path) as archive:
|
||||
for entry in archive.namelist():
|
||||
# Top-level per-job logs are named like "12_ubuntu (gcc-14, 14).txt".
|
||||
if "/" in entry or not entry.endswith(".txt"):
|
||||
continue
|
||||
job = re.sub(r"^\d+_", "", entry[:-4])
|
||||
log = archive.read(entry).decode("utf-8", "replace")
|
||||
result[job] = sum(1 for line in log.splitlines() if WARNING.search(line))
|
||||
return result
|
||||
|
||||
|
||||
def main(baseline_zip, after_zip):
|
||||
baseline = counts(baseline_zip)
|
||||
after = counts(after_zip)
|
||||
print("| Job | Baseline | After | Delta |")
|
||||
print("|-----|---------:|------:|------:|")
|
||||
for job in sorted(baseline.keys() | after.keys()):
|
||||
if "cmake" in job: # cmake jobs build only the library, they never warn
|
||||
continue
|
||||
before = baseline.get(job, 0)
|
||||
now = after.get(job, 0)
|
||||
diff = now - before
|
||||
delta = f"{diff:+d}" if diff else "0"
|
||||
print(f"| {job} | {before} | {now} | {delta} |")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) != 3:
|
||||
sys.exit("usage: warn_table.py BASELINE.zip AFTER.zip")
|
||||
main(sys.argv[1], sys.argv[2])
|
||||
@@ -0,0 +1,357 @@
|
||||
# Copyright 2020 Evan Miller
|
||||
# Copyright 2020 Matt Borland
|
||||
# Copyright 2021 John Maddock
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
|
||||
name: CI
|
||||
on: [ push, pull_request ]
|
||||
jobs:
|
||||
ubuntu:
|
||||
runs-on: ubuntu-24.04
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
compiler: [ gcc-14, clang-19 ]
|
||||
cxxstd: [ 14, 17, 20, 23 ]
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
with:
|
||||
fetch-depth: '0'
|
||||
- uses: mstachniuk/ci-skip@v1
|
||||
with:
|
||||
commit-filter: '[skip ci];[ci skip];[CI SKIP];[SKIP CI];***CI SKIP***;***SKIP CI***;[windows];[Windows];[WINDOWS];[apple];[Apple];[APPLE]'
|
||||
commit-filter-separator: ';'
|
||||
fail-fast: true
|
||||
- name: Set ENV
|
||||
run: |
|
||||
echo ${{ matrix.compiler }} | awk '/^gcc/ { print "TOOLSET=gcc" } /^clang/ { print "TOOLSET=clang" }' >> $GITHUB_ENV
|
||||
echo ${{ matrix.compiler }} | awk '/^gcc/ { gsub(/gcc/,"CXX=g++"); print; } /^clang/ { gsub(/clang/,"CXX=clang++"); print; }' >> $GITHUB_ENV
|
||||
- name: Install packages
|
||||
run: sudo apt install ${{ matrix.compiler }}
|
||||
- name: Checkout main boost
|
||||
run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
|
||||
- name: Update tools/boostdep
|
||||
run: git submodule update --init tools/boostdep
|
||||
working-directory: ../boost-root
|
||||
- name: Copy files
|
||||
run: cp -r $GITHUB_WORKSPACE/* libs/graph
|
||||
working-directory: ../boost-root
|
||||
- name: Install deps
|
||||
run: python tools/boostdep/depinst/depinst.py graph
|
||||
working-directory: ../boost-root
|
||||
- name: Bootstrap
|
||||
run: ./bootstrap.sh
|
||||
working-directory: ../boost-root
|
||||
- name: Generate headers
|
||||
run: ./b2 headers
|
||||
working-directory: ../boost-root
|
||||
- name: Generate user config
|
||||
run: 'echo "using $TOOLSET : : $CXX ;" > ~/user-config.jam'
|
||||
working-directory: ../boost-root
|
||||
- name: Config info
|
||||
run: ../../../b2 print_config_info toolset=$TOOLSET cxxstd=${{ matrix.cxxstd }}
|
||||
working-directory: ../boost-root/libs/config/test
|
||||
- name: Test
|
||||
run: ../../../b2 toolset=$TOOLSET cxxstd=${{ matrix.cxxstd }}
|
||||
working-directory: ../boost-root/libs/graph/test
|
||||
macos:
|
||||
runs-on: macos-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
toolset: [ clang ]
|
||||
cxxstd: [ 14, 17, 20 ]
|
||||
steps:
|
||||
- uses: actions/checkout@master
|
||||
with:
|
||||
fetch-depth: '0'
|
||||
- uses: mstachniuk/ci-skip@v1
|
||||
with:
|
||||
commit-filter: '[skip ci];[ci skip];[CI SKIP];[SKIP CI];***CI SKIP***;***SKIP CI***;[windows];[Windows];[WINDOWS];[linux];[Linux];[LINUX]'
|
||||
commit-filter-separator: ';'
|
||||
fail-fast: true
|
||||
- name: Checkout main boost
|
||||
run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
|
||||
- name: Update tools/boostdep
|
||||
run: git submodule update --init tools/boostdep
|
||||
working-directory: ../boost-root
|
||||
- name: Copy files
|
||||
run: cp -r $GITHUB_WORKSPACE/* libs/graph
|
||||
working-directory: ../boost-root
|
||||
- name: Install deps
|
||||
run: python tools/boostdep/depinst/depinst.py graph
|
||||
working-directory: ../boost-root
|
||||
- name: Bootstrap
|
||||
run: ./bootstrap.sh
|
||||
working-directory: ../boost-root
|
||||
- name: Generate headers
|
||||
run: ./b2 headers
|
||||
working-directory: ../boost-root
|
||||
- name: Config info
|
||||
run: ../../../b2 print_config_info toolset=${{ matrix.toolset }} cxxstd=${{ matrix.cxxstd }}
|
||||
working-directory: ../boost-root/libs/config/test
|
||||
- name: Test
|
||||
run: ../../../b2 toolset=${{ matrix.toolset }} cxxstd=${{ matrix.cxxstd }} define=CI_SUPPRESS_KNOWN_ISSUES
|
||||
working-directory: ../boost-root/libs/graph/test
|
||||
windows_msvc_14_3:
|
||||
runs-on: windows-2022
|
||||
defaults:
|
||||
run:
|
||||
shell: cmd
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
toolset: [ msvc-14.3 ]
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: '0'
|
||||
- uses: mstachniuk/ci-skip@v1
|
||||
with:
|
||||
commit-filter: '[skip ci];[ci skip];[CI SKIP];[SKIP CI];***CI SKIP***;***SKIP CI***;[apple];[Apple];[APPLE];[linux];[Linux];[LINUX]'
|
||||
commit-filter-separator: ';'
|
||||
fail-fast: true
|
||||
- name: Checkout main boost
|
||||
run: git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
|
||||
- name: Update tools/boostdep
|
||||
run: git submodule update --init tools/boostdep
|
||||
working-directory: ../boost-root
|
||||
- name: Copy files
|
||||
run: xcopy /s /e /q %GITHUB_WORKSPACE% libs\graph
|
||||
working-directory: ../boost-root
|
||||
- name: Install deps
|
||||
run: python tools/boostdep/depinst/depinst.py graph
|
||||
working-directory: ../boost-root
|
||||
- name: Bootstrap
|
||||
run: bootstrap
|
||||
working-directory: ../boost-root
|
||||
- name: Generate headers
|
||||
run: b2 headers
|
||||
working-directory: ../boost-root
|
||||
- name: Config info
|
||||
run: ..\..\..\b2 print_config_info cxxstd=14,17,20 address-model=64 toolset=msvc-14.3
|
||||
working-directory: ../boost-root/libs/config/test
|
||||
- name: Test
|
||||
run: ..\..\..\b2 --hash address-model=64 cxxstd=14,17,20 toolset=msvc-14.3
|
||||
working-directory: ../boost-root/libs/graph/test
|
||||
|
||||
posix-cmake-subdir:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: ubuntu-22.04
|
||||
- os: ubuntu-24.04
|
||||
- os: macos-14
|
||||
- os: macos-15
|
||||
|
||||
runs-on: ${{matrix.os}}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install packages
|
||||
if: matrix.install
|
||||
run: sudo apt-get -y install ${{matrix.install}}
|
||||
|
||||
- name: Setup Boost
|
||||
run: |
|
||||
echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
|
||||
LIBRARY=${GITHUB_REPOSITORY#*/}
|
||||
echo LIBRARY: $LIBRARY
|
||||
echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
|
||||
echo GITHUB_BASE_REF: $GITHUB_BASE_REF
|
||||
echo GITHUB_REF: $GITHUB_REF
|
||||
REF=${GITHUB_BASE_REF:-$GITHUB_REF}
|
||||
REF=${REF#refs/heads/}
|
||||
echo REF: $REF
|
||||
BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
|
||||
echo BOOST_BRANCH: $BOOST_BRANCH
|
||||
cd ..
|
||||
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
cd boost-root
|
||||
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
|
||||
git submodule update --init tools/boostdep
|
||||
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" $LIBRARY
|
||||
|
||||
- name: Use library with add_subdirectory
|
||||
run: |
|
||||
cd ../boost-root/libs/$LIBRARY/test/cmake_subdir_test
|
||||
mkdir __build__ && cd __build__
|
||||
cmake ..
|
||||
cmake --build .
|
||||
ctest --output-on-failure --no-tests=error
|
||||
|
||||
posix-cmake-install:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: ubuntu-22.04
|
||||
- os: ubuntu-24.04
|
||||
- os: macos-14
|
||||
- os: macos-15
|
||||
|
||||
runs-on: ${{matrix.os}}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Install packages
|
||||
if: matrix.install
|
||||
run: sudo apt-get -y install ${{matrix.install}}
|
||||
|
||||
- name: Setup Boost
|
||||
run: |
|
||||
echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
|
||||
LIBRARY=${GITHUB_REPOSITORY#*/}
|
||||
echo LIBRARY: $LIBRARY
|
||||
echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
|
||||
echo GITHUB_BASE_REF: $GITHUB_BASE_REF
|
||||
echo GITHUB_REF: $GITHUB_REF
|
||||
REF=${GITHUB_BASE_REF:-$GITHUB_REF}
|
||||
REF=${REF#refs/heads/}
|
||||
echo REF: $REF
|
||||
BOOST_BRANCH=develop && [ "$REF" == "master" ] && BOOST_BRANCH=master || true
|
||||
echo BOOST_BRANCH: $BOOST_BRANCH
|
||||
cd ..
|
||||
git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
cd boost-root
|
||||
cp -r $GITHUB_WORKSPACE/* libs/$LIBRARY
|
||||
git submodule update --init tools/boostdep
|
||||
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" $LIBRARY
|
||||
|
||||
- name: Configure
|
||||
run: |
|
||||
cd ../boost-root
|
||||
mkdir __build__ && cd __build__
|
||||
cmake -DBOOST_INCLUDE_LIBRARIES=$LIBRARY -DCMAKE_INSTALL_PREFIX=~/.local ..
|
||||
|
||||
- name: Install
|
||||
run: |
|
||||
cd ../boost-root/__build__
|
||||
cmake --build . --target install
|
||||
|
||||
- name: Use the installed library
|
||||
run: |
|
||||
cd ../boost-root/libs/$LIBRARY/test/cmake_install_test && mkdir __build__ && cd __build__
|
||||
cmake -DCMAKE_INSTALL_PREFIX=~/.local ..
|
||||
cmake --build .
|
||||
ctest --output-on-failure --no-tests=error
|
||||
|
||||
windows-cmake-subdir:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: windows-2022
|
||||
- os: windows-2025
|
||||
|
||||
runs-on: ${{matrix.os}}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Boost
|
||||
shell: cmd
|
||||
run: |
|
||||
echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
|
||||
for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
|
||||
echo LIBRARY: %LIBRARY%
|
||||
echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
|
||||
echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
|
||||
echo GITHUB_REF: %GITHUB_REF%
|
||||
if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
|
||||
set BOOST_BRANCH=develop
|
||||
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
|
||||
echo BOOST_BRANCH: %BOOST_BRANCH%
|
||||
cd ..
|
||||
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
cd boost-root
|
||||
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
|
||||
git submodule update --init tools/boostdep
|
||||
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" %LIBRARY%
|
||||
|
||||
- name: Use library with add_subdirectory (Debug)
|
||||
shell: cmd
|
||||
run: |
|
||||
cd ../boost-root/libs/%LIBRARY%/test/cmake_subdir_test
|
||||
mkdir __build__ && cd __build__
|
||||
cmake ..
|
||||
cmake --build . --config Debug
|
||||
ctest --output-on-failure --no-tests=error -C Debug
|
||||
|
||||
- name: Use library with add_subdirectory (Release)
|
||||
shell: cmd
|
||||
run: |
|
||||
cd ../boost-root/libs/%LIBRARY%/test/cmake_subdir_test/__build__
|
||||
cmake --build . --config Release
|
||||
ctest --output-on-failure --no-tests=error -C Release
|
||||
|
||||
windows-cmake-install:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: windows-2022
|
||||
- os: windows-2025
|
||||
|
||||
runs-on: ${{matrix.os}}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Boost
|
||||
shell: cmd
|
||||
run: |
|
||||
echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
|
||||
for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
|
||||
echo LIBRARY: %LIBRARY%
|
||||
echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
|
||||
echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
|
||||
echo GITHUB_REF: %GITHUB_REF%
|
||||
if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
|
||||
set BOOST_BRANCH=develop
|
||||
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
|
||||
echo BOOST_BRANCH: %BOOST_BRANCH%
|
||||
cd ..
|
||||
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
cd boost-root
|
||||
xcopy /s /e /q %GITHUB_WORKSPACE% libs\%LIBRARY%\
|
||||
git submodule update --init tools/boostdep
|
||||
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" %LIBRARY%
|
||||
|
||||
- name: Configure
|
||||
shell: cmd
|
||||
run: |
|
||||
cd ../boost-root
|
||||
mkdir __build__ && cd __build__
|
||||
cmake -DBOOST_INCLUDE_LIBRARIES=%LIBRARY% -DCMAKE_INSTALL_PREFIX=C:/cmake-prefix ..
|
||||
|
||||
- name: Install (Debug)
|
||||
shell: cmd
|
||||
run: |
|
||||
cd ../boost-root/__build__
|
||||
cmake --build . --target install --config Debug
|
||||
|
||||
- name: Install (Release)
|
||||
shell: cmd
|
||||
run: |
|
||||
cd ../boost-root/__build__
|
||||
cmake --build . --target install --config Release
|
||||
|
||||
- name: Use the installed library (Debug)
|
||||
shell: cmd
|
||||
run: |
|
||||
cd ../boost-root/libs/%LIBRARY%/test/cmake_install_test && mkdir __build__ && cd __build__
|
||||
cmake -DCMAKE_INSTALL_PREFIX=C:/cmake-prefix ..
|
||||
cmake --build . --config Debug
|
||||
ctest --output-on-failure --no-tests=error -C Debug
|
||||
|
||||
- name: Use the installed library (Release)
|
||||
shell: cmd
|
||||
run: |
|
||||
cd ../boost-root/libs/%LIBRARY%/test/cmake_install_test/__build__
|
||||
cmake --build . --config Release
|
||||
ctest --output-on-failure --no-tests=error -C Release
|
||||
@@ -0,0 +1,62 @@
|
||||
name: docs-check
|
||||
|
||||
# PR-time sanity check for the Antora documentation:
|
||||
# - b2 builds every example .cpp and regenerates its .txt sidecar
|
||||
# (catches broken examples; failures here fail the job)
|
||||
# - Antora renders the full site (catches broken .adoc, missing
|
||||
# includes, broken xrefs)
|
||||
#
|
||||
# No deployment. The real publishing path is boostorg/release-tools,
|
||||
# which auto-detects doc/build_antora.sh and ships to
|
||||
# www.boost.org/doc/libs/<version>/libs/graph/.
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: ["develop", "documentation"]
|
||||
workflow_dispatch:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
docs-check:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install Node 20
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '20'
|
||||
|
||||
# Set up boost-root so b2 can build the example .cpp files (needs
|
||||
# the full Boost build tree, not just the headers we ship in this
|
||||
# repo).
|
||||
- name: Set up boost-root
|
||||
run: |
|
||||
git clone -b develop --depth 1 https://github.com/boostorg/boost.git ../boost-root
|
||||
cd ../boost-root
|
||||
git submodule update --init tools/boostdep
|
||||
rm -rf libs/graph
|
||||
cp -r "$GITHUB_WORKSPACE" libs/graph
|
||||
python tools/boostdep/depinst/depinst.py --git_args "--jobs 3" graph
|
||||
git submodule update --init --depth 1 libs/static_assert
|
||||
./bootstrap.sh
|
||||
./b2 headers
|
||||
|
||||
- name: Snapshot example outputs (b2)
|
||||
working-directory: ../boost-root
|
||||
run: ./b2 -j$(nproc) libs/graph/doc/modules/ROOT/examples
|
||||
|
||||
# Mirror the regenerated .txt sidecars back into the workspace so
|
||||
# the Antora build below renders pages against fresh outputs.
|
||||
- name: Mirror generated .txt back to workspace
|
||||
run: rsync -a ../boost-root/libs/graph/doc/modules/ROOT/examples/ doc/modules/ROOT/examples/
|
||||
|
||||
# Build the site exactly as boostorg/release-tools will at release
|
||||
# time: invoke doc/build_antora.sh, which runs npm ci + npx antora
|
||||
# against the committed package-lock.json.
|
||||
- name: Build the site (release-tools entry point)
|
||||
working-directory: doc
|
||||
run: ./build_antora.sh playbook.yml
|
||||
@@ -0,0 +1,61 @@
|
||||
name: warning-count-comment
|
||||
|
||||
on:
|
||||
workflow_run:
|
||||
workflows: ["CI"]
|
||||
types: [completed]
|
||||
|
||||
permissions:
|
||||
actions: read
|
||||
pull-requests: write
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
comment:
|
||||
if: github.event.workflow_run.event == 'pull_request'
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
REPO: ${{ github.repository }}
|
||||
PR_RUN: ${{ github.event.workflow_run.id }}
|
||||
HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Download this PR run's log archive
|
||||
run: gh api "repos/$REPO/actions/runs/$PR_RUN/logs" > pr-logs.zip
|
||||
|
||||
- name: Download latest successful develop run's log archive
|
||||
run: |
|
||||
DEV=$(gh run list --workflow CI --branch develop --status success \
|
||||
--limit 1 --json databaseId --jq '.[0].databaseId')
|
||||
if [ -z "$DEV" ]; then echo "no develop baseline run found" >&2; exit 1; fi
|
||||
echo "DEV_RUN=$DEV" >> "$GITHUB_ENV"
|
||||
gh api "repos/$REPO/actions/runs/$DEV/logs" > base-logs.zip
|
||||
|
||||
- name: Generate table
|
||||
run: |
|
||||
{
|
||||
echo "Compiler-warning counts vs \`develop\` (auto-generated)."
|
||||
echo "PR run \`$PR_RUN\` vs develop run \`$DEV_RUN\` (\`${HEAD_SHA:0:10}\`)."
|
||||
echo
|
||||
python3 .github/scripts/warn_table.py base-logs.zip pr-logs.zip
|
||||
} > table.md
|
||||
|
||||
- name: Resolve PR number
|
||||
id: pr
|
||||
run: |
|
||||
num=$(gh api "repos/$REPO/pulls?state=open&per_page=100" \
|
||||
--jq "map(select(.head.sha==\"$HEAD_SHA\"))[0].number")
|
||||
if [ -z "$num" ]; then
|
||||
echo "no open PR found with head $HEAD_SHA" >&2
|
||||
exit 1
|
||||
fi
|
||||
echo "num=$num" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Post or update sticky comment
|
||||
uses: marocchino/sticky-pull-request-comment@v2
|
||||
with:
|
||||
header: warning-counts
|
||||
number: ${{ steps.pr.outputs.num }}
|
||||
path: table.md
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
cube-fr.dot
|
||||
cube.dot
|
||||
disconnected-fr.dot
|
||||
graphml_test_out.xml
|
||||
kevin-bacon2.dat
|
||||
random.dot
|
||||
triangular-fr.dot
|
||||
triangular-kk.dot
|
||||
test/*.dot
|
||||
example/routing-table.dat
|
||||
example/figs/ospf-sptree.dot
|
||||
CMakeFiles/
|
||||
|
||||
# Antora docs build artifacts
|
||||
doc/build/
|
||||
doc/node_modules/
|
||||
|
||||
# macOS
|
||||
.DS_Store
|
||||
**/.DS_Store
|
||||
+74
-19
@@ -1,24 +1,79 @@
|
||||
#----------------------------------------------------------------------------
|
||||
# This file was automatically generated from the original CMakeLists.txt file
|
||||
# Add a variable to hold the headers for the library
|
||||
set (lib_headers
|
||||
graph
|
||||
# Copyright 2020, 2021 Peter Dimov
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# https://www.boost.org/LICENSE_1_0.txt
|
||||
|
||||
cmake_minimum_required(VERSION 3.8...3.16)
|
||||
|
||||
project(boost_graph VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX)
|
||||
|
||||
add_library(boost_graph
|
||||
src/graphml.cpp
|
||||
src/read_graphviz_new.cpp
|
||||
)
|
||||
|
||||
# Add a library target to the build system
|
||||
boost_library_project(
|
||||
graph
|
||||
SRCDIRS src
|
||||
TESTDIRS test
|
||||
HEADERS ${lib_headers}
|
||||
# DOCDIRS
|
||||
DESCRIPTION "The BGL graph interface and graph components are generic, in the same sense as the the Standard Template Library (STL)."
|
||||
MODULARIZED
|
||||
AUTHORS "Jeremy Siek <jeremy.siek -at- gmail.com>"
|
||||
"Lie-Quan Lee"
|
||||
"Andrew Lumsdaine"
|
||||
"Douglas Gregor <doug.gregor -at- gmail.com>"
|
||||
# MAINTAINERS
|
||||
add_library(Boost::graph ALIAS boost_graph)
|
||||
|
||||
target_include_directories(boost_graph PUBLIC include)
|
||||
|
||||
target_link_libraries(boost_graph
|
||||
PUBLIC
|
||||
Boost::algorithm
|
||||
Boost::any
|
||||
Boost::array
|
||||
Boost::assert
|
||||
Boost::bimap
|
||||
Boost::concept_check
|
||||
Boost::config
|
||||
Boost::container_hash
|
||||
Boost::conversion
|
||||
Boost::core
|
||||
Boost::detail
|
||||
Boost::foreach
|
||||
Boost::function
|
||||
Boost::integer
|
||||
Boost::iterator
|
||||
Boost::lexical_cast
|
||||
Boost::math
|
||||
Boost::move
|
||||
Boost::mpl
|
||||
Boost::multi_index
|
||||
Boost::multiprecision
|
||||
Boost::optional
|
||||
Boost::parameter
|
||||
Boost::preprocessor
|
||||
Boost::property_map
|
||||
Boost::property_tree
|
||||
Boost::random
|
||||
Boost::range
|
||||
Boost::serialization
|
||||
Boost::smart_ptr
|
||||
Boost::spirit
|
||||
Boost::throw_exception
|
||||
Boost::tti
|
||||
Boost::tuple
|
||||
Boost::type_traits
|
||||
Boost::typeof
|
||||
Boost::unordered
|
||||
Boost::utility
|
||||
Boost::xpressive
|
||||
PRIVATE
|
||||
Boost::regex
|
||||
)
|
||||
|
||||
target_compile_definitions(boost_graph
|
||||
PUBLIC BOOST_GRAPH_NO_LIB
|
||||
# Source files already define BOOST_GRAPH_SOURCE
|
||||
# PRIVATE BOOST_GRAPH_SOURCE
|
||||
)
|
||||
|
||||
if(BUILD_SHARED_LIBS)
|
||||
target_compile_definitions(boost_graph PUBLIC BOOST_GRAPH_DYN_LINK)
|
||||
else()
|
||||
target_compile_definitions(boost_graph PUBLIC BOOST_GRAPH_STATIC_LINK)
|
||||
endif()
|
||||
|
||||
if(BUILD_TESTING AND EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt")
|
||||
|
||||
add_subdirectory(test)
|
||||
|
||||
endif()
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our community include:
|
||||
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the overall community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery, and sexual attention or advances of any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or email address, without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
|
||||
|
||||
Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at `arnaud.becheler -at- gmail.com`. All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series of actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within the community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
|
||||
|
||||
Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at [https://www.contributor-covenant.org/translations][translations].
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
|
||||
[Mozilla CoC]: https://github.com/mozilla/diversity
|
||||
[FAQ]: https://www.contributor-covenant.org/faq
|
||||
[translations]: https://www.contributor-covenant.org/translations
|
||||
+182
@@ -0,0 +1,182 @@
|
||||
# Contributing to Boost.Graph
|
||||
|
||||
## We are welcoming contributions
|
||||
|
||||
- Bug fixes and test cases for them
|
||||
- New algorithms (with tests, documentation, complexity notes, and a reference)
|
||||
- Documentation, examples, performance work
|
||||
- Concept refinements (handle with care as these are API-visible)
|
||||
|
||||
## Maintainers
|
||||
|
||||
| Maintainer | Role | Focus | Availability | Contact |
|
||||
|---|---|---|---|---|
|
||||
| **Jeremy W. Murphy** | Principal maintainer. Holds merge authority and final say on design decisions. | Algorithms, technical review, library architecture. 10+ years on BGL. | Part-time, best-effort. | `jeremy.william.murphy -at- gmail.com` |
|
||||
| **Arnaud Becheler** | Assistant maintainer. Triage, review, and contributor support; defers to Jeremy on merge decisions. | Documentation, modernization, contributor onboarding. | Full-time, funded by the [C++ Alliance](https://cppalliance.org) to assist Jeremy. | `arnaud.becheler -at- gmail.com` |
|
||||
|
||||
The authoritative maintainer list lives in [meta/libraries.json](meta/libraries.json); keep this section in sync with it. Maintainers aim to provide first-pass review on new PRs within two weeks.
|
||||
|
||||
## Getting set up
|
||||
|
||||
Clone the [Boost superproject](https://github.com/boostorg/boost):
|
||||
|
||||
```bash
|
||||
git clone --depth 1 https://github.com/boostorg/boost
|
||||
cd boost
|
||||
git submodule update --init --depth 1
|
||||
./bootstrap.sh
|
||||
./b2 headers
|
||||
```
|
||||
|
||||
Then replace `libs/graph/` with your fork:
|
||||
|
||||
```bash
|
||||
rm -rf libs/graph
|
||||
git clone https://github.com/<you>/graph libs/graph
|
||||
cd libs/graph
|
||||
git remote add upstream https://github.com/boostorg/graph
|
||||
```
|
||||
|
||||
## Building and testing
|
||||
|
||||
- Headers only: `./b2 headers` from boost root
|
||||
- Compiled components: `./b2` from `libs/graph`
|
||||
- All tests: `./b2` from `libs/graph/test` (takes ~10 min)
|
||||
- Single test: `./b2 cycle_canceling_test` from `libs/graph/test`
|
||||
- Different C++ standard: `./b2 cxxstd=20`
|
||||
- Different compiler: `./b2 toolset=clang`
|
||||
|
||||
### Naming conventions
|
||||
|
||||
BGL follows the standard Boost / STL conventions:
|
||||
|
||||
| Kind | Style | Example |
|
||||
|---|---|---|
|
||||
| Functions, types, variables, files | `snake_case` | `dijkstra_visitor`, `add_edge`, `adjacency_list.hpp` |
|
||||
| Member functions / methods | `snake_case` (same as free functions) | `get_edge`, `out_edges` |
|
||||
| Private member variables | `m_` prefix + `snake_case` | `m_matrix`, `m_num_edges`, `m_property` |
|
||||
| Concept names | `PascalCase` | `IncidenceGraph`, `VertexListGraph` |
|
||||
| Template parameters | `PascalCase` | `template <class Graph, class WeightMap>` |
|
||||
| Tag-dispatch types | `snake_case` + `S` suffix | `vecS`, `directedS` |
|
||||
| Macros | `BOOST_GRAPH_` prefix, `SCREAMING_SNAKE_CASE` | `BOOST_GRAPH_DECLARE_EDGE_PROPERTY` |
|
||||
|
||||
### Formatting
|
||||
|
||||
Low-level formatting (braces, column width, spaces in angle brackets, etc.) is captured by the [`.clang-format`](.clang-format) file at the repo root (WebKit preset with BGL-specific overrides: Allman braces, 80-column limit, `Cpp03`). It is **not** enforced by CI, but contributors are encouraged to run `clang-format -i` on files they touch before opening a PR.
|
||||
|
||||
## Using other Boost libraries
|
||||
|
||||
When writing new code:
|
||||
|
||||
- **Prefer `std::`** when the supported C++ standard has an equivalent. Use `std::function`, `std::shared_ptr`, `std::tuple` over their Boost counterparts. Exceptions are welcome with justification in the PR description, in particular Boost containers with no std equivalent in our standard window (e.g. `boost::unordered_flat_map`, `boost::bimap`, `boost::multi_index_container`).
|
||||
- **Avoid pulling in new heavy dependencies** (Spirit, property_tree, xpressive, etc.) without justification: BGL is gradually migrating away from heavy Boost dependencies. Open a discussion before adding one.
|
||||
- **Concept checks** (`boost::concept`) are encouraged for any new public template. New public APIs should respect the existing concept hierarchy.
|
||||
- Track BGL's position in the Boost dependency DAG via [boostdep](https://github.com/boostorg/boostdep)'s hosted reports. The long-term goal is to reduce BGL's level over time:
|
||||
- **[Module levels](https://pdimov.github.io/boostdep-report/master/module-levels.html#graph)** shows BGL's depth in the global DAG. A rising level means new transitive Boost dependencies have been pulled in.
|
||||
- **[Per-library page](https://pdimov.github.io/boostdep-report/develop/graph.html)** shows BGL's direct deps and per-dep `#include` counts.
|
||||
|
||||
## Boost macro usage
|
||||
|
||||
BGL has accumulated a wide vocabulary of `BOOST_*` macros from its pre-C++14 days. The table below captures the current guidance for each one used in the codebase: **Keep** as-is, **Replace** with a language or std equivalent, or **Remove** along with the dead `#if defined(...)` branch the macro guards. When in doubt, follow the recommendation here or ask before introducing new uses.
|
||||
|
||||
| Macro | Recommendation |
|
||||
|---|---|
|
||||
| `BOOST_ASSERT` | Keep, more useful and configurable than `assert` |
|
||||
| `BOOST_BORLANDC` | Remove |
|
||||
| `BOOST_CONCEPT_ASSERT` | Keep (pre C++20) |
|
||||
| `BOOST_CONCEPT_REQUIRES` | Keep (pre C++20) |
|
||||
| `BOOST_CONCEPT_USAGE` | Keep (pre C++20) |
|
||||
| `BOOST_DEDUCED_TYPENAME` | Remove |
|
||||
| `BOOST_FOREACH` | Replace with an appropriate algorithm or range-based `for` loop |
|
||||
| `BOOST_FWD_REF` | Replace with `T&&` |
|
||||
| `BOOST_JOIN` | Keep |
|
||||
| `BOOST_MPL_HAS_XXX_TRAIT_DEF` | Consider writing the same utility without dependency on MPL |
|
||||
| `BOOST_MSVC` | Keep |
|
||||
| `BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP` | Remove |
|
||||
| `BOOST_NO_AUTO_PTR` | Remove and assume `auto_ptr` is not available |
|
||||
| `BOOST_NO_CXX11_ALLOCATOR` | Remove |
|
||||
| `BOOST_NO_CXX11_RVALUE_REFERENCES` | Remove |
|
||||
| `BOOST_NO_CXX11_SMART_PTR` | Remove |
|
||||
| `BOOST_NO_CXX17_STRUCTURED_BINDINGS` | Keep |
|
||||
| `BOOST_NO_MEMBER_TEMPLATE_FRIENDS` | Remove |
|
||||
| `BOOST_NO_SFINAE` | Remove |
|
||||
| `BOOST_NO_STDC_NAMESPACE` | Possibly keep |
|
||||
| `BOOST_NO_STD_ALLOCATOR` | Remove |
|
||||
| `BOOST_NO_STD_ITERATOR_TRAITS` | Remove |
|
||||
| `BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS` | Remove |
|
||||
| `BOOST_OVERRIDE` | Possibly remove |
|
||||
| `BOOST_PARAMETER_KEYWORD` | Keep |
|
||||
| `BOOST_PARAMETER_NAME` | Keep |
|
||||
| `BOOST_PP_CAT` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_COMMA_IF` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_DEC` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_ENUM_BINARY_PARAMS` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_ENUM_BINARY_PARAMS_Z` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_ENUM_PARAMS` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_ENUM_PARAMS_Z` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_ENUM_TRAILING_BINARY_PARAMS_Z` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_ENUM_TRAILING_PARAMS_Z` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_EXPR_IF` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_INC` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_LPAREN_IF` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_REPEAT` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_REPEAT_FROM_TO` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_RPAREN_IF` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_SEQ_ELEM` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_SUB` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PP_TUPLE_EAT` | Use if Boost.PP can't be replaced with variadics |
|
||||
| `BOOST_PREVENT_MACRO_SUBSTITUTION` | Keep |
|
||||
| `BOOST_SERIALIZATION_NVP` | Consider removing if you can eliminate the dependency on Boost.Serialization via `<boost/core/serialization.hpp>` |
|
||||
| `BOOST_SPIRIT_CLOSURE_LIMIT` | Keep |
|
||||
| `BOOST_SPIRIT_DEBUG` | Keep |
|
||||
| `BOOST_SPIRIT_DEBUG_RULE` | Keep |
|
||||
| `BOOST_STATIC_ASSERT` | Replace with `static_assert(..., msg)` |
|
||||
| `BOOST_STATIC_ASSERT_MSG` | Replace with `static_assert(..., msg)` |
|
||||
| `BOOST_STATIC_CONSTANT` | Remove in favour of in-class `static constexpr` initialization |
|
||||
| `BOOST_SYMBOL_EXPORT` | Keep |
|
||||
| `BOOST_SYMBOL_IMPORT` | Keep |
|
||||
| `BOOST_SYMBOL_VISIBLE` | Keep |
|
||||
| `BOOST_TESTED_AT` | Keep |
|
||||
| `BOOST_THROW_EXCEPTION` | Keep |
|
||||
| `BOOST_TTI_HAS_MEMBER_FUNCTION` | Consider writing the same utility without dependency on TTI |
|
||||
| `BOOST_USING_STD_MAX` | Replace with `(std::max)(...)` |
|
||||
| `BOOST_USING_STD_MIN` | Replace with `(std::min)(...)` |
|
||||
| `BOOST_WORKAROUND` | Keep |
|
||||
|
||||
When you mark a `BOOST_NO_*` flag as **Remove**, also delete the `#if defined(...)` block it gates — the alternate branch is always taken on the supported toolchains.
|
||||
|
||||
## Pull request process
|
||||
|
||||
- Fork, branch from `develop`, PR back to `develop`
|
||||
- One logical change per PR; rebase before requesting review
|
||||
- Tests required for new features and bug fixes
|
||||
- **Open (non-draft) PRs are assumed ready for review.** Use GitHub's Draft state while iterating, then mark the PR as *Ready for review* when you want maintainers to look at it.
|
||||
- A maintainer will review within ~2 weeks (see Maintainers below)
|
||||
- Squash on merge by default
|
||||
|
||||
## Merge criteria
|
||||
|
||||
Before a PR is merged, all of the following must hold:
|
||||
|
||||
1. CI is green on the full matrix (gcc-14 + clang-19, C++14/17/20/23).
|
||||
2. New behavior has tests.
|
||||
3. Bug fixes have a regression test.
|
||||
4. Documentation under [doc/](doc/) is updated if the public API changed.
|
||||
5. No new compiler warnings on the supported toolchains.
|
||||
6. The PR is rebased on current `develop` with a clean commit history.
|
||||
7. The principal maintainer has approved.
|
||||
|
||||
## Reporting bugs
|
||||
|
||||
1. Search [existing issues](https://github.com/boostorg/graph/issues) first
|
||||
2. Note compiler, version, OS, Boost version
|
||||
3. Minimal reproducer on [Compiler Explorer](https://godbolt.org/z/37dPWd5bs)
|
||||
4. Expected Output versus Actual Output is explained.
|
||||
|
||||
## Security
|
||||
|
||||
See [SECURITY.md](SECURITY.md).
|
||||
|
||||
## License
|
||||
|
||||
By contributing, you agree your contribution is licensed under the [Boost Software License 1.0](https://www.boost.org/LICENSE_1_0.txt).
|
||||
@@ -1,100 +0,0 @@
|
||||
COPYRIGHT NOTICE:
|
||||
|
||||
Copyright 1997-2000, University of Notre Dame.
|
||||
Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek
|
||||
|
||||
The Boost Graph Library "Artistic License"
|
||||
|
||||
Preamble
|
||||
|
||||
The intent of this document is to state the conditions under which a
|
||||
Package may be copied, such that the Copyright Holder maintains some
|
||||
semblance of artistic control over the development of the package,
|
||||
while giving the users of the package the right to use and distribute
|
||||
the Package in a more-or-less free fashion, plus the right to make
|
||||
reasonable modifications.
|
||||
|
||||
Definitions
|
||||
|
||||
"Package" refers to the collection of files distributed by the
|
||||
Copyright Holder, and derivatives of that collection of files created
|
||||
through textual modification.
|
||||
|
||||
"Standard Version" refers to such a Package if it has not been
|
||||
modified, or has been modified in accordance with the wishes of the
|
||||
Copyright Holder as specified below.
|
||||
|
||||
"Copyright Holder" is whoever is named in the copyright or copyrights for the package.
|
||||
|
||||
"You" is you, if you're thinking about copying or distributing this Package.
|
||||
|
||||
"Reasonable copying fee" is whatever you can justify on the basis of
|
||||
media cost, duplication charges, time of people involved, and so
|
||||
on. (You will not be required to justify it to the Copyright Holder,
|
||||
but only to the computing community at large as a market that must
|
||||
bear the fee.)
|
||||
|
||||
"Freely Available" means that no fee is charged for the item itself,
|
||||
though there may be fees involved in handling the item. It also means
|
||||
that recipients of the item may redistribute it under the same
|
||||
conditions they received it.
|
||||
|
||||
1. You may make and give away verbatim copies of the source form of
|
||||
the Standard Version of this Package without restriction, provided
|
||||
that you duplicate all of the original copyright notices and
|
||||
associated disclaimers.
|
||||
|
||||
2. You may apply bug fixes, portability fixes and other modifications
|
||||
derived from the Public Domain or from the Copyright Holder. A Package
|
||||
modified in such a way shall still be considered the Standard Version.
|
||||
|
||||
3. You may otherwise modify your copy of this Package in any way,
|
||||
provided that you insert a prominent notice in each changed file
|
||||
stating how and when you changed that file, and provided that you do
|
||||
at least ONE of the following:
|
||||
|
||||
a. place your modifications in the Public Domain or otherwise make
|
||||
them Freely Available, such as by posting said modifications to Usenet
|
||||
or an equivalent medium, or placing the modifications on a major
|
||||
archive site such as uunet.uu.net, or by allowing the Copyright Holder
|
||||
to include your modifications in the Standard Version of the Package.
|
||||
b. use the modified Package only within your corporation or organization.
|
||||
c. rename any non-standard types and functions so the names do not
|
||||
conflict with Standard Vibrary, which must also be provided, and
|
||||
provide a separate documentation for each non-standard type of function
|
||||
that clearly documents how it differs from the Standard Version.
|
||||
d. make other distribution arrangements with the Copyright Holder.
|
||||
|
||||
4. You may charge a reasonable copying fee for any distribution of this
|
||||
Package. You may charge any fee you choose for support of this
|
||||
Package. You may not charge a fee for this Package itself. However,
|
||||
you may distribute this Package in aggregate with other (possibly
|
||||
commercial) programs as part of a larger (possibly commercial)
|
||||
software distribution provided that you do not advertise this Package
|
||||
as a product of your own.
|
||||
|
||||
5. The name of the Copyright Holder may not be used to endorse or
|
||||
promote products derived from this software without specific prior
|
||||
written permission.
|
||||
|
||||
DISCLAIMER:
|
||||
|
||||
LICENSOR MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED.
|
||||
By way of example, but not limitation, Licensor MAKES NO
|
||||
REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY
|
||||
PARTICULAR PURPOSE OR THAT THE USE OF THE LICENSED SOFTWARE COMPONENTS
|
||||
OR DOCUMENTATION WILL NOT INFRINGE ANY PATENTS, COPYRIGHTS, TRADEMARKS
|
||||
OR OTHER RIGHTS.
|
||||
|
||||
The Authors and the University of Notre Dame du Lac shall not be held
|
||||
liable for any liability nor for any direct, indirect or consequential
|
||||
damages with respect to any claim by LICENSEE or any third party on
|
||||
account of or arising from this Agreement or use of this software.
|
||||
|
||||
Any disputes arising out of this Agreement or LICENSEE'S use of the
|
||||
software at any time shall be resolved by the courts of the state of
|
||||
Indiana. LICENSEE hereby consents to the jurisdiction of the Indiana
|
||||
courts and waives the right to challenge the jurisdiction thereof in
|
||||
any dispute arising out of this Agreement or Licensee's use of the
|
||||
software.
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
# Boost Graph Library
|
||||
|
||||
[](https://www.boost.org/doc/libs/release/libs/graph/doc/index.html)
|
||||
[](https://en.cppreference.com/w/cpp/14)
|
||||
[](https://github.com/boostorg/graph/actions/workflows/ci.yml)
|
||||
[](https://www.boost.org/LICENSE_1_0.txt)
|
||||
[](https://github.com/boostorg/boost/releases)
|
||||
|
||||
The Boost Graph Library (BGL) is a generic library that allows users to:
|
||||
|
||||
1. Represent graph data using different structures (adjacency matrix, adjacency list, compressed sparse row, vectors of vectors, user-defined data structures).
|
||||
2. Attach user-defined data to vertices, edges, or the graph itself.
|
||||
3. Run a large number of algorithms on the graph.
|
||||
4. Inject user logic into algorithms using visitor hooks.
|
||||
|
||||
## Example
|
||||
|
||||
[Try it on Compiler Explorer](https://godbolt.org/z/9Esszr9Ga)
|
||||
|
||||
```cpp
|
||||
#include <boost/graph/adjacency_list.hpp>
|
||||
#include <boost/graph/dijkstra_shortest_paths.hpp>
|
||||
#include <boost/graph/visitors.hpp>
|
||||
#include <iostream>
|
||||
#include <limits>
|
||||
#include <vector>
|
||||
|
||||
struct City {};
|
||||
struct Road { int cost; };
|
||||
|
||||
using namespace boost;
|
||||
using Graph = adjacency_list<vecS, vecS, directedS, City, Road>;
|
||||
using Vertex = graph_traits<Graph>::vertex_descriptor;
|
||||
|
||||
int main() {
|
||||
Graph g(4);
|
||||
add_edge(0, 1, Road{1}, g);
|
||||
add_edge(1, 2, Road{2}, g);
|
||||
add_edge(0, 2, Road{10}, g);
|
||||
add_edge(2, 3, Road{1}, g);
|
||||
|
||||
// Storage: you control allocation, lifetime, and container type
|
||||
std::vector<Vertex> storage_pred(num_vertices(g));
|
||||
std::vector<int> storage_dist(num_vertices(g));
|
||||
|
||||
// Property maps: lightweight views into the storage
|
||||
auto index_map = get(vertex_index, g);
|
||||
auto costs_map = get(&Road::cost, g);
|
||||
auto predecessor_map = make_iterator_property_map(storage_pred.begin(), index_map);
|
||||
auto distance_map = make_iterator_property_map(storage_dist.begin(), index_map);
|
||||
|
||||
dijkstra_shortest_paths(g, vertex(0, g),
|
||||
predecessor_map, distance_map,
|
||||
costs_map, index_map,
|
||||
std::less<int>(), std::plus<int>(),
|
||||
std::numeric_limits<int>::max(), 0,
|
||||
dijkstra_visitor<null_visitor>());
|
||||
|
||||
for (auto v : make_iterator_range(vertices(g)))
|
||||
std::cout << "distance to " << v << " = " << storage_dist[v] << "\n";
|
||||
}
|
||||
```
|
||||
```
|
||||
distance to 0 = 0
|
||||
distance to 1 = 1
|
||||
distance to 2 = 3
|
||||
distance to 3 = 4
|
||||
```
|
||||
|
||||
## Algorithms
|
||||
|
||||
BGL ships dozens of graph algorithms: shortest paths (Dijkstra, Bellman-Ford, A*, Floyd-Warshall, Johnson), spanning trees (Kruskal, Prim), maximum flow (Edmonds-Karp, push-relabel, Boykov-Kolmogorov), traversal (BFS, DFS, topological sort), planarity testing, isomorphism, component decomposition, and more.
|
||||
|
||||
See the [full algorithm reference](https://becheler.github.io/graph/graph/algorithms/overview.html) for the complete catalogue.
|
||||
|
||||
## Help and feedback
|
||||
|
||||
* **[GitHub Issues](https://github.com/boostorg/graph/issues)** for bug reports. Search before opening a new one.
|
||||
* **[GitHub Discussions](https://github.com/boostorg/graph/discussions)** for questions, design ideas, and general conversation about the library.
|
||||
* **[Boost mailing list](http://lists.boost.org/mailman/listinfo.cgi/boost-users)** for general Boost development. Use the `[graph]` tag in the subject line.
|
||||
* **CppLang Slack** for real-time chat. [Request an invite](https://cppalliance.org/slack/), then join the `#boost` channel.
|
||||
* **Direct contact with maintainers**: see [CONTRIBUTING.md#maintainers](CONTRIBUTING.md#maintainers).
|
||||
|
||||
## Using BGL
|
||||
|
||||
Install Boost via your package manager:
|
||||
|
||||
| Manager | Command |
|
||||
|---|---|
|
||||
| [vcpkg](https://vcpkg.io) | `vcpkg install boost-graph` |
|
||||
| [Conan](https://conan.io) | `conan install --requires=boost/[*]` |
|
||||
| apt (Debian/Ubuntu) | `sudo apt install libboost-graph-dev` |
|
||||
| Homebrew (macOS) | `brew install boost` |
|
||||
|
||||
Then wire it into CMake:
|
||||
|
||||
```cmake
|
||||
find_package(Boost REQUIRED COMPONENTS graph)
|
||||
target_link_libraries(my_app PRIVATE Boost::graph)
|
||||
```
|
||||
|
||||
Most of BGL is header-only. Linking `Boost::graph` is only required for the GraphViz and GraphML parsers.
|
||||
|
||||
## Building from source
|
||||
|
||||
For working on BGL itself (building Boost from source, running the test suite), see [CONTRIBUTING.md](CONTRIBUTING.md).
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
# Security Policy
|
||||
|
||||
Boost.Graph is a header-only C++ template library. Most issues that look
|
||||
like security problems are caused by misuse of the API, undefined behavior
|
||||
in caller code, or violating a documented precondition. Those should be
|
||||
filed as regular GitHub issues.
|
||||
|
||||
If you believe you have found a genuine vulnerability in the library
|
||||
itself, please report it privately through GitHub's
|
||||
[private vulnerability reporting](https://github.com/boostorg/graph/security/advisories/new)
|
||||
rather than opening a public issue.
|
||||
|
||||
Fixes land on the `develop` branch and ship with the next Boost release.
|
||||
No back-porting to older releases is guaranteed.
|
||||
@@ -0,0 +1,61 @@
|
||||
# Copyright René Ferdinand Rivera Morell 2024
|
||||
# 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)
|
||||
|
||||
require-b2 5.2 ;
|
||||
|
||||
constant boost_dependencies :
|
||||
/boost/algorithm//boost_algorithm
|
||||
/boost/any//boost_any
|
||||
/boost/array//boost_array
|
||||
/boost/assert//boost_assert
|
||||
/boost/bimap//boost_bimap
|
||||
/boost/bind//boost_bind
|
||||
/boost/concept_check//boost_concept_check
|
||||
/boost/config//boost_config
|
||||
/boost/container_hash//boost_container_hash
|
||||
/boost/conversion//boost_conversion
|
||||
/boost/core//boost_core
|
||||
/boost/detail//boost_detail
|
||||
/boost/foreach//boost_foreach
|
||||
/boost/function//boost_function
|
||||
/boost/integer//boost_integer
|
||||
/boost/iterator//boost_iterator
|
||||
/boost/lexical_cast//boost_lexical_cast
|
||||
/boost/math//boost_math_tr1
|
||||
/boost/move//boost_move
|
||||
/boost/mpl//boost_mpl
|
||||
/boost/multi_index//boost_multi_index
|
||||
/boost/multiprecision//boost_multiprecision
|
||||
/boost/optional//boost_optional
|
||||
/boost/parameter//boost_parameter
|
||||
/boost/preprocessor//boost_preprocessor
|
||||
/boost/property_map//boost_property_map
|
||||
/boost/property_tree//boost_property_tree
|
||||
/boost/random//boost_random
|
||||
/boost/range//boost_range
|
||||
/boost/serialization//boost_serialization
|
||||
/boost/smart_ptr//boost_smart_ptr
|
||||
/boost/spirit//boost_spirit
|
||||
/boost/throw_exception//boost_throw_exception
|
||||
/boost/tti//boost_tti
|
||||
/boost/tuple//boost_tuple
|
||||
/boost/type_traits//boost_type_traits
|
||||
/boost/typeof//boost_typeof
|
||||
/boost/unordered//boost_unordered
|
||||
/boost/utility//boost_utility
|
||||
/boost/xpressive//boost_xpressive ;
|
||||
|
||||
project /boost/graph
|
||||
;
|
||||
|
||||
explicit
|
||||
[ alias boost_graph : build//boost_graph ]
|
||||
[ alias all : boost_graph example test ]
|
||||
;
|
||||
|
||||
call-if : boost-library graph
|
||||
: install boost_graph
|
||||
;
|
||||
|
||||
+16
-44
@@ -4,57 +4,29 @@
|
||||
# (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
|
||||
import mpi ;
|
||||
|
||||
constant boost_dependencies_private :
|
||||
/boost/regex//boost_regex
|
||||
;
|
||||
|
||||
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)" ;
|
||||
}
|
||||
|
||||
alias graphml
|
||||
: graphml.cpp
|
||||
: # requirements
|
||||
: # default built
|
||||
: # usage requirements
|
||||
<include>$(EXPAT_INCLUDE)
|
||||
<library-path>$(EXPAT_LIBPATH)
|
||||
<find-shared-library>expat
|
||||
;
|
||||
}
|
||||
else
|
||||
{
|
||||
message graphml
|
||||
: "warning: Graph library does not contain optional GraphML reader."
|
||||
: "note: to enable GraphML support, set EXPAT_INCLUDE and EXPAT_LIBPATH to the"
|
||||
: "note: directories containing the Expat headers and libraries, respectively."
|
||||
;
|
||||
}
|
||||
explicit graphml ;
|
||||
project
|
||||
: common-requirements <include>../include <library>$(boost_dependencies)
|
||||
: requirements <include>../src <library>$(boost_dependencies_private)
|
||||
: source-location ../src
|
||||
: usage-requirements <define>BOOST_GRAPH_NO_LIB=1
|
||||
;
|
||||
|
||||
lib boost_graph
|
||||
:
|
||||
read_graphviz_spirit.cpp
|
||||
graphml
|
||||
read_graphviz_new.cpp
|
||||
graphml.cpp
|
||||
:
|
||||
<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
|
||||
# User reports that VC++ 8.0 does not fail anymore, so that is removed
|
||||
<toolset>msvc-7.1:<cxxflags>-GR-
|
||||
<toolset>msvc-8.0:<cxxflags>-GR-
|
||||
<toolset>sun:<build>no
|
||||
:
|
||||
:
|
||||
;
|
||||
|
||||
boost-install boost_graph ;
|
||||
@@ -1,138 +0,0 @@
|
||||
<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>
|
||||
@@ -1,213 +0,0 @@
|
||||
<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>
|
||||
@@ -1,130 +0,0 @@
|
||||
<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>
|
||||
@@ -1,168 +0,0 @@
|
||||
<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>AdjacencyGraph</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:AdjacencyGraph"></A>
|
||||
AdjacencyGraph
|
||||
</H2>
|
||||
|
||||
The AdjacencyGraph concept provides and interface for efficient access
|
||||
of the adjacent vertices to a vertex in a graph. This is quite similar
|
||||
to the <a href="./IncidenceGraph.html">IncidenceGraph</a> concept (the
|
||||
target of an out-edge is an adjacent vertex). Both concepts are
|
||||
provided because in some contexts there is only concern for the
|
||||
vertices, whereas in other contexts the edges are also important.
|
||||
|
||||
<H3>Refinement of</H3>
|
||||
|
||||
<a href="Graph.html">Graph</a>
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<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>v</tt></TD>
|
||||
<TD>An object of type <tt>boost::graph_traits<G>::vertex_descriptor</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
|
||||
<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_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
|
||||
vertices adjacent to <i>v</i>. As such, the value type of an
|
||||
adjacency iterator is the vertex descriptor type of its graph. An
|
||||
adjacency iterator must meet the requirements of <a
|
||||
href="../../utility/MultiPassInputIterator.html">MultiPassInputIterator</a>.
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
|
||||
<table border>
|
||||
|
||||
<tr>
|
||||
<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="#1">[1]</a>
|
||||
|
||||
<br> Return type:
|
||||
<TT>std::pair<adjacency_iterator, adjacency_iterator></TT>
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<H3>Complexity guarantees</H3>
|
||||
|
||||
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="./adjacency_iterator.html"><tt>adjacency_iterator</tt></a>
|
||||
|
||||
<H3>Concept Checking Class</H3>
|
||||
|
||||
<PRE>
|
||||
template <class G>
|
||||
struct AdjacencyGraphConcept
|
||||
{
|
||||
typedef typename boost::graph_traits<G>::adjacency_iterator
|
||||
adjacency_iterator;
|
||||
void constraints() {
|
||||
function_requires< IncidenceGraphConcept<G> >();
|
||||
function_requires< MultiPassInputIteratorConcept<adjacency_iterator> >();
|
||||
|
||||
p = adjacent_vertices(v, g);
|
||||
v = *p.first;
|
||||
const_constraints(g);
|
||||
}
|
||||
void const_constraints(const G& g) {
|
||||
p = adjacent_vertices(v, g);
|
||||
}
|
||||
std::pair<adjacency_iterator,adjacency_iterator> p;
|
||||
typename boost::graph_traits<G>::vertex_descriptor v;
|
||||
G g;
|
||||
};
|
||||
</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>
|
||||
|
||||
<a name="1">[1]</a> The case of a
|
||||
<I>multigraph</I> (where multiple edges can connect the same two
|
||||
vertices) brings up an issue as to whether the iterators returned by
|
||||
the <TT>adjacent_vertices()</TT> function access a range that
|
||||
includes each adjacent vertex once, or whether it should match the
|
||||
behavior of the <TT>out_edges()</TT> function, and access a
|
||||
range that may include an adjacent vertex more than once. For now the
|
||||
behavior is defined to match that of <TT>out_edges()</TT>,
|
||||
though this decision may need to be reviewed in light of more
|
||||
experience with graph algorithm implementations.
|
||||
|
||||
|
||||
|
||||
<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>
|
||||
@@ -1,103 +0,0 @@
|
||||
<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>AdjacencyMatrix</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:AdjacencyMatrix"></A>
|
||||
AdjacencyMatrix
|
||||
</H2>
|
||||
|
||||
<P>
|
||||
The AdjacencyMatrix concept refines <a href="./Graph.html">Graph</a>
|
||||
concept and adds the requirement for efficient access to any edge in
|
||||
the graph given the source and target vertices. No Boost Graph Library
|
||||
algorithms currently use this concept. However there are algorithms
|
||||
not yet implemented such as Floyd-Warshall that would require this
|
||||
concept.
|
||||
|
||||
<H3>Refinement of</H3>
|
||||
|
||||
<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>
|
||||
|
||||
<tr>
|
||||
<th>Name</th><th>Expression</th><th>Return Type</th><th>Description</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Direct Edge Access</td>
|
||||
<TD><TT>edge(u,v,g)</TT></TD>
|
||||
<TD><TT>std::pair<edge_descriptor, bool></TT></TD>
|
||||
<TD>
|
||||
Returns a pair consisting of a flag saying whether there exists an
|
||||
edge between <TT>u</TT> and <TT>v</TT> in graph <TT>g</TT>, and
|
||||
consisting of the edge descriptor if the edge was found.
|
||||
</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
<H3>Complexity guarantees</H3>
|
||||
|
||||
The <TT>edge()</TT> function must return in constant time.
|
||||
|
||||
|
||||
<H3>Models</H3>
|
||||
|
||||
<a href="./adjacency_matrix.html"><tt>adjacency_matrix</tt></a>
|
||||
|
||||
<H3>Concept Checking Class</H3>
|
||||
|
||||
<PRE>
|
||||
template <class G>
|
||||
struct AdjacencyMatrix
|
||||
{
|
||||
typedef typename boost::graph_traits<G>::edge_descriptor edge_descriptor;
|
||||
void constraints() {
|
||||
p = edge(u, v, g);
|
||||
}
|
||||
typename boost::graph_traits<G>::vertex_descriptor u, v;
|
||||
std::pair<bool, edge_descriptor> p;
|
||||
G g;
|
||||
};
|
||||
</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>
|
||||
@@ -1,220 +0,0 @@
|
||||
<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: BFSVisitor</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><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 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>
|
||||
|
||||
<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 BFS 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</tt></TD>
|
||||
<TD>An object of type <tt>boost::graph_traits<G>::vertex_descriptor</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(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>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>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>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on every out-edge of each vertex after it is discovered.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
<tr>
|
||||
<td>Tree Edge</td>
|
||||
<td><tt>vis.tree_edge(e, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on each edge as it becomes a member of the edges that
|
||||
form the search tree.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<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
|
||||
edges for undirected graphs.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Gray Target</td>
|
||||
<td><tt>vis.gray_target(e, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
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>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Black Target</td>
|
||||
<td><tt>vis.black_target(e, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
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>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Finish Vertex</td>
|
||||
<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 the out-edges of the adjacent vertices have been examined).
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Models</h3>
|
||||
|
||||
<ul>
|
||||
<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>
|
||||
|
||||
<a href="./visitor_concepts.html">Visitor 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>)<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>
|
||||
@@ -1,103 +0,0 @@
|
||||
<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>
|
||||
@@ -1,184 +0,0 @@
|
||||
<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: Bellman Ford 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><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 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>
|
||||
|
||||
<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 Bellman Ford 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</tt></TD>
|
||||
<TD>An object of type <tt>boost::graph_traits<G>::vertex_descriptor</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>Examine Edge</td>
|
||||
<td><tt>vis.examine_edge(e, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on every edge in the graph <tt>num_vertices(g)</tt> times.
|
||||
</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 (its distance is reduced), and this method is invoked.<br>
|
||||
<tt>
|
||||
tie(u,v) = incident(e, g);<br>
|
||||
D d_u = get(d, u), d_v = get(d, v);<br>
|
||||
W w_e = get(w, e);<br>
|
||||
assert(compare(combine(d_u, w_e), d_v));<br>
|
||||
</tt>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Edge Not Relaxed</td>
|
||||
<td><tt>edge_not_relaxed(e, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
Upon examination, if the edge is not relaxed (see above) then
|
||||
this method is invoked.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Edge Minimized</td>
|
||||
<td><tt>vis.edge_minimized(e, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
After the <tt>num_vertices(g)</tt> iterations through the edge set
|
||||
of the graph is complete, one last iteration is made to test whether
|
||||
each edge was minimized. If the edge is minimized then this function
|
||||
is invoked.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Edge Not Minimized</td>
|
||||
<td><tt>edge_not_minimized(e, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
If the edge is not minimized, this function is invoked. This happens
|
||||
when there is a negative cycle in the graph.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
|
||||
<h3>Models</h3>
|
||||
|
||||
<ul>
|
||||
<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-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>
|
||||
@@ -1,175 +0,0 @@
|
||||
<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>Bidirectional</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:BidirectionalGraph"></A>
|
||||
BidirectionalGraph
|
||||
</H2>
|
||||
|
||||
<P>
|
||||
The BidirectionalGraph concept refines <a
|
||||
href="./IncidenceGraph.html">IncidenceGraph</a> and adds the
|
||||
requirement for efficient access to the in-edges of each vertex. This
|
||||
concept is separated from <a
|
||||
href="./IncidenceGraph.html">IncidenceGraph</a> because for directed
|
||||
graphs efficient access to in-edges typically requires more storage
|
||||
space, and many algorithms do not require access to in-edges. For
|
||||
undirected graphs this is not an issue, since the <TT>in_edges()</TT>
|
||||
and <TT>out_edges()</TT> functions are the same, they both return the
|
||||
edges incident to the vertex.
|
||||
|
||||
<H3>Refinement of</H3>
|
||||
|
||||
<a href="./IncidenceGraph.html">IncidenceGraph</a>
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<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>v</tt></TD>
|
||||
<TD>An object of type <tt>boost::graph_traits<G>::vertex_descriptor</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<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>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
|
||||
in-edges of <i>v</i>. As such, the value type of an in-edge iterator
|
||||
is the edge descriptor type of its graph. An in-edge iterator must
|
||||
meet the requirements of <a href="../../utility/MultiPassInputIterator.html">MultiPassInputIterator</a>.
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
</Table>
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
<Table border>
|
||||
|
||||
<tr>
|
||||
<td><a name="sec:in-edges"><TT>in_edges(v, g)</TT></a></TD>
|
||||
<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>.
|
||||
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>
|
||||
|
||||
<tr>
|
||||
<TD><TT>in_degree(v, g)</TT></TD>
|
||||
<TD>
|
||||
Returns the number of in-edges (for directed graphs) or the
|
||||
number of incident edges (for undirected graphs) of vertex <TT>v</TT>
|
||||
in graph <TT>g</TT>.<br>
|
||||
Return type: <TT>degree_size_type</TT>
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<TD><TT>degree(v, g)</TT></TD>
|
||||
<TD>Returns the number of in-edges plus out-edges (for directed graphs) or the
|
||||
number of incident edges (for undirected graphs) of vertex <TT>v</TT>
|
||||
in graph <TT>g</TT>.<br>
|
||||
Return type: <TT>degree_size_type</TT>
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
</Table>
|
||||
|
||||
<H3>Models</H3>
|
||||
|
||||
<ul>
|
||||
<li><a href="./adjacency_list.html"><tt>adjacency_list</tt></a> with <tt>Directed=bidirectionalS</tt></li>
|
||||
<li><a href="./adjacency_list.html"><tt>adjacency_list</tt></a> with <tt>Directed=undirectedS</tt></li>
|
||||
</ul>
|
||||
|
||||
|
||||
<H3>Complexity guarantees</H3>
|
||||
|
||||
The <TT>in_edges()</TT> function is required to be constant time. The
|
||||
<tt>in_degree()</tt> and <tt>degree()</tt> functions must be linear in
|
||||
the number of in-edges (for directed graphs) or incident edges (for
|
||||
undirected graphs).
|
||||
|
||||
<H3>See Also</H3>
|
||||
|
||||
<a href="./graph_concepts.html">Graph concepts</a>
|
||||
|
||||
<H3>Concept Checking Class</H3>
|
||||
|
||||
<PRE>
|
||||
template <class G>
|
||||
struct BidirectionalGraphConcept
|
||||
{
|
||||
typedef typename boost::graph_traits<G>::in_edge_iterator
|
||||
in_edge_iterator;
|
||||
void constraints() {
|
||||
function_requires< IncidenceGraphConcept<G> >();
|
||||
function_requires< MultiPassInputIteratorConcept<in_edge_iterator> >();
|
||||
|
||||
p = in_edges(v, g);
|
||||
e = *p.first;
|
||||
const_constraints(g);
|
||||
}
|
||||
void const_constraints(const G& g) {
|
||||
p = in_edges(v, g);
|
||||
e = *p.first;
|
||||
}
|
||||
std::pair<in_edge_iterator, in_edge_iterator> p;
|
||||
typename boost::graph_traits<G>::vertex_descriptor v;
|
||||
typename boost::graph_traits<G>::edge_descriptor e;
|
||||
G g;
|
||||
};
|
||||
</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>
|
||||
-118
@@ -1,118 +0,0 @@
|
||||
<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>Buffer</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>
|
||||
|
||||
<h3>Buffer Concept</h3>
|
||||
|
||||
A Buffer is something in which items can be put and removed.
|
||||
The Buffer <i>concept</i> has very few requirements. It does
|
||||
not require any particular ordering of how the items are stored or in
|
||||
what order they will appear when removed, however, there is typically
|
||||
some sort of ordering policy.
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<table>
|
||||
<tr> <td> <tt>B</tt> </td> <td> is a type that models Buffer. </td></tr>
|
||||
<tr> <td> <tt>T</tt> </td> <td> is the value type of <tt>B</tt>. </td></tr>
|
||||
<tr> <td> <tt>t</tt> </td> <td> is an object of type <tt>T</tt>. </td></tr>
|
||||
</table>
|
||||
|
||||
|
||||
<h3>Members</h3>
|
||||
|
||||
For a type to model the Buffer concept it must have the following members.
|
||||
|
||||
<p>
|
||||
|
||||
<table border="1">
|
||||
|
||||
<tr> <td><b>Member</b></td> <td><b>Description</b></td> </tr>
|
||||
|
||||
<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/tech/stl/Assignable.html">Assignable</a>.</td>
|
||||
</tr>
|
||||
|
||||
<tr> <td> <tt>size_type</tt> </td>
|
||||
<td> An unsigned integral type for representing the number of
|
||||
objects in the Buffer.</td>
|
||||
</tr>
|
||||
|
||||
<tr> <td> <tt>void push(const T& t)</tt> </td>
|
||||
<td> Inserts <tt>t</tt> into the Buffer. <tt>size()</tt> will be
|
||||
incremented by one.</td>
|
||||
</tr>
|
||||
|
||||
<tr> <td> <tt>void pop()</tt> </td>
|
||||
<td> Removes an object from the Buffer. <tt>size()</tt> will be
|
||||
decremented by one. Precondition: <tt>empty()</tt>
|
||||
is <tt>false</tt>. </td>
|
||||
</tr>
|
||||
|
||||
<tr> <td> <tt>T& top()</tt> </td>
|
||||
<td> Returns a mutable reference to some object in the Buffer.
|
||||
Precondition: <tt>empty()</tt> is <tt>false</tt>.</td>
|
||||
</tr>
|
||||
|
||||
<tr> <td> <tt>const T& top() const</tt> </td>
|
||||
<td> Returns a const reference to some object in the Buffer.
|
||||
Precondition: <tt>empty()</tt> is <tt>false</tt>.</td>
|
||||
</tr>
|
||||
|
||||
<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>
|
||||
|
||||
<tr> <td> <tt>bool empty() const</tt> </td>
|
||||
<td> Equivalent to <tt>b.size() == 0</tt>.</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Complexity Guarantees</h3>
|
||||
|
||||
<UL>
|
||||
|
||||
<LI> <tt>push()</tt>, <tt>pop()</tt>, and <tt>size()</tt> must be at
|
||||
most linear time complexity in the size of the Generalized Queue.
|
||||
|
||||
<LI> <tt>top()</tt> and <tt>empty()</tt> must be amortized constant time.
|
||||
|
||||
</UL>
|
||||
|
||||
<h3>Models</h3>
|
||||
|
||||
<UL>
|
||||
<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>
|
||||
|
||||
<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 and C++ Library & Compiler Group/SGI (<A HREF="mailto:jsiek@engr.sgi.com">jsiek@engr.sgi.com</A>)
|
||||
</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
# Contributing to the Boost.Graph documentation
|
||||
|
||||
The docs are built with [Antora](https://antora.org) from AsciiDoc
|
||||
sources under `doc/modules/ROOT/`.
|
||||
|
||||
## Layout
|
||||
|
||||
| Where | What |
|
||||
|---|---|
|
||||
| `doc/modules/ROOT/pages/` | All `.adoc` pages (organized by topic) |
|
||||
| `doc/modules/ROOT/examples/` | One `.cpp` per page; the build script captures stdout into a sibling `.txt` |
|
||||
| `doc/modules/ROOT/nav.adoc` | Left-side navigation tree |
|
||||
| `doc/templates/` | Starter templates: `algorithm.adoc`, `generator.adoc`, `graph_class.adoc` — copy and fill in |
|
||||
| `doc/playbook.yml` | Antora playbook (UI bundle, content sources) |
|
||||
| `doc/modules/ROOT/examples/Jamfile` | b2 rules that compile every example and snapshot its stdout into a sibling `.txt` |
|
||||
| `doc/build_example_outputs.sh`| g++-only fallback that does the same thing as the Jamfile, for contributors without a `boost-root` checkout |
|
||||
|
||||
## Adding a new page
|
||||
|
||||
1. Pick a template in `doc/templates/` and copy it into the right
|
||||
`pages/` subdirectory.
|
||||
2. Replace the placeholders (title, signatures, parameter table). Keep
|
||||
the section order from the template so the page is consistent with
|
||||
the rest.
|
||||
3. Add an `.cpp` example under `modules/ROOT/examples/` at the path
|
||||
the page's `include::example$…[]` directive points to.
|
||||
4. Add an `xref:` line to `doc/modules/ROOT/nav.adoc`.
|
||||
|
||||
## Building locally
|
||||
|
||||
The example outputs are generated by b2 (the standard Boost build
|
||||
system). From a `boost-root` layout:
|
||||
|
||||
```sh
|
||||
# 1) Compile every example and snapshot its stdout into a sibling .txt.
|
||||
b2 libs/graph/doc/modules/ROOT/examples
|
||||
|
||||
# 2) Build the static site.
|
||||
cd libs/graph
|
||||
npx antora doc/playbook.yml
|
||||
|
||||
# 3) Open the result.
|
||||
open doc/build/site/index.html # macOS
|
||||
xdg-open doc/build/site/index.html # Linux
|
||||
```
|
||||
|
||||
CI runs the same commands on every push.
|
||||
|
||||
### Quick fallback (no boost-root required)
|
||||
|
||||
For doc-only contributors who only want to fix typos and don't have a
|
||||
boost-root checkout, a shell-script equivalent is provided:
|
||||
|
||||
```sh
|
||||
BOOST_INCLUDE=/path/to/boost/include \
|
||||
BOOST_LIB=/path/to/boost/lib \
|
||||
bash doc/build_example_outputs.sh
|
||||
```
|
||||
|
||||
Functionally equivalent to step 1 above; uses g++ directly instead of
|
||||
b2. `BOOST_LIB` is only needed for the three link-required examples
|
||||
(`io/graphml.cpp`, `io/graphviz.cpp`,
|
||||
`algorithms/isomorphism/isomorphism.cpp`).
|
||||
|
||||
## Conventions
|
||||
|
||||
- **Examples first.** `== Example` (with `*Expected output:*` block)
|
||||
goes immediately after `*Defined in:*` so readers see working code
|
||||
before signatures.
|
||||
- **Bold metadata.** `*Complexity:*`, `*Defined in:*`,
|
||||
`*Expected output:*` are bold.
|
||||
- **Output blocks** use `[,text]\n----` (same listing-block wrapper as
|
||||
the code above) and pull from the `.txt` sidecar via
|
||||
`include::example$…[]`, so the documentation can never drift from the
|
||||
code and the two blocks align vertically on the page.
|
||||
- **Heading levels:** `==` for top-level sections; `===` only for
|
||||
numbered overloads or grouped variants. The `'''` thematic break
|
||||
appears only before a `===`, never before a `==`.
|
||||
- **Bundled properties** preferred over interior tag properties in
|
||||
examples, unless the algorithm requires the tag.
|
||||
|
||||
## License
|
||||
|
||||
By contributing you agree to license your contribution under the
|
||||
[Boost Software License 1.0](http://www.boost.org/LICENSE_1_0.txt).
|
||||
@@ -1,108 +0,0 @@
|
||||
<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: ColorValue Concept</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:ColorValue"></A>
|
||||
ColorValue
|
||||
</H1>
|
||||
|
||||
<P>
|
||||
This concept describes the requirements for the type used for color
|
||||
values, as in for coloring a graph during a breath-first search to
|
||||
mark which vertices have been visited.
|
||||
|
||||
<P>
|
||||
|
||||
<h3>Refinement of</h3> <a
|
||||
href="http://www.sgi.com/tech/stl/EqualityComparable.html">EqualityComparable</a>
|
||||
and <a
|
||||
href="http://www.sgi.com/tech/stl/DefaultConstructible.html">DefaultConstructible</a>
|
||||
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<TR>
|
||||
<TD><tt>T</tt></TD>
|
||||
<TD>A type that is a model of ColorValue.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>cv</tt></TD>
|
||||
<TD>An object of type <tt>T</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
<Table border>
|
||||
|
||||
<tr>
|
||||
<th>Name</th><th>Expression</th><th>Return Type</th><th>Description</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Get Color White </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>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>color_traits<T>::black()</TT></TD>
|
||||
<TD><TT>T</TT></TD>
|
||||
<TD>Returns an object that represents the color black.</TD>
|
||||
</TR>
|
||||
|
||||
</TABLE>
|
||||
|
||||
<P>
|
||||
</LI>
|
||||
</UL>
|
||||
|
||||
<h3>Models</h3>
|
||||
|
||||
<ul>
|
||||
<li><tt>default_color_type</tt> (in <a href="../../../boost/graph/properties.hpp"><tt>boost/graph/properties.hpp</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>
|
||||
@@ -1,212 +0,0 @@
|
||||
<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>DFS 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><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 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>
|
||||
|
||||
<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 DFS 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</tt></TD>
|
||||
<TD>An object of type <tt>boost::graph_traits<G>::vertex_descriptor</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(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>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>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked when a vertex is encountered for the first time.
|
||||
</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 discovered.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
<tr>
|
||||
<td>Tree Edge</td>
|
||||
<td><tt>vis.tree_edge(e, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on each edge as it becomes a member of the edges that
|
||||
form the search tree.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Back Edge</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. 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>
|
||||
|
||||
<tr>
|
||||
<td>Forward or Cross Edge</td>
|
||||
<td><tt>vis.forward_or_cross_edge(e, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on forward or cross edges in the graph. In an
|
||||
undirected graph this method is never called.
|
||||
</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 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>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Models</h3>
|
||||
|
||||
<ul>
|
||||
<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-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>
|
||||
@@ -1,222 +0,0 @@
|
||||
<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><img src="figs/python.gif" alt="(Python)"/>Dijkstra Visitor Concept</H1>
|
||||
|
||||
This concept defines the visitor interface for <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>dijkstra_shortest_paths()</tt> to augment the actions taken during
|
||||
the 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 Dijkstra 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>DistanceMap</tt></TD>
|
||||
<TD>A type that is a model of <a href="../../property_map/ReadWritePropertyMap.html">Read/Write Property Map</a>.</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/ReadWritePropertyMap.html">Readable Property Map</a>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>w</tt></TD>
|
||||
<TD>An object of type <tt>DistanceMap</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 one each vertex of the graph when it is initialized.
|
||||
</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>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
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>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
Upon examination, if the following condition holds then the edge
|
||||
is relaxed (its distance is reduced), and this method is invoked.<br>
|
||||
<tt>
|
||||
tie(u,v) = incident(e, g);<br>
|
||||
D d_u = get(d, u), d_v = get(d, v);<br>
|
||||
W w_e = get(w, e);<br>
|
||||
assert(compare(combine(d_u, w_e), d_v));<br>
|
||||
</tt>
|
||||
</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 the edge is not relaxed (see above) then
|
||||
this method is invoked.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Finish Vertex</td>
|
||||
<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).
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Models</h3>
|
||||
|
||||
<ul>
|
||||
<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-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>
|
||||
@@ -1,184 +0,0 @@
|
||||
<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>EdgeListGraph</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:EdgeListGraph"></A>
|
||||
EdgeListGraph
|
||||
</H2>
|
||||
|
||||
The EdgeListGraph concept refines the <a href="./Graph.html">Graph</a>
|
||||
concept, and adds the requirement for efficient access to all the
|
||||
edges in the graph.
|
||||
|
||||
|
||||
<H3>Refinement of</H3>
|
||||
|
||||
<a href="./Graph.html">Graph</a>
|
||||
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<TR>
|
||||
<TD><tt>G</tt></TD>
|
||||
<TD>A type that is a model of EdgeListGraph.</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>
|
||||
|
||||
</table>
|
||||
|
||||
<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>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
|
||||
all of the edges in a graph. An edge iterator type must meet the
|
||||
requirements of <a
|
||||
href="../../utility/MultiPassInputIterator.html">MultiPassInputIterator</a>. The
|
||||
value type of the edge iterator must be the same as the edge
|
||||
descriptor of the graph.
|
||||
|
||||
<tr>
|
||||
<td><pre>boost::graph_traits<G>::edges_size_type</pre>
|
||||
The unsigned integer type used to represent the number of edges in the
|
||||
graph.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
<table border>
|
||||
|
||||
<tr>
|
||||
<TD><a name="sec:edges"><TT>edges(g)</TT></a></TD>
|
||||
<TD>Returns an iterator-range providing access to all
|
||||
the edges in the graph <TT>g</TT>.<br>
|
||||
Return type: <TT>std::pair<edge_iterator, edge_iterator></TT>
|
||||
</td>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<TD><TT>num_edges(g)</TT></TD>
|
||||
<TD>Returns the number of edges in the graph <TT>g</TT>.<br>
|
||||
Return type: <TT>edges_size_type</TT>
|
||||
</td>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<TD><TT>source(e, g)</TT></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>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<TD><TT>target(e, g)</TT></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>
|
||||
|
||||
</TABLE>
|
||||
|
||||
|
||||
<H3>Models</H3>
|
||||
|
||||
<UL>
|
||||
<LI><a href="./adjacency_list.html"><TT>adjacency_list</TT></a></LI>
|
||||
<LI><a href="./edge_list.html"><TT>edge_list</TT></a></LI>
|
||||
</UL>
|
||||
|
||||
|
||||
<H3>Complexity guarantees</H3>
|
||||
|
||||
The <TT>edges()</TT>, <TT>source()</TT>, and <TT>target()</TT> functions
|
||||
must all return in constant time.
|
||||
|
||||
|
||||
<H3>See Also</H3>
|
||||
|
||||
<a href="./graph_concepts.html">Graph concepts</a>
|
||||
|
||||
<H3>Concept Checking Class</H3>
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
template <class G>
|
||||
struct EdgeListGraphConcept
|
||||
{
|
||||
typedef typename boost::graph_traits<G>::edge_iterator
|
||||
edge_iterator;
|
||||
void constraints() {
|
||||
function_requires< GraphConcept<G> >();
|
||||
function_requires< MultiPassInputIteratorConcept<edge_iterator> >();
|
||||
|
||||
p = edges(g);
|
||||
E = num_edges(g);
|
||||
e = *p.first;
|
||||
u = source(e, g);
|
||||
v = target(e, g);
|
||||
const_constraints(g);
|
||||
}
|
||||
void const_constraints(const G& g) {
|
||||
p = edges(g);
|
||||
E = num_edges(g);
|
||||
e = *p.first;
|
||||
u = source(e, g);
|
||||
v = target(e, g);
|
||||
}
|
||||
std::pair<edge_iterator,edge_iterator> p;
|
||||
typename boost::graph_traits<G>::vertex_descriptor u, v;
|
||||
typename boost::graph_traits<G>::edge_descriptor e;
|
||||
typename boost::graph_traits<G>::edges_size_type E;
|
||||
G g;
|
||||
};
|
||||
</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>
|
||||
@@ -1,108 +0,0 @@
|
||||
<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>
|
||||
@@ -1,161 +0,0 @@
|
||||
<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: EventVisitor</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>EventVisitor Concept</H1>
|
||||
|
||||
This concept defines the interface for single-event visitors. An
|
||||
EventVisitor has an apply member function (<tt>operator()</tt>) which
|
||||
is invoked within the graph algorithm at the event-point specified by
|
||||
the <tt>event_filter</tt> typedef within the
|
||||
EventVisitor. EventVisitor's can be combined into an <a
|
||||
href="./EventVisitorList.html">EventVistorList</a>.
|
||||
|
||||
<p>
|
||||
The following is the list of event tags that can be invoked in BGL
|
||||
algorithms. Each tag corresponds to a member function of the visitor
|
||||
for an algorithm. For example, the <a
|
||||
href="./BFSVisitor.html">BFSVisitor</a> of <a
|
||||
href="./breadth_first_search.html"><tt>breadth_first_search()</tt></a>
|
||||
has a <tt>cycle_edge()</tt> member function. The corresponding tag is
|
||||
<tt>on_cycle_edge</tt>. The first argument is the event visitor's
|
||||
<tt>operator()</tt> must be either an edge or vertex descriptor
|
||||
depending on the event tag.
|
||||
|
||||
<pre>
|
||||
namespace boost {
|
||||
struct on_initialize_vertex { };
|
||||
struct on_start_vertex { };
|
||||
struct on_discover_vertex { };
|
||||
struct on_examine_edge { };
|
||||
struct on_tree_edge { };
|
||||
struct on_cycle_edge { };
|
||||
struct on_finish_vertex { };
|
||||
struct on_forward_or_cross_edge { };
|
||||
struct on_back_edge { };
|
||||
struct on_edge_relaxed { };
|
||||
struct on_edge_not_relaxed { };
|
||||
struct on_edge_minimized { };
|
||||
struct on_edge_not_minimized { };
|
||||
} // namespace boost
|
||||
</pre>
|
||||
|
||||
|
||||
<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>G</tt></TD>
|
||||
<TD>A type that is a model of <a href="./Graph.html">Graph</a>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>g</tt></TD>
|
||||
<TD>An object of type <tt>G</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>V</tt></TD>
|
||||
<TD>A type that is a model of EventVisitor.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>vis</tt></TD>
|
||||
<TD>An object of type <tt>V</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>x</tt></TD>
|
||||
<TD>An object of type
|
||||
<tt>boost::graph_traits<G>::vertex_descriptor</tt>
|
||||
or <tt>boost::graph_traits<G>::edge_descriptor</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Associated Types</h3>
|
||||
|
||||
<Table border>
|
||||
|
||||
<TR>
|
||||
<TD>Event Filter </TD>
|
||||
<TD><TT>V::event_filter</TT></TD>
|
||||
<TD>
|
||||
A tag struct to specify on which event the visitor should be invoked.
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
<Table border>
|
||||
|
||||
<tr>
|
||||
<th>Name</th><th>Expression</th><th>Return Type</th><th>Description</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Apply Visitor</td>
|
||||
<td><TT>vis(x, g)</TT></TD>
|
||||
<TD><TT>void</TT></TD>
|
||||
<TD>
|
||||
Invokes the visitor operation on object <tt>x</tt>, which is
|
||||
either a vertex or edge descriptor of the graph.
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
|
||||
</table>
|
||||
|
||||
|
||||
<h3>Models</h3>
|
||||
|
||||
<ul>
|
||||
<li><a
|
||||
href="./predecessor_recorder.html"><tt>predecessor_recorder</tt></a>
|
||||
<li><a href="./distance_recorder.html"><tt>distance_recorder</tt></a>
|
||||
<li><a href="./time_stamper.html"><tt>time_stamper</tt></a>
|
||||
<li><a href="./property_writer.html"><tt>property_writer</tt></a>
|
||||
<li><a href="./null_visitor.html"><tt>null_visitor</tt></a>
|
||||
</ul>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
<a href="./EventVisitorList.html">EventVisitorList</a>,
|
||||
<a href="./visitor_concepts.html">Visitor 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>)<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>
|
||||
@@ -1,127 +0,0 @@
|
||||
<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: EventVisitorList</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>EventVisitorList Concept</H1>
|
||||
|
||||
An EventVisitorList is either an <a
|
||||
href="./EventVisitor.html">EventVisitor</a>, or a list of
|
||||
EventVisitor's combined using <tt>std::pair</tt>. Each graph algorithm
|
||||
defines visitor adaptors that convert an EventVisitorList into the
|
||||
particular kind of visitor needed by the algorithm.
|
||||
|
||||
In the following example we will show how to combine event visitors
|
||||
into a list using <tt>std::pair</tt> and how to use an algorithm's
|
||||
visitor adaptor class.
|
||||
|
||||
<p>
|
||||
Suppose we would like to print out the parenthesis
|
||||
structure of the discover/finish times of vertices in a <a
|
||||
href="./graph_theory_review.html#sec:dfs-algorithm">depth-first
|
||||
search</a>. We can use the BGL algorithm <a
|
||||
href="./depth_first_search.html"><tt>depth_first_search()</tt></a> and
|
||||
two event visitors to accomplish this. The complete source code for
|
||||
the following example is in <a href="../example/dfs_parenthesis.cpp">
|
||||
<tt>examples/dfs_parenthesis.cpp</tt></a>. First we define the two
|
||||
event visitors. We use <tt>on_discover_vertex</tt> and
|
||||
<tt>on_finish_vertex</tt> as the event points, selected from the list
|
||||
of event points specified in <a
|
||||
href="./DFSVisitor.html">DFSVisitor</a>.
|
||||
|
||||
<pre>
|
||||
struct open_paren : public base_visitor<open_paren> {
|
||||
typedef on_discover_vertex event_filter;
|
||||
template <class Vertex, class Graph>
|
||||
void operator()(Vertex v, Graph& G) {
|
||||
std::cout << "(" << v;
|
||||
}
|
||||
};
|
||||
struct close_paren : public base_visitor<close_paren> {
|
||||
typedef on_finish_vertex event_filter;
|
||||
template <class Vertex, class Graph>
|
||||
void operator()(Vertex v, Graph& G) {
|
||||
std::cout << v << ")";
|
||||
}
|
||||
};
|
||||
</pre>
|
||||
|
||||
Next we create two event visitor objects and make an EventVisitorList
|
||||
out of them using a <tt>std::pair</tt> which created by
|
||||
<tt>std::make_pair</tt>.
|
||||
|
||||
<pre>
|
||||
std::make_pair(open_paren(), close_paren())
|
||||
</pre>
|
||||
|
||||
Next we want to pass this list into <tt>depth_first_search()</tt>, but
|
||||
<tt>depth_first_search()</tt> is expecting a <a
|
||||
href="./DFSVisitor.html">DFSVisitor</a>, not a EventVisitorList. We
|
||||
therefore use the <a
|
||||
href="./dfs_visitor.html"><tt>dfs_visitor</tt></a> adaptor which turns
|
||||
an EventVisitor list into a DFSVisitor. Like all of the visitor
|
||||
adaptors, <tt>dfs_visitor</tt> has a creation function called
|
||||
<tt>make_dfs_visitor()</tt>.
|
||||
|
||||
<pre>
|
||||
make_dfs_visitor(std::make_pair(open_paren(), close_paren()))
|
||||
</pre>
|
||||
|
||||
Now we can pass the resulting visitor object into
|
||||
<tt>depth_first_search()</tt> as follows.
|
||||
|
||||
<pre>
|
||||
// graph object G is created ...
|
||||
|
||||
std::vector<default_color_type> color(num_vertices(G));
|
||||
|
||||
depth_first_search(G, make_dfs_visitor(std::make_pair(open_paren(), close_paren())),
|
||||
color.begin());
|
||||
</pre>
|
||||
|
||||
For creating a list of more than two event visitors, nest calls to
|
||||
<tt>std::make_pair</tt> in the following way:
|
||||
|
||||
<pre>
|
||||
std::make_pair(<i>visitor1</i>,
|
||||
std::make_pair(<i>visitor2</i>,
|
||||
...
|
||||
std::make_pair(<i>visitorN-1</i>, <i>visitorN</i>)...));
|
||||
</pre>
|
||||
|
||||
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
<a href="./EventVisitor.html">EventVisitor</a>,
|
||||
<a href="./visitor_concepts.html">Visitor 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>)<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>
|
||||
-149
@@ -1,149 +0,0 @@
|
||||
<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>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:Graph"></A>
|
||||
Graph
|
||||
</H2>
|
||||
|
||||
<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. One should
|
||||
note that a model of Graph is <B>not</B> required to be a model of <a
|
||||
href="http://www.sgi.com/tech/stl/Assignable.html">Assignable</a>,
|
||||
so algorithms should pass graph objects by reference.
|
||||
|
||||
<P>
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<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>
|
||||
</table>
|
||||
|
||||
<H3>Associated Types</H3>
|
||||
|
||||
<table border>
|
||||
<tr>
|
||||
<td><pre>boost::graph_traits<G>::vertex_descriptor</pre>
|
||||
A vertex descriptor corresponds to a unique vertex in an abstract
|
||||
graph instance. A vertex descriptor must be
|
||||
<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>
|
||||
|
||||
<tr>
|
||||
<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/tech/stl/DefaultConstructible.html">Default Constructible</I>,
|
||||
<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>
|
||||
This type shall be convertible to <TT>directed_tag</TT> or <TT>undirected_tag</TT>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><pre>boost::graph_traits<G>::edge_parallel_category</pre>
|
||||
This describes whether the graph class allows the insertion of
|
||||
parallel edges (edges with the same source and target). The two tags
|
||||
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>
|
||||
|
||||
<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>
|
||||
|
||||
<PRE>
|
||||
template <class G>
|
||||
struct GraphConcept
|
||||
{
|
||||
typedef typename boost::graph_traits<G>::vertex_descriptor vertex_descriptor;
|
||||
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> >();
|
||||
function_requires< EqualityComparableConcept<vertex_descriptor> >();
|
||||
function_requires< AssignableConcept<vertex_descriptor> >();
|
||||
function_requires< DefaultConstructibleConcept<edge_descriptor> >();
|
||||
function_requires< EqualityComparableConcept<edge_descriptor> >();
|
||||
function_requires< AssignableConcept<edge_descriptor> >();
|
||||
}
|
||||
G g;
|
||||
};
|
||||
</PRE>
|
||||
|
||||
<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>
|
||||
@@ -1,202 +0,0 @@
|
||||
<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>IncidenceGraph</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:IncidenceGraph"></A>
|
||||
IncidenceGraph
|
||||
</H1>
|
||||
|
||||
The IncidenceGraph concept provides an interface for
|
||||
efficient access to the out-edges of each vertex in the graph.
|
||||
|
||||
|
||||
<H3>Refinement of</H3>
|
||||
|
||||
<a href="./Graph.html">Graph</a>
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<TR>
|
||||
<TD><tt>G</tt></TD>
|
||||
<TD>A type that is a model of IncidenceGraph.</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>u, v</tt></TD>
|
||||
<TD>Are objects of type <tt>boost::graph_traits<G>::vertex_descriptor</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<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>incidence_graph_tag</tt>.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
||||
<TR>
|
||||
<TD>
|
||||
<pre>boost::graph_traits<G>::out_edge_iterator</pre>
|
||||
An out-edge iterator for a vertex <i>v</i> provides access to the
|
||||
out-edges of the vertex. As such, the value type of an out-edge
|
||||
iterator is the edge descriptor type of its graph. An out-edge
|
||||
iterator must meet the requirements of <a
|
||||
href="../../utility/MultiPassInputIterator.html">MultiPassInputIterator</a>.
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><pre>boost::graph_traits<G>::degree_size_type</pre>
|
||||
The unsigned intergral type used for representing the number
|
||||
out-edges or incident edges of a vertex.
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
<Table border>
|
||||
|
||||
<tr>
|
||||
<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>
|
||||
</TR>
|
||||
|
||||
|
||||
<tr>
|
||||
<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(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(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>u</TT>
|
||||
in graph <TT>g</TT>.<br>
|
||||
Return type: <TT>degree_size_type</TT>
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
</TABLE>
|
||||
|
||||
<P>
|
||||
|
||||
<H3>Complexity guarantees</H3>
|
||||
|
||||
<P>
|
||||
The <TT>source()</TT>, <TT>target()</TT>, and <TT>out_edges()</TT>
|
||||
functions must all be constant time. The <tt>out_degree()</tt>
|
||||
function must be linear in the number of out-edges.
|
||||
|
||||
<P>
|
||||
|
||||
<H3>See Also</H3>
|
||||
|
||||
<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>
|
||||
template <class G>
|
||||
struct IncidenceGraphConcept
|
||||
{
|
||||
typedef typename boost::graph_traits<G>::out_edge_iterator out_edge_iterator;
|
||||
void constraints() {
|
||||
function_requires< GraphConcept<G> >();
|
||||
function_requires< MultiPassInputIteratorConcept<out_edge_iterator> >();
|
||||
|
||||
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(u, g);
|
||||
e = *p.first;
|
||||
u = source(e, g);
|
||||
v = target(e, g);
|
||||
}
|
||||
std::pair<out_edge_iterator, out_edge_iterator> p;
|
||||
typename boost::graph_traits<G>::vertex_descriptor u, v;
|
||||
typename boost::graph_traits<G>::edge_descriptor e;
|
||||
G g;
|
||||
};
|
||||
</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>
|
||||
@@ -1,161 +0,0 @@
|
||||
<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>
|
||||
-101
@@ -1,101 +0,0 @@
|
||||
# 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)
|
||||
-122
@@ -1,122 +0,0 @@
|
||||
<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>
|
||||
@@ -1,299 +0,0 @@
|
||||
<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>MutableGraph</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="sec:MutableGraph"></A>
|
||||
MutableGraph
|
||||
</H2>
|
||||
|
||||
A MutableGraph can be changed via the addition or removal of
|
||||
edges and vertices.
|
||||
|
||||
<H3>Refinement of</H3>
|
||||
|
||||
<a href="./Graph.html">Graph</a>
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<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>u,v</tt></TD>
|
||||
<TD>are objects of type <tt>boost::graph_traits<G>::vertex_descriptor</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>iter</tt></TD>
|
||||
<TD>is an object of type <tt>boost::graph_traits<G>::out_edge_iterator</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>p</tt></TD>
|
||||
<TD>is an object of a type that models <a
|
||||
href="http://www.sgi.com/tech/stl/Predicate.html">Predicate</a>
|
||||
and whose argument type matches the <tt>edge_descriptor</tt> type.
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<H3>Valid Expressions</H3>
|
||||
|
||||
<table border>
|
||||
|
||||
<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, 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>
|
||||
|
||||
<tr>
|
||||
<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 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>
|
||||
Postcondition: <i>(u,v)</i> is no longer in the edge set for
|
||||
<TT>g</TT>.<br>
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
|
||||
<tr>
|
||||
<TD><TT>remove_edge(e, g)</TT></TD>
|
||||
<TD>Remove the edge <i>e</i> from the graph.<br>
|
||||
Return type: <TT>void</TT><br>
|
||||
Precondition: <i>e</i> is an edge in the graph.<br>
|
||||
Postcondition: <i>e</i> is no longer in the edge set for <TT>g</TT>.
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<TD><TT>remove_edge(iter, g)</TT></TD>
|
||||
<TD>Remove the edge pointed to be <tt>iter</tt> from the graph. This
|
||||
expression is only required when the graph also models <a
|
||||
href="./IncidenceGraph.html">IncidenceGraph</a>.<br>
|
||||
Return type: <TT>void</TT><br>
|
||||
Precondition: <tt>*iter</tt> is an edge in the graph.<br>
|
||||
Postcondition: <tt>*iter</tt> is no longer in the edge set for <TT>g</TT>.
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<TD><TT>remove_edge_if(p, g)</TT></TD>
|
||||
<TD>Remove all the edges from graph <tt>g</tt> for which
|
||||
the predicate <tt>p</tt> returns true.<br>
|
||||
Return type: <TT>void</TT>
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<TD><TT>remove_out_edge_if(u, p, g)</TT></TD>
|
||||
<TD>Remove all the out-edges of vertex <tt>u</tt> for which the
|
||||
predicate <tt>p</tt> returns true. This expression is only required
|
||||
when the graph also models <a
|
||||
href="./IncidenceGraph.html">IncidenceGraph</a>.<br>
|
||||
Return type: <TT>void</TT>
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<TD><TT>remove_in_edge_if(u, p, g)</TT></TD>
|
||||
<TD>Remove all the in-edges of vertex <tt>u</tt> for which the
|
||||
predicate <tt>p</tt> returns true. This expression is only required when the
|
||||
graph also models <a
|
||||
href="./BidirectionalGraph.html">BidirectionalGraph</a>.<br>
|
||||
Return type: <TT>void</TT>
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
|
||||
<tr>
|
||||
<TD><a name="sec:add-vertex"><TT>add_vertex(g)</TT></a></TD>
|
||||
<TD>
|
||||
Add a new vertex to the graph. The <TT>vertex_descriptor</TT> for the
|
||||
new vertex is returned.<br>
|
||||
Return type: <TT>vertex_descriptor</TT>
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
|
||||
<tr>
|
||||
<TD><TT>clear_vertex(u, g)</TT></TD>
|
||||
<TD>
|
||||
Remove all edges to and from vertex <tt>u</tt> from the graph.<br>
|
||||
Return type: <TT>void</TT><br>
|
||||
Precondition: <tt>u</tt> is a valid vertex descriptor of <TT>g</TT>.<br>
|
||||
Postcondition: <tt>u</tt> does not appear as a source or target of
|
||||
any edge in <TT>g</TT>.
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<TD><a name="sec:remove-vertex"><TT>remove_vertex(u, g)</TT></a></TD>
|
||||
<TD>
|
||||
Remove <i>u</i> from the vertex set of the graph. Note that undefined
|
||||
behavior may result if there are edges remaining in the graph who's
|
||||
target is <i>u</i>. Typically the <TT>clear_vertex()</TT> function
|
||||
should be called first.<br>
|
||||
Return type: <TT>void</TT><br>
|
||||
Precondition: <TT>u</TT> is a valid vertex descriptor of <TT>g</TT>.<br>
|
||||
Postcondition: <TT>num_vertices(g)</TT> is one less, <TT>u</TT>
|
||||
no longer appears in the vertex set of the graph and it
|
||||
is no longer a valid vertex descriptor.
|
||||
</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
<P>
|
||||
</LI>
|
||||
</UL>
|
||||
|
||||
<P>
|
||||
|
||||
<H3>Complexity Guarantees</H3>
|
||||
|
||||
<P>
|
||||
|
||||
<UL>
|
||||
<LI>Edge insertion must be either amortized constant time or it
|
||||
can be <i>O(log(E/V))</i> if the insertion also checks to
|
||||
prevent the addition of parallel edges (which is a ``feature'' of
|
||||
some graph types).
|
||||
</LI>
|
||||
<LI>Edge removal is guaranteed to be <i>O(E)</i>.</LI>
|
||||
<LI>Vertex insertion is guaranteed to be amortized constant time.</LI>
|
||||
<LI>Clearing a vertex is <i>O(E + V)</i>.</LI>
|
||||
<LI>Vertex removal is <i>O(E + V)</i>.</LI>
|
||||
</UL>
|
||||
|
||||
<H3>Models</H3>
|
||||
|
||||
<UL>
|
||||
<LI><TT>adjacency_list</TT>
|
||||
</LI>
|
||||
</UL>
|
||||
|
||||
|
||||
<H3>Concept Checking Class</H3>
|
||||
|
||||
<PRE>
|
||||
template <class G>
|
||||
struct MutableGraphConcept
|
||||
{
|
||||
typedef typename boost::graph_traits<G>::edge_descriptor edge_descriptor;
|
||||
void constraints() {
|
||||
v = add_vertex(g);
|
||||
clear_vertex(v, g);
|
||||
remove_vertex(v, g);
|
||||
e_b = add_edge(u, v, g);
|
||||
remove_edge(u, v, g);
|
||||
remove_edge(e, g);
|
||||
}
|
||||
G g;
|
||||
edge_descriptor e;
|
||||
std::pair<edge_descriptor, bool> e_b;
|
||||
typename boost::graph_traits<G>::vertex_descriptor u, v;
|
||||
typename boost::graph_traits<G>::out_edge_iterator iter;
|
||||
};
|
||||
|
||||
template <class edge_descriptor>
|
||||
struct dummy_edge_predicate {
|
||||
bool operator()(const edge_descriptor& e) const {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
template <class G>
|
||||
struct MutableIncidenceGraphConcept
|
||||
{
|
||||
void constraints() {
|
||||
function_requires< MutableGraph<G> >();
|
||||
remove_edge(iter, g);
|
||||
remove_out_edge_if(u, p, g);
|
||||
}
|
||||
G g;
|
||||
typedef typename boost::graph_traits<G>::edge_descriptor edge_descriptor;
|
||||
dummy_edge_predicate<edge_descriptor> p;
|
||||
typename boost::graph_traits<G>::vertex_descriptor u;
|
||||
typename boost::graph_traits<G>::out_edge_iterator iter;
|
||||
};
|
||||
|
||||
template <class G>
|
||||
struct MutableBidirectionalGraphConcept
|
||||
{
|
||||
void constraints() {
|
||||
function_requires< MutableIncidenceGraph<G> >();
|
||||
remove_in_edge_if(u, p, g);
|
||||
}
|
||||
G g;
|
||||
typedef typename boost::graph_traits<G>::edge_descriptor edge_descriptor;
|
||||
dummy_edge_predicate<edge_descriptor> p;
|
||||
typename boost::graph_traits<G>::vertex_descriptor u;
|
||||
};
|
||||
|
||||
template <class G>
|
||||
struct MutableEdgeListGraphConcept
|
||||
{
|
||||
void constraints() {
|
||||
function_requires< MutableGraph<G> >();
|
||||
remove_edge_if(p, g);
|
||||
}
|
||||
G g;
|
||||
typedef typename boost::graph_traits<G>::edge_descriptor edge_descriptor;
|
||||
dummy_edge_predicate<edge_descriptor> p;
|
||||
};
|
||||
</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>
|
||||
@@ -1,150 +0,0 @@
|
||||
<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>MutablePropertyGraph</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="sec:MutablePropertyGraph"></A>
|
||||
MutablePropertyGraph
|
||||
</H2>
|
||||
|
||||
A MutablePropertyGraph is a <a
|
||||
href="./MutableGraph.html">MutableGraph</a> with properties attached
|
||||
internally to the vertices and edges. When adding vertices and edges
|
||||
the value of the properties can be given.
|
||||
|
||||
|
||||
<H3>Refinement of</H3>
|
||||
|
||||
<a href="./MutableGraph.html">MutableGraph</a> and
|
||||
<a href="./PropertyGraph.html">PropertyGraph</a>
|
||||
|
||||
<H3>Notation</H3>
|
||||
|
||||
|
||||
<TABLE>
|
||||
|
||||
<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>u,v</tt></TD>
|
||||
<TD>are objects of type <tt>boost::graph_traits<G>::vertex_descriptor</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><TT>ep</TT></TD><TD>is an object of type <TT>G::edge_property_type</TT></TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><TT>vp</TT></TD><TD>is an object of type <TT>G::vertex_property_type</TT></TD>
|
||||
</TR>
|
||||
|
||||
</TABLE>
|
||||
|
||||
<P>
|
||||
|
||||
<H3>Associated Types</H3>
|
||||
|
||||
<table border>
|
||||
|
||||
<tr>
|
||||
<td>Edge Property Type </td>
|
||||
<td><TT>graph_traits<G>::edge_property_type</TT></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Vertex Property Type </td>
|
||||
<td><TT>graph_traits<G>::vertex_property_type</TT> </td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<H3>Valid Expressions</h3>
|
||||
|
||||
<table border>
|
||||
|
||||
<tr>
|
||||
<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 for that edge.<br>
|
||||
Return type: <TT>std::pair<edge_descriptor, bool></TT></TD>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<TD><TT>add_vertex(vp, g)</TT></TD>
|
||||
<TD>
|
||||
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>
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
</TABLE>
|
||||
|
||||
|
||||
<H3>Models</H3>
|
||||
|
||||
<UL>
|
||||
<LI><TT>adjacency_list</TT></LI>
|
||||
</UL>
|
||||
|
||||
<H3>Concept Checking Class</H3>
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
template <class G>
|
||||
struct MutablePropertyGraphConcept
|
||||
{
|
||||
typedef typename boost::graph_traits<G>::edge_descriptor edge_descriptor;
|
||||
void constraints() {
|
||||
function_requires< MutableGraphConcept<G> >();
|
||||
v = add_vertex(vp, g);
|
||||
p = add_edge(u, v, ep, g);
|
||||
}
|
||||
G g;
|
||||
std::pair<edge_descriptor, bool> p;
|
||||
typename boost::graph_traits<G>::vertex_descriptor u, v;
|
||||
typename boost::graph_traits<G>::vertex_property_type vp;
|
||||
typename boost::graph_traits<G>::edge_property_type ep;
|
||||
};
|
||||
</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>
|
||||
@@ -1,178 +0,0 @@
|
||||
<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>
|
||||
@@ -1,148 +0,0 @@
|
||||
<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>
|
||||
@@ -1,210 +0,0 @@
|
||||
<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>PropertyGraph</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:PropertyGraph"></A>
|
||||
PropertyGraph
|
||||
</H2>
|
||||
|
||||
A PropertyGraph is a graph that has some property associated with each
|
||||
of the vertices or edges in the graph. As a given graph may have
|
||||
several properties associated with each vertex or edge, a tag is used
|
||||
to identity which property is being accessed. The graph provides a
|
||||
function which returns a property map object.
|
||||
|
||||
<P>
|
||||
|
||||
<H3>Refinement of</H3>
|
||||
|
||||
<a href="./Graph.html">Graph</a>
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<TR>
|
||||
<TD><tt>G</tt></TD>
|
||||
<TD>A type that is a model of PropertyGraph.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>g</tt></TD>
|
||||
<TD>An object of type <tt>G</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>X</tt></TD>
|
||||
<TD>Either the vertex or edge descriptor type for <tt>G</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>x</tt></TD>
|
||||
<TD>An object of type <tt>X</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
|
||||
<TR>
|
||||
<TD><tt>Map</tt></TD>
|
||||
<TD>The type <tt>boost::property_map<G, Property>::const_type</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>v</tt></TD>
|
||||
<TD>An object of type <tt>boost::property_traits<Map>::value_type</tt>.</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<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>PropertyTag</tt>.</td>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD><tt>pmap</tt></TD>
|
||||
<TD>An object of type <tt>Map</tt>.</td>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<H3>Associated types</H3>
|
||||
|
||||
<table border>
|
||||
|
||||
<tr>
|
||||
<td><pre>boost::property_map<G, PropertyTag>::type</pre>
|
||||
The type of the property map for the property specified by
|
||||
<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, PropertyTag>::const_type</pre>
|
||||
The type of the const property map for the property specified by
|
||||
<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>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
<table border>
|
||||
|
||||
<tr>
|
||||
<td> <TT>get(p, g)</TT> </td>
|
||||
<td>
|
||||
Returns the property map for the property specified by the
|
||||
<tt>PropertyTag</tt> type. The object <tt>p</tt> is only used to
|
||||
carry the type.<br>
|
||||
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>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>
|
||||
<tt>get(get(p, g), x)</tt><br>
|
||||
Return type: <tt>boost::property_traits<Map>::value_type</tt>
|
||||
</td>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<td> <TT>put(p, g, x, v)</TT> </td>
|
||||
<td>
|
||||
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>
|
||||
<tt>
|
||||
pmap = get(p, g);<br>
|
||||
put(pmap, x, v)
|
||||
</tt><br>
|
||||
Return type: <TT>void</TT>
|
||||
</td>
|
||||
</TR>
|
||||
|
||||
|
||||
</TABLE>
|
||||
|
||||
<H3>Complexity</H3>
|
||||
|
||||
The <tt>get()</tt> property map function must be constant time.
|
||||
|
||||
|
||||
<H3>Models</H3>
|
||||
|
||||
|
||||
<UL>
|
||||
<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 PropertyTag>
|
||||
struct PropertyGraphConcept
|
||||
{
|
||||
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(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(PropertyTag(), g);
|
||||
pval = get(PropertyTag(), g, x);
|
||||
ignore_unused_variable_warning(pmap);
|
||||
}
|
||||
G g;
|
||||
X x;
|
||||
typename property_traits<Map>::value_type pval;
|
||||
};
|
||||
</PRE>
|
||||
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
<a href="./property_map.html"><tt>property_map</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>
|
||||
@@ -1,117 +0,0 @@
|
||||
<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>Property</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:PropertyTag"></A>
|
||||
PropertyTag
|
||||
</H2>
|
||||
|
||||
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. 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>
|
||||
|
||||
<table border>
|
||||
|
||||
<tr>
|
||||
<td>Property Kind </td>
|
||||
<td><TT>property_kind<PropertyTag>::type</TT> </td>
|
||||
<td>
|
||||
|
||||
This specifies whether the property is a <a
|
||||
name="VertexPropertyTag"><b>Vertex Property Tag</b></a>
|
||||
(<tt>vertex_property_tag</tt>), an <a
|
||||
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>. 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/tech/stl/DefaultConstructible.html">Default Constructible</a>
|
||||
|
||||
|
||||
<h3>Models</h3>
|
||||
|
||||
The following models of the Property Tag concept are defined
|
||||
in <a
|
||||
href="../../../boost/graph/properties.hpp"><tt>boost/graph/properties.hpp</tt></a>.
|
||||
|
||||
<ul>
|
||||
<li><tt>vertex_index_t</tt></li>
|
||||
<li><tt>edge_index_t</tt></li>
|
||||
<li><tt>graph_name_t</tt></li>
|
||||
<li><tt>vertex_name_t</tt></li>
|
||||
<li><tt>edge_name_t</tt></li>
|
||||
<li><tt>edge_weight_t</tt></li>
|
||||
<li><tt>vertex_distance_t</tt></li>
|
||||
<li><tt>vertex_color_t</tt></li>
|
||||
<li><tt>vertex_degree_t</tt></li>
|
||||
<li><tt>vertex_out_degree_t</tt></li>
|
||||
<li><tt>vertex_in_degree_t</tt></li>
|
||||
<li><tt>vertex_discover_time_t</tt></li>
|
||||
<li><tt>vertex_finish_time_t</tt></li>
|
||||
</ul>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
<a href="./PropertyGraph.html">PropertyGraph</a>
|
||||
and
|
||||
<a href="../../property_map/property_map.html">Property Map Concepts</a>
|
||||
|
||||
<h3>Notes</h3>
|
||||
|
||||
On compilers that do not support partial specialization, each Property
|
||||
type is also required to specialize
|
||||
<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-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>
|
||||
@@ -1,99 +0,0 @@
|
||||
<HTML>
|
||||
<!--
|
||||
Copyright (c) Matyas Egyhazy 2008
|
||||
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: TSP Tour 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>TSP Tour Visitor concept</H1>
|
||||
|
||||
This concept defines the visitor interface for <a
|
||||
href="./metric_tsp_approx.html"><tt>metric_tsp_approx()</tt></a>
|
||||
and related algorithms. The user can create a class that matches this
|
||||
interface, and then pass objects of the class into
|
||||
<tt>metric_tsp_approx()</tt> to augment the actions taken during
|
||||
the search.
|
||||
|
||||
<h3>Refinement of</h3>
|
||||
|
||||
none
|
||||
|
||||
<h3>Notation</h3>
|
||||
|
||||
<Table>
|
||||
<TR>
|
||||
<TD><tt>V</tt></TD>
|
||||
<TD>A type that is a model of Dijkstra 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>v</tt></TD>
|
||||
<TD>An object of type <tt>boost::graph_traits<G>::vertex_descriptor</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>Visit Vertex</td>
|
||||
<td><tt>vis.visit_vertex(v, g)</tt></td>
|
||||
<td><tt>void</tt></td>
|
||||
<td>
|
||||
This is invoked on each vertex of the graph when it is visited as part of the TSP tour.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Models</h3>
|
||||
|
||||
<ul>
|
||||
<li><a href="tsp_tour_visitor.html"><tt>tsp_tour_visitor</tt></a>
|
||||
<li><a href="tsp_tour_len_visitor.html"><tt>tsp_tour_len_tsp_visitor</tt></a>
|
||||
</ul>
|
||||
|
||||
<br>
|
||||
<HR>
|
||||
<TABLE>
|
||||
<TR valign=top>
|
||||
<TD nowrap>Copyright © 2008</TD><TD>
|
||||
Matyas Egyhazy</TD></TR></TABLE>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
||||
@@ -1,70 +0,0 @@
|
||||
<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>VertexAndEdgeListGraph</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:VertexAndEdgeListGraph"></A>
|
||||
VertexAndEdgeListGraph
|
||||
</H2>
|
||||
|
||||
The VertexAndEdgeListGraph concept refines the <a
|
||||
href="./VertexListGraph.html">VertexListGraph</a> and the <a
|
||||
href="./EdgeListGraph.html">EdgeListGraph</a> concepts. No further
|
||||
requirements are added.
|
||||
|
||||
<H3>Refinement of</H3>
|
||||
|
||||
<a href="./VertexListGraph.html">VertexListGraph</a>,
|
||||
<a href="./EdgeListGraph.html">EdgeListGraph</a>
|
||||
|
||||
|
||||
<H3>Models</H3>
|
||||
|
||||
<UL>
|
||||
<LI><TT>adjacency_list</TT></LI>
|
||||
</UL>
|
||||
|
||||
<P>
|
||||
|
||||
<H3>See Also</H3>
|
||||
|
||||
<a href="./graph_concepts.html">Graph concepts</a>
|
||||
|
||||
<H3>Concept Checking Class</H3>
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
template <class G>
|
||||
struct VertexAndEdgeListGraphConcept
|
||||
{
|
||||
void constraints() {
|
||||
function_requires< VertexListGraphConcept<G> >();
|
||||
function_requires< EdgeListGraphConcept<G> >();
|
||||
}
|
||||
};
|
||||
</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>
|
||||
@@ -1,154 +0,0 @@
|
||||
<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>VertexListGraph</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:VertexListGraph">
|
||||
VertexListGraph
|
||||
</H2>
|
||||
|
||||
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="./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
|
||||
to all of the vertices in a graph. A vertex iterator type must meet
|
||||
the requirements of <a
|
||||
href="../../utility/MultiPassInputIterator.html">MultiPassInputIterator</a>. The
|
||||
value type of the vertex iterator must be the vertex descriptor of the
|
||||
graph.
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<td><tt>boost::graph_traits<G>::vertices_size_type</tt><br><br>
|
||||
The unsigned integer type used to represent the number of vertices
|
||||
in the graph.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Valid Expressions</h3>
|
||||
|
||||
<table border>
|
||||
|
||||
<tr>
|
||||
<th>Name</th><th>Expression</th><th>Return Type</th><th>Description</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>Vertex Set of the Graph</td>
|
||||
<td><a name="sec:vertices"><TT>vertices(g)</TT></a></TD>
|
||||
<TD><TT>std::pair<vertex_iterator, vertex_iterator></TT></TD>
|
||||
<TD>
|
||||
Returns an iterator-range providing access to all the vertices in the
|
||||
graph<TT>g</TT>.
|
||||
</TD>
|
||||
</TR>
|
||||
|
||||
<tr>
|
||||
<td>Number of Vertices in the Graph </td>
|
||||
<td><TT>num_vertices(g)</TT></TD>
|
||||
<TD><TT>vertices_size_type</TT></TD>
|
||||
<TD>Returns the number of vertices in the graph <TT>g</TT>.</TD>
|
||||
</TR>
|
||||
|
||||
</TABLE>
|
||||
|
||||
|
||||
<H3>Complexity guarantees</H3>
|
||||
|
||||
<P>
|
||||
The <TT>vertices()</TT> function must return in constant time.
|
||||
|
||||
<H3>See Also</H3>
|
||||
|
||||
<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>
|
||||
<PRE>
|
||||
template <class G>
|
||||
struct VertexListGraphConcept
|
||||
{
|
||||
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> >();
|
||||
|
||||
p = vertices(g);
|
||||
V = num_vertices(g);
|
||||
v = *p.first;
|
||||
const_constraints(g);
|
||||
}
|
||||
void const_constraints(const G& g) {
|
||||
p = vertices(g);
|
||||
V = num_vertices(g);
|
||||
v = *p.first;
|
||||
}
|
||||
std::pair<vertex_iterator, vertex_iterator> p;
|
||||
typename boost::graph_traits<G>::vertex_descriptor v;
|
||||
typename boost::graph_traits<G>::vertices_size_type V;
|
||||
G g;
|
||||
};
|
||||
</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>
|
||||
@@ -1,83 +0,0 @@
|
||||
<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>
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
<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: Acknowledgements</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>Acknowledgements</h1>
|
||||
|
||||
We owe many debts of thanks to a number of individuals who both
|
||||
inspired and encouraged us in developing the Boost Graph Library.
|
||||
|
||||
<p>
|
||||
A most profound thanks goes to Alexander Stepanov for his pioneering
|
||||
work in generic programming, for his encouragement, and for his
|
||||
algorithm contributions to the BGL. We thank Matthew Austern for his
|
||||
work on documenting the concepts of STL which provided a foundation
|
||||
for creating the concepts in the BGL. We thank Dietmar Kühl for
|
||||
his work on generic graph algorithms and design patterns; especially
|
||||
for the property map abstraction.
|
||||
|
||||
<p>
|
||||
Dave Abrahams, Jens Maurer, Beman Dawes, Gary Powell, Greg Colvin,
|
||||
Valentin Bonnard, and the rest of the group at Boost provided valuable
|
||||
input to the BGL interface, numerous suggestions for improvement,
|
||||
proof reads of the documentation, and help with polishing the code. A
|
||||
special thanks to Dave Abrahams for managing the formal review.
|
||||
|
||||
<p>
|
||||
We also thank the following BGL users whose questions helped to
|
||||
improve the BGL: Gordon Woodhull, Dave Longhorn, Joel Phillips, and
|
||||
Edward Luke.
|
||||
|
||||
<p>
|
||||
A special thanks to Jeffrey Squyres for editing and proof reading
|
||||
of the documentation.
|
||||
|
||||
<p>
|
||||
Our original work on the Boost Graph Library was supported in part by
|
||||
NSF grant ACI-9982205 and by the Director, Office of Science, Division
|
||||
of Mathematical, Information, and Computational Sciences of the U.S.
|
||||
Department of Energy under contract number DE-AC03-76SF00098.
|
||||
<p>
|
||||
In our work we also used resources of the National Energy Research
|
||||
Scientific Computing Center, which is supported by the Office of
|
||||
Science of the U.S. Department of Energy.
|
||||
|
||||
|
||||
|
||||
<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>
|
||||
@@ -1,136 +0,0 @@
|
||||
<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>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,158 +0,0 @@
|
||||
<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: Graph Traits</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=""></A>
|
||||
<pre>
|
||||
adjacency_list_traits<EdgeList, VertexList, Directed>
|
||||
</pre>
|
||||
</H1>
|
||||
|
||||
This class provides an alternate method for accessing some of the
|
||||
associated types of the <tt>adjacency_list</tt> class. The main reason
|
||||
for this class is that sometimes one would like to create graph
|
||||
properties whose values are vertex or edge descriptors. If you try to
|
||||
use <tt>graph_traits</tt> for this you will run into a problem with
|
||||
mutually recursive types. To get around this problem, the
|
||||
<tt>adjacency_list_traits</tt> class is provided, which gives the user
|
||||
access to the vertex and edge descriptor types without requiring the
|
||||
user to provide the property types for the graph.
|
||||
|
||||
<pre>
|
||||
template <class EdgeList, class VertexList, class Directed>
|
||||
struct adjacency_list_traits {
|
||||
typedef ... vertex_descriptor;
|
||||
typedef ... edge_descriptor;
|
||||
typedef ... directed_category;
|
||||
typedef ... edge_parallel_category;
|
||||
};
|
||||
</pre>
|
||||
|
||||
<h3>Where Defined</h3>
|
||||
|
||||
<a href="../../../boost/graph/adjacency_list.hpp"><tt>boost/graph/adjacency_list.hpp</tt></a>
|
||||
|
||||
<H3>Template Parameters</H3>
|
||||
|
||||
<P>
|
||||
<TABLE border>
|
||||
<TR>
|
||||
<th>Parameter</th><th>Description</th><th>Default</th>
|
||||
</tr>
|
||||
|
||||
<TR><TD><TT>EdgeList</TT></TD>
|
||||
<TD>
|
||||
The selector type for the edge container implementation.
|
||||
</TD>
|
||||
<td><tt>vecS</tt></td>
|
||||
</TR>
|
||||
|
||||
<TR><TD><TT>VertexList</TT></TD>
|
||||
<TD>
|
||||
The selector type for the vertex container implementation.
|
||||
</TD>
|
||||
<td><tt>vecS</tt></td>
|
||||
</TR>
|
||||
|
||||
<TR><TD><TT>Directed</TT></TD>
|
||||
<TD>
|
||||
The selector type whether the graph is directed or undirected.
|
||||
</TD>
|
||||
<td><tt>directedS</tt></td>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>Model of</h3>
|
||||
|
||||
<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>
|
||||
|
||||
Under construction.
|
||||
|
||||
<H2>Members</H2>
|
||||
|
||||
<p>
|
||||
|
||||
<table border>
|
||||
<tr>
|
||||
<th>Member</th><th>Description</th>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><tt>
|
||||
vertex_descriptor
|
||||
</tt></td>
|
||||
<td>
|
||||
The type for the objects used to identify vertices in the graph.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><tt>
|
||||
edge_descriptor
|
||||
</tt></td>
|
||||
<td>
|
||||
The type for the objects used to identify edges in the graph.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><tt>
|
||||
directed_category
|
||||
</tt></td>
|
||||
<td>
|
||||
This says whether the graph is undirected (<tt>undirected_tag</tt>)
|
||||
or directed (<tt>directed_tag</tt>).
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><tt>
|
||||
edge_parallel_category
|
||||
</tt></td>
|
||||
<td>
|
||||
This says whether the graph allows parallel edges to be inserted
|
||||
(<tt>allow_parallel_edge_tag</tt>) or if it automatically removes
|
||||
parallel edges (<tt>disallow_parallel_edge_tag</tt>).
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
|
||||
<h3>See Also</h3>
|
||||
|
||||
<a href="./adjacency_list.html"><tt>adjacency_list</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>
|
||||
@@ -1,584 +0,0 @@
|
||||
<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,10 @@
|
||||
name: graph
|
||||
version: ~
|
||||
title: Boost.Graph
|
||||
start_page: index.adoc
|
||||
asciidoc:
|
||||
attributes:
|
||||
source-language: cpp@
|
||||
table-caption: false
|
||||
nav:
|
||||
- modules/ROOT/nav.adoc
|
||||
@@ -1,96 +0,0 @@
|
||||
<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>
|
||||
@@ -1,477 +0,0 @@
|
||||
<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>
|
||||
@@ -1,108 +0,0 @@
|
||||
<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>
|
||||
@@ -1,6 +0,0 @@
|
||||
\DeclareOption{awpaper}
|
||||
{\setlength\paperheight {9.25in}%
|
||||
\setlength\paperwidth {7.375in}}
|
||||
\DeclareOption*{\PassOptonsToPackage{\CurrentOption}{newsiambook}}
|
||||
\ProcessOptions
|
||||
\ExecuteOptions{awpaper}
|
||||
@@ -1,93 +0,0 @@
|
||||
<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>
|
||||
@@ -1,151 +0,0 @@
|
||||
<!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>
|
||||
@@ -1,349 +0,0 @@
|
||||
<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>Bellman Ford 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:bellman-ford"></A><img src="figs/python.gif" alt="(Python)"/>
|
||||
<TT>bellman_ford_shortest_paths</TT>
|
||||
</H1>
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
<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>);
|
||||
|
||||
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>
|
||||
The Bellman-Ford algorithm [<A
|
||||
HREF="bibliography.html#bellman58">4</A>,<A
|
||||
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. For the definition of the shortest paths problem see
|
||||
Section <A
|
||||
HREF="./graph_theory_review.html#sec:shortest-paths-algorithms">Shortest-Paths
|
||||
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>Parameters</h3>
|
||||
|
||||
|
||||
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>
|
||||
|
||||
<H3>Complexity</H3>
|
||||
|
||||
<P>
|
||||
The time complexity is <i>O(V E)</i>.
|
||||
|
||||
|
||||
<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>
|
||||
An example of using the Bellman-Ford algorithm is in <a
|
||||
href="../example/bellman-example.cpp"><TT>examples/bellman-example.cpp</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="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>
|
||||
@@ -1,111 +0,0 @@
|
||||
<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: bellman_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>
|
||||
bellman_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="./BellmanFordVisitor.html">BellmanFordVisitor</a>.
|
||||
|
||||
|
||||
<h3>Example</h3>
|
||||
|
||||
|
||||
<h3>Model of</h3>
|
||||
|
||||
<a href="./BellmanFordVisitor.html">BellmanFordVisitor</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/bellman_ford_shortest_paths.hpp">
|
||||
<TT>boost/graph/bellman_ford_shortest_paths.hpp</TT></a>
|
||||
|
||||
<h3>Member Functions</h3>
|
||||
|
||||
This class implements all of the member functions required by <a
|
||||
href="./BellmanFordVisitor.html">BellmanFordVisitor</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>
|
||||
bellman_visitor<EventVisitorList><br>
|
||||
make_bellman_visitor(EventVisitorList ev_list);
|
||||
</tt></td><td>
|
||||
Returns the event visitor list adapted to be a BellmanFordVisitor.
|
||||
</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>
|
||||
@@ -1,307 +0,0 @@
|
||||
<!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>
|
||||
@@ -1,128 +0,0 @@
|
||||
<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: bfs_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>
|
||||
bfs_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="./BFSVisitor.html">BFSVisitor</a>.
|
||||
|
||||
|
||||
<h3>Example</h3>
|
||||
|
||||
This is an excerpt from <a
|
||||
href="../example/bfs.cpp"><tt>examples/bfs.cpp</tt></a> where three
|
||||
event-visitors are combined to make a BFS visitor. The functions
|
||||
<tt>boost::record_distances</tt>, <tt>boost::record_predecessors</tt>,
|
||||
and <tt>copy_graph</tt> are all functions that create an event
|
||||
visitor.
|
||||
|
||||
<pre>
|
||||
// Construct graph G and obtain the source vertex s ...
|
||||
|
||||
boost::breadth_first_search(G, s,
|
||||
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()),
|
||||
copy_graph(G_copy, boost::on_examine_edge())))) );
|
||||
</pre>
|
||||
|
||||
|
||||
<h3>Model of</h3>
|
||||
|
||||
<a href="./BFSVisitor.html">BFSVisitor</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><a href="./null_visitor.html"><tt>null_visitor</tt></a></TD>
|
||||
</TR>
|
||||
|
||||
</table>
|
||||
|
||||
<H3>Where Defined</H3>
|
||||
|
||||
<P>
|
||||
<a href="../../../boost/graph/breadth_first_search.hpp">
|
||||
<TT>boost/graph/breadth_first_search.hpp</TT></a>
|
||||
|
||||
<h3>Member Functions</h3>
|
||||
|
||||
This class implements all of the member functions required by <a
|
||||
href="./BFSVisitor.html">BFSVisitor</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>
|
||||
bfs_visitor<EventVisitorList><br>
|
||||
make_bfs_visitor(EventVisitorList ev_list);
|
||||
</tt></td><td>
|
||||
Returns the event visitor list adapted to be a BFS 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>
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 8.2 KiB |
@@ -1,96 +0,0 @@
|
||||
<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>
|
||||
@@ -1,446 +0,0 @@
|
||||
<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: Bibliography</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>Bibliography</H2>
|
||||
|
||||
<DL COMMapCT><DD><P></P><DT><A NAME="aho83:_data_struct_algo">1</A>
|
||||
<DD>
|
||||
A. V. Aho, J. E. Hopcroft, and J. D. Ullman.
|
||||
<BR><EM>Data Structures and Algorithms</EM>.
|
||||
<BR>Addison-Wesley, 1983.
|
||||
|
||||
<P></P><DT><A NAME="austern99:_gener_progr_stl">2</A>
|
||||
<DD>
|
||||
M. H. Austern.
|
||||
<BR><EM>Generic Programming and the STL</EM>.
|
||||
<BR>Professional computing series. Addison-Wesley, 1999.
|
||||
|
||||
<P></P><DT><A NAME="baumgartner95:_signatures">3</A>
|
||||
<DD>
|
||||
G. Baumgartner and V. F. Russo.
|
||||
<BR>Signatures: A language extension for improving type abstraction and
|
||||
subtype polymorphism in C++.
|
||||
<BR><EM>Software-Practice and Experience</EM>, 25(8):863-889, August 1995.
|
||||
|
||||
<P></P><DT><A NAME="bellman58">4</A>
|
||||
<DD>
|
||||
R. Bellman.
|
||||
<BR>On a routing problem.
|
||||
<BR><EM>Quarterly of Applied Mathematics</EM>, 16(1):87-90, 1958.
|
||||
|
||||
<P></P><DT><A NAME="bruce95">5</A>
|
||||
<DD>
|
||||
K. B. Bruce, L. Cardelli, G. Castagna, the Hopkins Objects Group, G. T.
|
||||
Leavens, and B. Pierce.
|
||||
<BR>On binary methods.
|
||||
<BR><EM>Theory and Practice of Object Systems</EM>, 1:221-242, 1995.
|
||||
|
||||
<P></P><DT><A NAME="coleman85:_algor">6</A>
|
||||
<DD>
|
||||
T. F. Coleman, B. S. Garbow, and J. J. Mor'e.
|
||||
<BR>Algorithm 649: Fortran subroutines for estimating sparse hessian
|
||||
matrices.
|
||||
<BR><EM>ACM Transactions on Mathematical Software</EM>, 11(4):378, December
|
||||
1985.
|
||||
|
||||
<P></P><DT><A NAME="coleman84:_estim_jacob">7</A>
|
||||
<DD>
|
||||
T. F. Coleman and J. J. Mor'e.
|
||||
<BR>Estimation of sparse jacobian matrices and graph coloring problems.
|
||||
<BR><EM>SIAM Journal on Numerical Analysis</EM>, 20:187-209,, 1984.
|
||||
|
||||
<P></P><DT><A NAME="clr90">8</A>
|
||||
<DD>
|
||||
T. Cormen, C. Leiserson, and R. Rivest.
|
||||
<BR><EM>Introduction to Algorithms</EM>.
|
||||
<BR>McGraw-Hill, 1990.
|
||||
|
||||
<P></P><DT><A NAME="curtis74:_jacob">9</A>
|
||||
<DD>
|
||||
A. Curtis, M. Powell, and J. Reid.
|
||||
<BR>On the estimation of sparse jacobian matrices.
|
||||
<BR><EM>Journal of the Institute of Mathematics and its Applications</EM>,
|
||||
13:117-119, 1974.
|
||||
|
||||
<P></P><DT><A NAME="dijkstra59">10</A>
|
||||
<DD>
|
||||
E. Dijkstra.
|
||||
<BR>A note on two problems in connexion with graphs.
|
||||
<BR><EM>Numerische Mathematik</EM>, 1:269-271, 1959.
|
||||
|
||||
<P></P><DT><A NAME="ford62:_flows">11</A>
|
||||
<DD>
|
||||
L. R. Ford and D. R. Fulkerson.
|
||||
<BR><EM>Flows in networks</EM>.
|
||||
<BR>Princeton University Press, 1962.
|
||||
|
||||
<P></P><DT><A NAME="gamma95:_design_patterns">12</A>
|
||||
<DD>
|
||||
E. Gamma, R. Helm, R. Johnson, and J. Vlissides.
|
||||
<BR><EM>Design Patterns: Elements of Reusable Object-Oriented Software</EM>.
|
||||
<BR>Professional Computing. Addison-Welsey, 1995.
|
||||
|
||||
<P></P><DT><A NAME="george93:graphtheory">13</A>
|
||||
<DD>
|
||||
A. George, J. R. Gilbert, and J. W. Liu, editors.
|
||||
<BR><EM>Graph Theory and Sparse Matrix Computation</EM>.
|
||||
<BR>Springer-Verlag New York, Inc, 1993.
|
||||
|
||||
<P></P><DT><A NAME="george81:__sparse_pos_def">14</A>
|
||||
<DD>
|
||||
A. George and J. W.-H. Liu.
|
||||
<BR><EM>Computer Solution of Large Sparse Positive Definite Systems</EM>.
|
||||
<BR>Computational Mathematics. Prentice-Hall, 1981.
|
||||
|
||||
<P></P><DT><A NAME="graham85">15</A>
|
||||
<DD>
|
||||
R. Graham and P. Hell.
|
||||
<BR>On the history of the minimum spanning tree problem.
|
||||
<BR><EM>Annals of the History of Computing</EM>, 7(1):43-57, 1985.
|
||||
|
||||
<P></P><DT><A NAME="hart68">16</A>
|
||||
<DD>
|
||||
P. E. Hart, N. J. Nilsson, and B. Raphael.
|
||||
<BR>A formal basis for the heuristic determination of minimum cost paths.
|
||||
<BR><EM>IEEE Transactions on Systems Science and Cybernetics</EM>,
|
||||
4(2):100-107, 1968.
|
||||
|
||||
<P></P><DT><A NAME="kruskal56">18</A>
|
||||
<DD>
|
||||
J. B. Kruskal.
|
||||
<BR>On the shortest spanning subtree of a graph and the traveling
|
||||
salesman problem.
|
||||
<BR>In <EM>Proceedings of the American Mathematical Sofiety</EM>, volume 7,
|
||||
pages 48-50, 1956.
|
||||
|
||||
<P></P><DT><A NAME="kuehl96:_design_patterns_for_graph_algo">19</A>
|
||||
<DD>
|
||||
D. Kühl.
|
||||
<BR>Design patterns for the implementation of graph algorithms.
|
||||
<BR>Master's thesis, Technische Universität Berlin, July 1996.
|
||||
|
||||
<P></P><DT><A NAME="lawler76:_comb_opt">20</A>
|
||||
<DD>
|
||||
E. L. Lawler.
|
||||
<BR><EM>Combinatorial Opimization: Networks and Matroids</EM>.
|
||||
<BR>Holt, Rinehart, and Winston, 1976.
|
||||
|
||||
<P></P><DT><A NAME="LIU:MMD">21</A>
|
||||
<DD>
|
||||
J. W. H. Liu.
|
||||
<BR>Modification of the minimum-degree algorithm by multiple elimination.
|
||||
<BR><EM>ACM Transaction on Mathematical Software</EM>, 11(2):141-153, 1985.
|
||||
|
||||
<P></P><DT><A NAME="mehlhorn99:_leda">22</A>
|
||||
<DD>
|
||||
K. Mehlhorn and S. Näher.
|
||||
<BR><EM>The LEDA Platform of Combinatorial and Geometric Computing</EM>.
|
||||
<BR>Cambridge University Press, 1999.
|
||||
|
||||
<P></P><DT><A NAME="meyer88:_object_soft_const">23</A>
|
||||
<DD>
|
||||
B. Meyer.
|
||||
<BR><EM>Object-oriented Software Construction</EM>.
|
||||
<BR>Prentice Hall International Series in Computer Science. Prentice
|
||||
Hall, 1988.
|
||||
|
||||
<P></P><DT><A NAME="myers95:_trait">24</A>
|
||||
<DD>
|
||||
N. C. Myers.
|
||||
<BR>Traits: a new and useful template technique.
|
||||
<BR><EM>C++ Report</EM>, June 1995.
|
||||
|
||||
<P></P><DT><A NAME="prim57:_short">25</A>
|
||||
<DD>
|
||||
R. Prim.
|
||||
<BR>Shortest connection networks and some generalizations.
|
||||
<BR><EM>Bell System Technical Journal</EM>, 36:1389-1401, 1957.
|
||||
|
||||
<P></P><DT><A NAME="saad96:imsms">26</A>
|
||||
<DD>
|
||||
Y. Saad.
|
||||
<BR><EM>Iterative Methods for Sparse Minear System</EM>.
|
||||
<BR>PWS Publishing Company, 1996.
|
||||
|
||||
<P></P><DT><A NAME="tarjan83:_data_struct_network_algo">27</A>
|
||||
<DD>
|
||||
R. E. Tarjan.
|
||||
<BR><EM>Data Structures and Network Algorithms</EM>.
|
||||
<BR>Society for Industrial and Applied Mathematics, 1983.
|
||||
|
||||
<P></P><DT><A NAME="parter61:_gauss">28</A>
|
||||
<DD>
|
||||
Seymour Parter.
|
||||
<BR><EM>The use of linear graphs in Gauss elimination</EM>.
|
||||
<BR>SIAM Review, 1961 3:119-130.
|
||||
|
||||
<P></P><DT><A NAME="matula72:_graph_theory_computing">29</A>
|
||||
<DD>
|
||||
D. Matula, G. Marble, and J. Isaacson
|
||||
<BR><EM>Graph coloring algorithms in Graph Theory and
|
||||
Computing</EM>.<BR>
|
||||
Academic Press, pp.104-122, 1972.
|
||||
|
||||
<P></P><DT><A NAME="garey79:computers-and-intractability">30</a>
|
||||
<DD>
|
||||
M.R. Garey and D.S. Johnson<BR>
|
||||
<EM>Computers and Intractibility: A Guide to the Theory of
|
||||
NP-Completeness</EM><BR>
|
||||
W.H. Freeman, New York, 1979.
|
||||
|
||||
<P></P><DT><A NAME="welsch67">31</a>
|
||||
<DD>D. Welsch and M. B. Powel<BR>
|
||||
<EM>An upper bound for the chromatic number of a graph and its
|
||||
application to timetabling problems</EM>
|
||||
Computer Journal, 10:85-86, 1967.
|
||||
|
||||
<P></P><DT><A NAME="brelaz79:_new">32</a>
|
||||
<DD>D. Br'elaz<BR>
|
||||
<EM>New methods to color the vertices of a graph</EM><br>
|
||||
Communications of the ACM, vol. 22, 1979, pp. 251-256.
|
||||
|
||||
<P></P><DT><A NAME="heber99:_saw">33</a>
|
||||
<DD>G. Heber, R. Biswas, G.R. Gao<BR>
|
||||
<EM>Self-Avoiding Walks over Adaptive Unstructured Grids</EM><br>
|
||||
Parallel and Distributed Processing, LNCS 1586,
|
||||
Springer-Verlag, 1999, pp. 968-977
|
||||
|
||||
|
||||
<P></P><DT><A NAME="ng-raghavan">34</a>
|
||||
<DD>Esmond G. Ng amd Padma Raghavan<BR>
|
||||
<EM>Performance of greedy ordering heuristics for sparse {C}holesky factorization</EM><br>
|
||||
SIAM Journal on Matrix Analysis and Applications (To appear)
|
||||
|
||||
<P></P><DT><A NAME="George:evolution">35</a>
|
||||
<DD>Alan George and Joseph W. H. Liu<BR>
|
||||
<EM>The Evolution of the Minimum Degree Ordering Algorithm</EM><br>
|
||||
SIAM Review, March 1989, vol. 31, num. 1, pp. 1-19.
|
||||
|
||||
<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-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>
|
||||
@@ -1,254 +0,0 @@
|
||||
<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>
|
||||
@@ -1,386 +0,0 @@
|
||||
\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
|
||||
@@ -1,259 +0,0 @@
|
||||
<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,338 +0,0 @@
|
||||
<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 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:bfs">
|
||||
<img src="figs/python.gif" alt="(Python)"/>
|
||||
<TT>breadth_first_search</TT>
|
||||
</H1>
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
<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);
|
||||
|
||||
<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 <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>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
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>
|
||||
|
||||
<P>
|
||||
<a href="../../../boost/graph/breadth_first_search.hpp"><TT>boost/graph/breadth_first_search.hpp</TT></a>
|
||||
|
||||
<P>
|
||||
|
||||
<h3>Parameters</h3>
|
||||
|
||||
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>
|
||||
|
||||
<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>
|
||||
|
||||
|
||||
<H3><A NAME="SECTION001330300000000000000">
|
||||
Complexity</A>
|
||||
</H3>
|
||||
|
||||
<P>
|
||||
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>
|
||||
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-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>
|
||||
@@ -1,186 +0,0 @@
|
||||
<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>
|
||||
Executable
+30
@@ -0,0 +1,30 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# 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)
|
||||
#
|
||||
# Official repository: https://github.com/boostorg/graph
|
||||
#
|
||||
# Picked up by boostorg/release-tools' build_docs/{linuxdocs.sh,macosdocs.sh,
|
||||
# windowsdocs.ps1} via auto-detection: presence of this file selects the
|
||||
# Antora build pipeline. Output lands in doc/build/site/.
|
||||
|
||||
set -xe
|
||||
|
||||
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
||||
cd "$SCRIPT_DIR"
|
||||
|
||||
if [ $# -eq 0 ]; then
|
||||
PLAYBOOK="playbook.yml"
|
||||
else
|
||||
PLAYBOOK="$1"
|
||||
fi
|
||||
|
||||
echo "Installing npm dependencies..."
|
||||
npm ci
|
||||
|
||||
echo "Building docs with Antora using $PLAYBOOK..."
|
||||
PATH="$(pwd)/node_modules/.bin:${PATH}"
|
||||
export PATH
|
||||
npx antora --clean --fetch "$PLAYBOOK"
|
||||
echo "Done"
|
||||
Executable
+89
@@ -0,0 +1,89 @@
|
||||
#!/usr/bin/env bash
|
||||
# Compiles every .cpp under modules/ROOT/examples/ with -std=c++14, runs it,
|
||||
# and writes stdout to a sibling .txt file that Antora pages can include.
|
||||
#
|
||||
# Usage:
|
||||
# BOOST_INCLUDE=/path/to/boost/include \
|
||||
# BOOST_LIB=/path/to/boost/lib \
|
||||
# ./build_example_outputs.sh
|
||||
#
|
||||
# Defaults below match the Conan-installed Boost 1.79 layout used for
|
||||
# local development. CI overrides them.
|
||||
|
||||
set -u
|
||||
|
||||
HERE=$(cd "$(dirname "$0")" && pwd)
|
||||
REPO_ROOT=$(cd "$HERE/.." && pwd)
|
||||
EXAMPLES_ROOT="$HERE/modules/ROOT/examples"
|
||||
|
||||
: "${BOOST_INCLUDE:=$HOME/.conan/data/boost/1.79.0/_/_/package/2c7a64ca03ffe00ac4600bf373ea3ecf338b36d9/include}"
|
||||
: "${BOOST_LIB:=}"
|
||||
: "${CXX:=g++}"
|
||||
: "${CXXFLAGS:=-std=c++14 -O1 -w}"
|
||||
|
||||
if [ ! -d "$BOOST_INCLUDE" ]; then
|
||||
echo "BOOST_INCLUDE not found: $BOOST_INCLUDE" >&2
|
||||
echo "Set BOOST_INCLUDE to the Boost include directory and re-run." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Per-example link flags. A handful of examples need the prebuilt
|
||||
# boost_graph library (graphviz, graphml readers and the isomorphism
|
||||
# example pull in non-header-only code).
|
||||
extra_libs_for() {
|
||||
case "$1" in
|
||||
io/graphml.cpp|io/graphviz.cpp|algorithms/isomorphism/isomorphism.cpp)
|
||||
echo "-lboost_graph"
|
||||
;;
|
||||
*)
|
||||
echo ""
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
LDFLAGS=""
|
||||
if [ -n "$BOOST_LIB" ]; then
|
||||
LDFLAGS="-L$BOOST_LIB -Wl,-rpath,$BOOST_LIB"
|
||||
fi
|
||||
|
||||
WORK=$(mktemp -d)
|
||||
trap 'rm -rf "$WORK"' EXIT
|
||||
|
||||
ok=0
|
||||
fail=0
|
||||
fail_list=""
|
||||
|
||||
while IFS= read -r src; do
|
||||
rel=${src#"$EXAMPLES_ROOT/"}
|
||||
out_txt=${src%.cpp}.txt
|
||||
bin="$WORK/$(basename "$src" .cpp).out"
|
||||
extra=$(extra_libs_for "$rel")
|
||||
|
||||
if ! "$CXX" $CXXFLAGS \
|
||||
-I"$REPO_ROOT/include" -I"$BOOST_INCLUDE" \
|
||||
"$src" -o "$bin" $LDFLAGS $extra 2>/dev/null; then
|
||||
printf ' [compile FAIL] %s\n' "$rel"
|
||||
fail=$((fail + 1))
|
||||
fail_list+="$rel (compile)\n"
|
||||
continue
|
||||
fi
|
||||
|
||||
if ! "$bin" > "$out_txt.tmp" 2>&1; then
|
||||
printf ' [run FAIL] %s\n' "$rel"
|
||||
rm -f "$out_txt.tmp"
|
||||
fail=$((fail + 1))
|
||||
fail_list+="$rel (run)\n"
|
||||
continue
|
||||
fi
|
||||
|
||||
mv "$out_txt.tmp" "$out_txt"
|
||||
printf ' [OK] %s\n' "$rel"
|
||||
ok=$((ok + 1))
|
||||
done < <(find "$EXAMPLES_ROOT" -name '*.cpp' | sort)
|
||||
|
||||
echo
|
||||
echo "Generated $ok .txt outputs, $fail failures."
|
||||
if [ "$fail" -gt 0 ]; then
|
||||
printf "Failing examples:\n$fail_list"
|
||||
exit 1
|
||||
fi
|
||||
@@ -1,178 +0,0 @@
|
||||
<!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>
|
||||
@@ -1,120 +0,0 @@
|
||||
<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>Challenge</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>Boost Graph Library Challenge and To-Do Items</h2>
|
||||
|
||||
|
||||
<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>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>disjoint_sets</tt> </li>
|
||||
</ul>
|
||||
|
||||
<li>Construct a set of planar graph algorithms.</li>
|
||||
<ul>
|
||||
<li> Is the graph planar?</li>
|
||||
<li> "Walk around the block" and similar open and closed neighborhood
|
||||
traversals. Note that edge traversals need to resolve to particular ends
|
||||
and sides (see below), not just to the edge as a whole.</li>
|
||||
<li> Given a point, find the nearest vertex, edge, or bounded polygon.
|
||||
Again, edges are viewed as having left and right sides.</li>
|
||||
<li> Given a line segment, find intersecting vertices, edges, or bounded
|
||||
polygons.</li>
|
||||
<li> Given a polygon, find intersecting whatever...</li>
|
||||
<li> Various minimum bounding rectangle and clipping problems.</li>
|
||||
<li> Construct a planar embedding of a planar graph.</li>
|
||||
<li> Find a balanced separator of a graph.</li>
|
||||
<li> Modify adjacency_list so that the out-edges can be ordered
|
||||
according to a user defined comparison object.</li>
|
||||
</ul>
|
||||
|
||||
<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>
|
||||
|
||||
|
||||
<li>Explore the use of Algorithm Objects as an alternative to
|
||||
the current approach with visitors.</li>
|
||||
|
||||
<li>Analyze the algorithms that do not yet have visitors, and
|
||||
come up with visitor interfaces for them.</li>
|
||||
|
||||
<li>Add a check in the adjacency_list class to make sure
|
||||
all the vertex property template arguments have kind=vertex_property_tag
|
||||
and all edge property template arguments have kind=edge_property_tag.</li>
|
||||
|
||||
<li>Clean up the output functions in graph_utility.hpp to
|
||||
use streams, and document all the utility functions. Replace
|
||||
the random number stuff with calls to the boost random number generator.</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. 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.</li>
|
||||
|
||||
<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-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>
|
||||
@@ -1,51 +0,0 @@
|
||||
<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>
|
||||
Binary file not shown.
@@ -1,720 +0,0 @@
|
||||
<!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,157 +0,0 @@
|
||||
<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: Connected Components</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:connected-components">
|
||||
<img src="figs/python.gif" alt="(Python)"/>
|
||||
<TT>connected_components</TT></A>
|
||||
</H1>
|
||||
|
||||
<PRE>
|
||||
<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>);
|
||||
|
||||
<i>// there is not a non-named parameter version of this function</i>
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
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>
|
||||
|
||||
|
||||
<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 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>
|
||||
|
||||
<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>
|
||||
|
||||
<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>
|
||||
|
||||
|
||||
<H3>Complexity</H3>
|
||||
|
||||
<P>
|
||||
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>
|
||||
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-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>
|
||||
@@ -1,183 +0,0 @@
|
||||
<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: Constructing Graph Algorithms</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>Constructing graph algorithms with BGL</H1>
|
||||
|
||||
<P>
|
||||
The <I>main</I> goal of BGL is not to provide a nice graph class, or
|
||||
to provide a comprehensive set of reusable graph algorithms (though
|
||||
these are goals). The main goal of BGL is to encourage others to
|
||||
write reusable graph algorithms. By reusable we mean maximally
|
||||
reusable. Generic programming is a methodology for making algorithms
|
||||
maximally reusable, and in this section we will discuss how to apply
|
||||
generic programming to constructing graph algorithms.
|
||||
|
||||
<P>
|
||||
To illustrate the generic programming process we will step though the
|
||||
construction of a graph coloring algorithm. The graph coloring problem
|
||||
(or more specifically, the vertex coloring problem) is to label each
|
||||
vertex in a graph <i>G</i> with a color such that no two adjacent
|
||||
vertices are labeled with the same color and such that the minimum
|
||||
number of colors are used. In general, the graph coloring problem is
|
||||
NP-complete, and therefore it is impossible to find an optimal
|
||||
solution in a reasonable amount of time. However, there are many
|
||||
algorithms that use heuristics to find colorings that are close to the
|
||||
minimum.
|
||||
|
||||
<P>
|
||||
The particular algorithm we present here is based on the linear time
|
||||
<TT>SEQ</TT> subroutine that is used in the estimation of sparse
|
||||
Jacobian and Hessian matrices [<A
|
||||
HREF="bibliography.html#curtis74:_jacob">9</A>,<A
|
||||
HREF="bibliography.html#coleman84:_estim_jacob">7</A>,<A
|
||||
HREF="bibliography.html#coleman85:_algor">6</A>]. This algorithm
|
||||
visits all of the vertices in the graph according to the order defined
|
||||
by the input order. At each vertex the algorithm marks the colors of
|
||||
the adjacent vertices, and then chooses the smallest unmarked color
|
||||
for the color of the current vertex. If all of the colors are already
|
||||
marked, a new color is created. A color is considered marked if its
|
||||
mark number is equal to the current vertex number. This saves the
|
||||
trouble of having to reset the marks for each vertex. The
|
||||
effectiveness of this algorithm is highly dependent on the input
|
||||
vertex order. There are several ordering algorithms, including the
|
||||
<I>largest-first</I> [<A HREF="bibliography.html#welsch67">31</A>],
|
||||
<I>smallest-last</I> [<a
|
||||
href="bibliography.html#matula72:_graph_theory_computing">29</a>], and
|
||||
<I>incidence degree</I> [<a
|
||||
href="bibliography.html#brelaz79:_new">32</a>] algorithms, which
|
||||
improve the effectiveness of this coloring algorithm.
|
||||
|
||||
<P>
|
||||
The first decision to make when constructing a generic graph algorithm
|
||||
is to decide what graph operations are necessary for implementing the
|
||||
algorithm, and which graph concepts the operations map to. In this
|
||||
algorithm we will need to traverse through all of the vertices to
|
||||
intialize the vertex colors. We also need to access the adjacent
|
||||
vertices. Therefore, we will choose the <a
|
||||
href="./VertexListGraph.html">VertexListGraph</a> concept because it
|
||||
is the minimum concept that includes these operations. The graph type
|
||||
will be parameterized in the template function for this algorithm. We
|
||||
do not restrict the graph type to a particular graph class, such as
|
||||
the BGL <a href="./adjacency_list.html"><TT>adjacency_list</TT></a>,
|
||||
for this would drastically limit the reusability of the algorithm (as
|
||||
most algorithms written to date are). We do restrict the graph type to
|
||||
those types that model <a
|
||||
href="./VertexListGraph.html">VertexListGraph</a>. This is enforced by
|
||||
the use of those graph operations in the algorithm, and furthermore by
|
||||
our explicit requirement added as a concept check with
|
||||
<TT>function_requires()</TT> (see Section <A
|
||||
HREF="../../concept_check/concept_check.htm">Concept
|
||||
Checking</A> for more details about concept checking).
|
||||
|
||||
<P>
|
||||
Next we need to think about what vertex or edge properties will be
|
||||
used in the algorithm. In this case, the only property is vertex
|
||||
color. The most flexible way to specify access to vertex color is to
|
||||
use the propery map interface. This gives the user of the
|
||||
algorithm the ability to decide how they want to store the properties.
|
||||
Since we will need to both read and write the colors we specify the
|
||||
requirements as <a
|
||||
href="../../property_map/ReadWritePropertyMap.html">ReadWritePropertyMap</a>. The
|
||||
<TT>key_type</TT> of the color map must be the
|
||||
<TT>vertex_descriptor</TT> from the graph, and the <TT>value_type</TT>
|
||||
must be some kind of integer. We also specify the interface for the
|
||||
<TT>order</TT> parameter as a property map, in this case a <a
|
||||
href="../../property_map/ReadablePropertyMap.html">ReadablePropertyMap</a>. For
|
||||
order, the <TT>key_type</TT> is an integer offset and the
|
||||
<TT>value_type</TT> is a <TT>vertex_descriptor</TT>. Again we enforce
|
||||
these requirements with concept checks. The return value of this
|
||||
algorithm is the number of colors that were needed to color the graph,
|
||||
hence the return type of the function is the graph's
|
||||
<TT>vertices_size_type</TT>. The following code shows the interface for our
|
||||
graph algorithm as a template function, the concept checks, and some
|
||||
typedefs. The implementation is straightforward, the only step not
|
||||
discussed above is the color initialization step, where we set the
|
||||
color of all the vertices to ``uncolored''.
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
namespace boost {
|
||||
template <class VertexListGraph, class Order, class Color>
|
||||
typename graph_traits<VertexListGraph>::vertices_size_type
|
||||
sequential_vertex_color_ting(const VertexListGraph& G,
|
||||
Order order, Color color)
|
||||
{
|
||||
typedef graph_traits<VertexListGraph> GraphTraits;
|
||||
typedef typename GraphTraits::vertex_descriptor vertex_descriptor;
|
||||
typedef typename GraphTraits::vertices_size_type size_type;
|
||||
typedef typename property_traits<Color>::value_type ColorType;
|
||||
typedef typename property_traits<Order>::value_type OrderType;
|
||||
|
||||
function_requires< VertexListGraphConcept<VertexListGraph> >();
|
||||
function_requires< ReadWritePropertyMapConcept<Color, vertex_descriptor> >();
|
||||
function_requires< IntegerConcept<ColorType> >();
|
||||
function_requires< size_type, ReadablePropertyMapConcept<Order> >();
|
||||
typedef typename same_type<OrderType, vertex_descriptor>::type req_same;
|
||||
|
||||
size_type max_color = 0;
|
||||
const size_type V = num_vertices(G);
|
||||
std::vector<size_type>
|
||||
mark(V, numeric_limits_max(max_color));
|
||||
|
||||
typename GraphTraits::vertex_iterator v, vend;
|
||||
for (tie(v, vend) = vertices(G); v != vend; ++v)
|
||||
color[*v] = V - 1; // which means "not colored"
|
||||
|
||||
for (size_type i = 0; i < V; i++) {
|
||||
vertex_descriptor current = order[i];
|
||||
|
||||
// mark all the colors of the adjacent vertices
|
||||
typename GraphTraits::adjacency_iterator ai, aend;
|
||||
for (tie(ai, aend) = adjacent_vertices(current, G); ai != aend; ++ai)
|
||||
mark[color[*ai]] = i;
|
||||
|
||||
// find the smallest color unused by the adjacent vertices
|
||||
size_type smallest_color = 0;
|
||||
while (smallest_color < max_color && mark[smallest_color] == i)
|
||||
++smallest_color;
|
||||
|
||||
// if all the colors are used up, increase the number of colors
|
||||
if (smallest_color == max_color)
|
||||
++max_color;
|
||||
|
||||
color[current] = smallest_color;
|
||||
}
|
||||
return max_color;
|
||||
}
|
||||
} // namespace boost
|
||||
</PRE>
|
||||
|
||||
<P>
|
||||
|
||||
|
||||
|
||||
<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>
|
||||
@@ -1,116 +0,0 @@
|
||||
<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>
|
||||
@@ -1,247 +0,0 @@
|
||||
<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<IncidenceGraph>::vertex_descriptor s,
|
||||
OutputIterator inverse_permutation,
|
||||
ColorMap color, DegreeMap degree)
|
||||
|
||||
(2)
|
||||
template <class VertexListGraph, class OutputIterator>
|
||||
OutputIterator
|
||||
cuthill_mckee_ordering(const VertexListGraph& g, OutputIterator inverse_permutation);
|
||||
|
||||
template <class VertexListGraph, class OutputIterator, class VertexIndexMap>
|
||||
OutputIterator
|
||||
cuthill_mckee_ordering(const VertexListGraph& 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<IncidenceGraph>::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> and <a href="./IncidenceGraph.html">IncidenceGraph</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>
|
||||
@@ -1,326 +0,0 @@
|
||||
<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>
|
||||
|
||||
Binary file not shown.
-231
@@ -1,231 +0,0 @@
|
||||
/*
|
||||
: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 }
|
||||
@@ -1,314 +0,0 @@
|
||||
<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: Depth-First 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:depth-first-search"></A><img src="figs/python.gif" alt="(Python)"/>
|
||||
<TT>depth_first_search</TT>
|
||||
</H1>
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
<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)
|
||||
|
||||
</PRE>
|
||||
|
||||
<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>
|
||||
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>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>
|
||||
<a href="../../../boost/graph/depth_first_search.hpp"><TT>boost/graph/depth_first_search.hpp</TT></a>
|
||||
|
||||
<h3>Parameters</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>
|
||||
|
||||
<b>Python</b>: The parameter is named <tt>graph</tt>.
|
||||
</blockquote>
|
||||
|
||||
|
||||
<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>
|
||||
|
||||
<H3><A NAME="SECTION001340300000000000000">
|
||||
Complexity</A>
|
||||
</H3>
|
||||
|
||||
<P>
|
||||
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>
|
||||
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-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>
|
||||
@@ -1,144 +0,0 @@
|
||||
<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: Depth-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>
|
||||
|
||||
<H2><A NAME="sec:dfs"></A>
|
||||
<img src="figs/python.gif" alt="(Python)"/>
|
||||
<TT>depth_first_visit</TT>
|
||||
</H2>
|
||||
|
||||
|
||||
<P>
|
||||
<PRE>
|
||||
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>
|
||||
This function visits all of the vertices in the same connected
|
||||
component as the source vertex <tt>s</tt>, using the <a
|
||||
href="./graph_theory_review.html#sec:dfs-algorithm">depth-first
|
||||
pattern</a>. The main purpose of the function is for the
|
||||
implementation of <TT>depth_first_search()</TT> though sometimes it is
|
||||
useful on its own.
|
||||
|
||||
<p>
|
||||
The <tt>DFSVisitor</tt> supplied by the user determines what
|
||||
actions are taken at each event-point within the algorithm.
|
||||
|
||||
<p>
|
||||
The <tt>ColorMap</tt> is used by the algorithm to keep track
|
||||
of which vertices have been visited.
|
||||
|
||||
<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.
|
||||
|
||||
|
||||
<P>
|
||||
|
||||
<h3>Where Defined:</h3>
|
||||
|
||||
<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-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>
|
||||
@@ -1,111 +0,0 @@
|
||||
<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: dfs_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>
|
||||
dfs_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="./DFSVisitor.html">DFSVisitor</a>.
|
||||
|
||||
|
||||
<h3>Example</h3>
|
||||
|
||||
See the example for <a href="./EventVisitor.html">EventVisitor</a>.
|
||||
|
||||
<h3>Model of</h3>
|
||||
|
||||
<a href="./DFSVisitor.html">DFSVisitor</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/depth_first_search.hpp">
|
||||
<TT>boost/graph/depth_first_search.hpp</TT></a>
|
||||
|
||||
<h3>Member Functions</h3>
|
||||
|
||||
This class implements all of the member functions required by <a
|
||||
href="./DFSVisitor.html">DFSVisitor</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>
|
||||
dfs_visitor<EventVisitorList><br>
|
||||
make_dfs_visitor(EventVisitorList ev_list);
|
||||
</tt></td><td>
|
||||
Returns the event visitor list adapted to be a DFS 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>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user