Skip to content

Commit 5041789

Browse files
committed
Implemented an overload of the graph::isConnected() function which reports whether a Graph is a strongly-connected component.
1 parent 6a89c9a commit 5041789

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

‎src/h/graph.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ namespace ctgl {
4343
template <typename G, typename N>
4444
constexpr auto getOutgoingEdges(G, N) noexcept;
4545

46+
// Reports whether the provided Graph is a strongly-connected component.
47+
template <typename G>
48+
constexpr bool isConnected(G) noexcept;
49+
4650
// Reports whether Node |T| is reachable from Node |S| in the provided Graph.
4751
template <typename G, typename S, typename T>
4852
constexpr bool isConnected(G, S, T) noexcept;
@@ -126,6 +130,24 @@ namespace ctgl {
126130
return List<>{};
127131
}
128132

133+
template <typename G>
134+
constexpr bool isConnected(G) noexcept {
135+
// A Graph is a strongly-connected component if there exists a cycle
136+
// which includes all Nodes in the Graph.
137+
constexpr auto nodes = typename G::Nodes{};
138+
return isConnected(G{}, nodes + nodes);
139+
}
140+
141+
template <typename G, typename T1, typename T2, typename... Ts>
142+
constexpr bool isConnected(G, List<T1, T2, Ts...>) noexcept {
143+
return isConnected(G{}, T1{}, T2{}) && isConnected(G{}, List<T2, Ts...>{});
144+
}
145+
146+
template <typename G, typename... Ts>
147+
constexpr bool isConnected(G, List<Ts...>) noexcept {
148+
return true;
149+
}
150+
129151
template <typename G, typename S, typename T>
130152
constexpr bool isConnected(G, S, T) noexcept {
131153
constexpr auto nodes = typename G::Nodes{};

‎src/test/graph_test.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,38 +84,54 @@ TEST(GraphTest, GetOutgoingEdges) {
8484
EXPECT_EQ(getOutgoingEdges(Leap{}, N3{}), List<>{});
8585
}
8686

87-
// Unit tests for the ctgl::graph::isConnected() function.
87+
// Unit tests for the ctgl::graph::isConnected() functions.
8888
TEST(GraphTest, IsConnected) {
8989
// Empty
90+
EXPECT_TRUE(isConnected(Empty{}));
9091
EXPECT_FALSE(isConnected(Empty{}, N1{}, N1{}));
9192
EXPECT_FALSE(isConnected(Empty{}, N1{}, N2{}));
9293

9394
// Island
95+
EXPECT_TRUE(isConnected(Island{}));
9496
EXPECT_TRUE(isConnected(Island{}, N1{}, N1{}));
9597
EXPECT_FALSE(isConnected(Island{}, N1{}, N2{}));
9698
EXPECT_FALSE(isConnected(Island{}, N2{}, N1{}));
9799

98100
// Loopback
101+
EXPECT_TRUE(isConnected(Loopback{}));
99102
EXPECT_TRUE(isConnected(Loopback{}, N1{}, N1{}));
100103
EXPECT_FALSE(isConnected(Loopback{}, N1{}, N2{}));
101104

102105
// Arrow
106+
EXPECT_FALSE(isConnected(Arrow{}));
103107
EXPECT_TRUE(isConnected(Arrow{}, N1{}, N2{}));
104108
EXPECT_FALSE(isConnected(Arrow{}, N2{}, N1{}));
105109

106110
// Bridge
111+
EXPECT_TRUE(isConnected(Bridge{}));
107112
EXPECT_TRUE(isConnected(Bridge{}, N1{}, N2{}));
108113
EXPECT_TRUE(isConnected(Bridge{}, N2{}, N1{}));
109114

110115
// Leap
116+
EXPECT_FALSE(isConnected(Leap{}));
111117
EXPECT_TRUE(isConnected(Leap{}, N1{}, N2{}));
112118
EXPECT_TRUE(isConnected(Leap{}, N1{}, N3{}));
113119
EXPECT_TRUE(isConnected(Leap{}, N2{}, N3{}));
114120
EXPECT_FALSE(isConnected(Leap{}, N2{}, N1{}));
115121
EXPECT_FALSE(isConnected(Leap{}, N3{}, N1{}));
116122
EXPECT_FALSE(isConnected(Leap{}, N3{}, N2{}));
117123

124+
// Triangle
125+
EXPECT_TRUE(isConnected(Triangle{}));
126+
EXPECT_TRUE(isConnected(Triangle{}, N1{}, N2{}));
127+
EXPECT_TRUE(isConnected(Triangle{}, N1{}, N3{}));
128+
EXPECT_TRUE(isConnected(Triangle{}, N2{}, N1{}));
129+
EXPECT_TRUE(isConnected(Triangle{}, N2{}, N3{}));
130+
EXPECT_TRUE(isConnected(Triangle{}, N3{}, N1{}));
131+
EXPECT_TRUE(isConnected(Triangle{}, N3{}, N2{}));
132+
118133
// Pan
134+
EXPECT_FALSE(isConnected(Pan{}));
119135
EXPECT_TRUE(isConnected(Pan{}, N1{}, N2{}));
120136
EXPECT_TRUE(isConnected(Pan{}, N1{}, N3{}));
121137
EXPECT_TRUE(isConnected(Pan{}, N1{}, N4{}));

0 commit comments

Comments
 (0)