Bug in biconnected_components when handling multiple (parallel) edges between the same pair of vertices
Maintainers usually reply within 1 day
Assessment
This issue has not been assessed yet.
Description
Version of Boost
1.88.0
Problem description
In a block of parallel edges (e.g., three edges between A and B), only one edge receives the correct biconnected component label.
The rest are incorrectly assigned component ID 0 — even though they belong to the same biconnected component.
Expected behavior
All edges in a block of parallel edges should have the same non-zero component ID
Actual behavior
Only one edge gets the correct component ID; others are assigned 0 — which is wrong
Reproducible example
Problem can be reproduced with such program.
#include <boost/config.hpp>
#include <vector>
#include <list>
#include <boost/graph/biconnected_components.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/properties.hpp>
#include <boost/property_map/property_map.hpp>
#include <iterator>
#include <iostream>
namespace boost
{
struct edge_component_t
{
typedef edge_property_tag kind;
} edge_component;
}
int main()
{
using namespace boost;
typedef adjacency_list<vecS, vecS, undirectedS,
property<boost::vertex_index_t, std::size_t>,
property<edge_component_t, std::size_t>
> graph_t;
typedef graph_traits<graph_t>::vertex_descriptor vertex_t;
typedef graph_traits<graph_t>::vertices_size_type size_type;
std::vector<std::pair<size_t, size_t>> graph_edges = {
{0, 1}, {0, 1}, {0, 1}, // block of parallel edges
{1, 2}, // bridge
{2, 3}, {2, 3}, {2, 3}, // block of parallel edges
{3, 4}, // bridge
{4, 5} // bridge
};
graph_t g(graph_edges.size());
for (const auto& pair : graph_edges)
add_edge(pair.first, pair.second, g);
property_map<graph_t, edge_component_t>::type comp_map = get(edge_component, g);
std::vector<vertex_t> art_points;
auto num_comps = biconnected_components(g, comp_map, std::back_inserter(art_points));
std::cerr << "Found " << num_comps.first << " biconnected components.\n";
std::cerr << "Found " << art_points.size() << " articulation points.\n";
graph_traits<graph_t>::edge_iterator ei, ei_end;
for (boost::tie(ei, ei_end) = edges(g); ei != ei_end; ++ei)
std::cout << (char)(source(*ei, g) + 'A') << " -- "
<< (char)(target(*ei, g) + 'A')
<< " " << comp_map[*ei] << "\n";
return 0;
}
Actual output
The proram output contains block index for each edge of graph:
Found 5 biconnected components.
Found 4 articulation points.
A -- B 4
A -- B 0
A -- B 0
B -- C 3
C -- D 2
C -- D 0
C -- D 0
D -- E 1
E -- F 0
Only one of parallel edges A-B has non-zero block index. Same stands for edges C-D.
Picture shows the graph from example. Red vertices indicate articulation points. Each edge is labeled with index of biconnected component (block) to which it belongs Picture makes clear that output of example is incorrect - each group of parallel edges should form a distinct block.
Expected output
Found 5 biconnected components.
Found 4 articulation points.
A -- B 4
A -- B 4
A -- B 4
B -- C 3
C -- D 2
C -- D 2
C -- D 2
D -- E 1
E -- F 0
- Dominant language
- C++
- Stars
- 397
- Forks
- 246
- Avg merge
- 1d 17h
- Merged PRs (30d)
- 30
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from boostorg/graph
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
boostorg/graph#627 · 1 comment ·
Maintainers usually reply within 1 day
-
Good first issues: start contributing to Boost.Graph herePossibly taken A pull request linked to this issue is open or already merged. Openbeginner friendly
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
boostorg/graph#593 · 38 comments ·
Maintainers usually reply within 1 day
-
algorithm beginner friendly priority: high
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
boostorg/graph#231 · 2 comments ·
Maintainers usually reply within 1 day
-
Difficulty 3/5 1-2 days Newbie friendliness 68/100
boostorg/graph#599 · 2 comments ·
Maintainers usually reply within 1 day
-
Difficulty 5/5 Over a week Newbie friendliness 30/100
Maintainers usually reply within 1 day
Similar issues
-
Component: Ruby Type: bug
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
Maintainers usually reply within 1 day
-
bug needs triage tcp
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
project-chip/connectedhomeip#74644 ·
Maintainers usually reply within 1 day
-
Difficulty 1/5 Under an hour Newbie friendliness 82/100
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
godotengine/godot#124252 · 2 comments ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
texstudio-org/texstudio#4685 ·
Maintainers usually reply within 1 day