- Tarjan's SCC algorithm (
tarjan_scc.hpp) — single-pass O(V+E) strongly connected components using iterative DFS with low-link values; no transpose graph needed - 17 new Tarjan SCC tests (
test_tarjan_scc.cpp) - Mapped (sparse) graph algorithm support — all 14 algorithms now accept
adjacency_list<G>(both index and map-based containers) mapped_vertex_range,mapped_adjacency_list,mapped_bidirectional_adjacency_listconceptsvertex_property_map<G, T>type alias andmake_vertex_property_mapfactory (vector for index graphs, unordered_map for mapped)vertex_property_map_for<M, G>concept for algorithm parameter constraintsvertex_property_map_value_t<Container>trait for extracting per-vertex value typesis_sparse_vertex_container_v<G>trait for compile-time graph type dispatch- Map-based graph test fixtures (
map_graph_fixtures.hpp) with sparse vertex IDs - 456 new algorithm tests for sparse graph types (4343 → 4799)
edge_descriptorsimplified to iterator-only storage — removed theconditional_t<random_access_iterator, size_t, EdgeIter>dual-storage path; edges always store the iterator directly since edges always have physical containers. Eliminates 38if constexprbranches across 6 files (~500 lines removed).compressed_graph::vertices(g)returnsiota_view— simplified tostd::ranges::iota_view<size_t, size_t>(0, num_vertices()), which theverticesCPO wraps automatically via_wrap_if_needed.vertex_descriptor_viewCTAD deduction guides — updated fromContainer::iterator/const_iteratortostd::ranges::iterator_t<>for compatibility with views likeiota_view.edge_descriptor_viewforward_list compatibility — fixed constructor to useif constexprforsized_rangecheck sostd::ranges::size()is not compiled for non-sized ranges likeforward_list.- All algorithms relaxed from
index_adjacency_list<G>toadjacency_list<G> - Algorithm internal arrays use
make_vertex_property_map(vector or unordered_map depending on graph type) - User-facing
Distances,Predecessors,Weight,Component,Labelparameters accept vertex property maps - Index-based for-loops replaced with
views::basic_vertexlist(g)iteration - Validation uses
if constexpr (index_vertex_range<G>)for size checks,find_vertexfor mapped graphs
- Bidirectional edge access —
in_edges,in_degree,find_in_edge,contains_in_edgeCPOs bidirectional_adjacency_listconceptin_edge_range_t<G>,in_edge_iterator_t<G>,in_edge_t<G>type aliasesout_edge_accessor/in_edge_accessorstateless edge-access policies (edge_accessor.hpp)in_incidenceandin_neighborsviews with pipe-syntax adaptors- Accessor template parameter on BFS, DFS, and topological sort views for reverse traversal
dynamic_graphBidirectionaltemplate parameter for incoming-edge listsundirected_adjacency_listbidirectional support (incoming = outgoing)- Kosaraju SCC algorithm and
transpose_graphview - 144 new tests (4261 → 4405)
- New documentation: bidirectional access tutorial, updated views/concepts/CPO/container docs
- Complete documentation reorganization: user guide, reference, contributor docs
- New README with badges, compiler table, feature highlights
- Separated adjacency list and edge list documentation
- Full container documentation including 26 dynamic_graph trait combinations
- Consolidated CPO implementation guide (from 3140 lines → ~970)
- Created FAQ, migration guide, getting started, and examples pages
- Fixed algorithms.hpp umbrella header (6 broken includes)
- Archived stale design documents
- Added canonical metrics tracking (docs/status/metrics.md)