Skip to content

Commit a19c100

Browse files
authored
changing output format of Kosaraju algorithm (#365)
1 parent 92fca0a commit a19c100

File tree

3 files changed

+32
-33
lines changed

3 files changed

+32
-33
lines changed

include/CXXGraph/Graph/Graph.hpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3364,36 +3364,39 @@ SCCResult<T> Graph<T>::kosaraju() const {
33643364

33653365
visited.clear();
33663366

3367-
std::function<void(shared<const Node<T>>, std::vector<Node<T>> &)>
3367+
std::function<void(shared<const Node<T>>, SCCResult<T>, int)>
33683368
dfs_helper1 =
33693369
[this, &rev, &visited, &dfs_helper1](shared<const Node<T>> source,
3370-
std::vector<Node<T>> &comp) {
3370+
SCCResult<T> result, int sccLabel) {
33713371
// mark the vertex visited
33723372
visited[source->getId()] = true;
33733373
// Add the current vertex to the strongly connected
33743374
// component
3375-
comp.push_back(*source);
3375+
//comp.push_back(*source);
3376+
result.sccMap[source->getId()] = sccLabel;
33763377

33773378
// travel the neighbors
33783379
for (int i = 0; i < rev[source].size(); i++) {
33793380
shared<const Node<T>> neighbor = rev[source].at(i).first;
33803381
if (visited[neighbor->getId()] == false) {
33813382
// make recursive call from neighbor
3382-
dfs_helper1(neighbor, comp);
3383+
dfs_helper1(neighbor, result, sccLabel);
33833384
}
33843385
}
33853386
};
33863387

3388+
int sccLabel = 0;
33873389
while (st.size() != 0) {
33883390
auto rem = st.top();
33893391
st.pop();
33903392
if (visited[rem->getId()] == false) {
3391-
std::vector<Node<T>> comp;
3392-
dfs_helper1(rem, comp);
3393-
result.stronglyConnectedComps.push_back(comp);
3393+
//std::vector<Node<T>> comp;
3394+
dfs_helper1(rem, result, sccLabel);
3395+
sccLabel++;
3396+
//result.stronglyConnectedComps.push_back(comp);
33943397
}
33953398
}
3396-
3399+
result.noOfComponents = sccLabel;
33973400
result.success = true;
33983401
return result;
33993402
}

include/CXXGraph/Utility/Typedef.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,9 @@ struct SCCResult_struct {
197197
bool success =
198198
false; // TRUE if the function does not return error, FALSE otherwise
199199
std::string errorMessage = ""; // message of error
200-
Components<T> stronglyConnectedComps;
200+
int noOfComponents = 0;
201+
std::unordered_map<size_t, int> sccMap;
202+
//Components<T> stronglyConnectedComps;
201203
};
202204
template <typename T>
203205
using SCCResult = SCCResult_struct<T>;

test/KosarajuTest.cpp

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,16 @@ using std::make_shared;
1313

1414
// helper function to compare strongly connected components (SCC) as computed
1515
// by the algorithm with expected (correct) SCC
16-
void compareComponents(CXXGraph::Components<int>& comp1,
16+
void compareComponents(CXXGraph::SCCResult<int> result,
1717
CXXGraph::Components<int>& comp2) {
18-
ASSERT_EQ(comp1.size(), comp2.size());
18+
ASSERT_EQ(result.noOfComponents, comp2.size());
1919

20-
for (size_t i = 0; i < comp1.size(); ++i) {
21-
std::sort(comp1[i].begin(), comp1[i].end());
22-
std::sort(comp2[i].begin(), comp2[i].end());
20+
for(int i=0;i<comp2.size();i++){
21+
int curComp = result.sccMap[comp2[i][0].getId()];
22+
for(int j=1;j<comp2[i].size();j++){
23+
ASSERT_EQ(result.sccMap[comp2[i][j].getId()], curComp);
24+
}
2325
}
24-
25-
std::sort(comp1.begin(), comp1.end(),
26-
[](auto& c1, auto& c2) { return c1.front() < c2.front(); });
27-
28-
std::sort(comp2.begin(), comp2.end(),
29-
[](auto& c1, auto& c2) { return c1.front() < c2.front(); });
30-
31-
ASSERT_EQ(comp1, comp2);
3226
}
3327

3428
// undirected graph
@@ -39,8 +33,8 @@ TEST(KosarajuTest, test_1) {
3933
CXXGraph::T_EdgeSet<int> edgeSet;
4034
edgeSet.insert(make_shared<CXXGraph::UndirectedEdge<int>>(edge));
4135
CXXGraph::Graph<int> graph(edgeSet);
42-
auto res = graph.kosaraju();
43-
ASSERT_EQ(res.stronglyConnectedComps.size(), 0);
36+
CXXGraph::SCCResult<int> res = graph.kosaraju();
37+
ASSERT_EQ(res.noOfComponents, 0);
4438
ASSERT_FALSE(res.success);
4539
ASSERT_EQ(res.errorMessage, CXXGraph::ERR_UNDIR_GRAPH);
4640
}
@@ -55,11 +49,11 @@ TEST(KosarajuTest, test_2) {
5549
edgeSet.insert(make_shared<CXXGraph::DirectedEdge<int>>(edge1));
5650
edgeSet.insert(make_shared<CXXGraph::DirectedEdge<int>>(edge2));
5751
CXXGraph::Graph<int> graph(edgeSet);
58-
auto res = graph.kosaraju();
52+
CXXGraph::SCCResult<int> res = graph.kosaraju();
5953
ASSERT_TRUE(res.success);
6054
ASSERT_EQ(res.errorMessage, "");
61-
ASSERT_EQ(res.stronglyConnectedComps.size(), 1);
62-
ASSERT_EQ(res.stronglyConnectedComps[0].size(), 2);
55+
ASSERT_EQ(res.noOfComponents, 1);
56+
//ASSERT_EQ(res.stronglyConnectedComps[0].size(), 2);
6357
}
6458

6559
// 1 comp, 2 strongly connected comp
@@ -75,12 +69,12 @@ TEST(KosarajuTest, test_3) {
7569
edgeSet.insert(make_shared<CXXGraph::DirectedEdge<int>>(edge2));
7670
edgeSet.insert(make_shared<CXXGraph::DirectedEdge<int>>(edge3));
7771
CXXGraph::Graph<int> graph(edgeSet);
78-
auto res = graph.kosaraju();
72+
CXXGraph::SCCResult<int> res = graph.kosaraju();
7973
ASSERT_TRUE(res.success);
8074
ASSERT_EQ(res.errorMessage, "");
8175

8276
CXXGraph::Components<int> expectedComponents = {{node1, node2}, {node3}};
83-
compareComponents(res.stronglyConnectedComps, expectedComponents);
77+
compareComponents(res, expectedComponents);
8478
}
8579

8680
// 2 components, 2 strongly connected comps
@@ -99,12 +93,12 @@ TEST(KosarajuTest, test_4) {
9993
edgeSet.insert(make_shared<CXXGraph::DirectedEdge<int>>(edge3));
10094
edgeSet.insert(make_shared<CXXGraph::DirectedEdge<int>>(edge4));
10195
CXXGraph::Graph<int> graph(edgeSet);
102-
auto res = graph.kosaraju();
96+
CXXGraph::SCCResult<int> res = graph.kosaraju();
10397
ASSERT_TRUE(res.success);
10498
ASSERT_EQ(res.errorMessage, "");
10599
CXXGraph::Components<int> expectedComponents = {{node1, node2},
106100
{node3, node4}};
107-
compareComponents(res.stronglyConnectedComps, expectedComponents);
101+
compareComponents(res, expectedComponents);
108102
}
109103

110104
TEST(KosarajuTest, test_5) {
@@ -168,7 +162,7 @@ TEST(KosarajuTest, test_5) {
168162
edgeSet.insert(make_shared<CXXGraph::DirectedEdge<int>>(edge21));
169163

170164
CXXGraph::Graph graph(edgeSet);
171-
auto res = graph.kosaraju();
165+
CXXGraph::SCCResult<int> res = graph.kosaraju();
172166
ASSERT_TRUE(res.success);
173167
ASSERT_EQ(res.errorMessage, "");
174168

@@ -179,5 +173,5 @@ TEST(KosarajuTest, test_5) {
179173
{node8, node9},
180174
{node10, node11, node12, node13}};
181175

182-
compareComponents(res.stronglyConnectedComps, expectedComponents);
176+
compareComponents(res, expectedComponents);
183177
}

0 commit comments

Comments
 (0)