Skip to content

Commit af2cf0f

Browse files
committed
topological sorting implementation added
1 parent 8963eee commit af2cf0f

File tree

5 files changed

+114
-0
lines changed

5 files changed

+114
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#pragma once
2+
3+
#include<list>
4+
#include<map>
5+
#include<string>
6+
#include<vector>
7+
using namespace std;
8+
enum color { WHITE, GRAY, BLACK };
9+
10+
class TopologicalSortNode
11+
{
12+
public:
13+
int data;
14+
int color;
15+
int discoveryTime;
16+
int finishingTime;
17+
TopologicalSortNode* parent;
18+
TopologicalSortNode(int value);
19+
};
20+
21+
class TopologicalSortGraph
22+
{
23+
private:
24+
int time;
25+
map<TopologicalSortNode*, list<TopologicalSortNode*>> _adjlist;
26+
map<int, TopologicalSortNode*> _nodeMap;
27+
TopologicalSortNode* MakeOrFindNode(int value);
28+
list<TopologicalSortNode*> _topologicalSortedNodeList;
29+
void DepthFirstSearch(TopologicalSortNode* DFSNode);
30+
public:
31+
void PushDirectedEdge(int valueU, int valueV);
32+
void TopologicalSort();
33+
vector<pair<int, pair<int, int>>> ShowTopologicalSortResult();
34+
};
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#include "../Headers/0003_Graph/0003_TopologicalSort.h"
2+
#include<vector>
3+
#include<utility>
4+
#include<climits>
5+
using namespace std;
6+
7+
TopologicalSortNode::TopologicalSortNode(int value)
8+
{
9+
this->data = value;
10+
this->discoveryTime = INT_MAX;
11+
this->finishingTime = INT_MAX;
12+
this->color = WHITE;
13+
this->parent = nullptr;
14+
}
15+
16+
TopologicalSortNode* TopologicalSortGraph::MakeOrFindNode(int value)
17+
{
18+
TopologicalSortNode* node = nullptr;
19+
if (this->_nodeMap.find(value) == this->_nodeMap.end())
20+
{
21+
node = new TopologicalSortNode(value);
22+
this->_nodeMap[value] = node;
23+
}
24+
else
25+
{
26+
node = this->_nodeMap[value];
27+
}
28+
return node;
29+
}
30+
31+
void TopologicalSortGraph::DepthFirstSearch(TopologicalSortNode* nodeU)
32+
{
33+
this->time++;
34+
nodeU->discoveryTime = this->time;
35+
nodeU->color = GRAY;
36+
for (auto nodeV : this->_adjlist[nodeU])
37+
{
38+
if (nodeV->color == WHITE)
39+
{
40+
nodeV->parent = nodeU;
41+
this->DepthFirstSearch(nodeV);
42+
}
43+
}
44+
nodeU->color = BLACK;
45+
this->time++;
46+
nodeU->finishingTime = time;
47+
this->_topologicalSortedNodeList.push_front(nodeU);
48+
}
49+
50+
void TopologicalSortGraph::PushDirectedEdge(int valueU, int valueV)
51+
{
52+
TopologicalSortNode* nodeU = this->MakeOrFindNode(valueU);
53+
TopologicalSortNode* nodeV = this->MakeOrFindNode(valueV);
54+
55+
this->_adjlist[nodeU].push_back(nodeV);
56+
}
57+
58+
void TopologicalSortGraph::TopologicalSort()
59+
{
60+
this->time = 0;
61+
for (auto& iterator : this->_nodeMap)
62+
{
63+
if (iterator.second->color == WHITE)
64+
{
65+
this->DepthFirstSearch(iterator.second);
66+
}
67+
}
68+
}
69+
70+
vector<pair<int, pair<int, int>>> TopologicalSortGraph::ShowTopologicalSortResult()
71+
{
72+
vector<pair<int, pair<int, int>>> result;
73+
for (auto& node : this->_topologicalSortedNodeList)
74+
{
75+
result.push_back(make_pair(node->data, make_pair(node->discoveryTime, node->finishingTime)));
76+
}
77+
return result;
78+
}

SourceCodes/0003_Graph/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
set(0003GRAPH_SOURCES
33
0001_BreadthFirstSearch.cc
44
0002_DepthFirstSearch.cc
5+
0003_TopologicalSort.cc
56
)
67

78
# Create a library target

Tests/0003_Graph/0003_TopologicalSortTest.cc

Whitespace-only changes.

Tests/0003_Graph/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ add_executable(
1414
0003GraphTests
1515
0001_BreadthFirstSearchTest.cc
1616
0002_DepthFirstSearchTest.cc
17+
0003_TopologicalSortTest.cc
1718
)
1819

1920
target_link_libraries(

0 commit comments

Comments
 (0)