mirror of
https://hub.njuu.cf/TheAlgorithms/C-Plus-Plus.git
synced 2023-10-11 13:05:55 +08:00
Merge pull request #1 from mahammadhussain98/mahammadhussain98-patch-1
added Topological sort
This commit is contained in:
commit
3d6fd518aa
109
sorting/Topological Sort.cpp
Normal file
109
sorting/Topological Sort.cpp
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
#include <iostream>
|
||||||
|
#include <list>
|
||||||
|
#include <stack>
|
||||||
|
#include <string>
|
||||||
|
#include <sstream>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
// Class to represent a graph
|
||||||
|
class Graph {
|
||||||
|
int V; // No. of vertices
|
||||||
|
|
||||||
|
// Pointer to an array containing adjacency lists
|
||||||
|
list<int>* adj;
|
||||||
|
|
||||||
|
// A function used by topologicalSort
|
||||||
|
void topologicalSortUtil(int v, bool visited[], stack<int>& Stack);
|
||||||
|
|
||||||
|
public:
|
||||||
|
Graph(int V); // Constructor
|
||||||
|
|
||||||
|
// Function to add an edge to the graph
|
||||||
|
void addEdge(int v, int w);
|
||||||
|
|
||||||
|
// Prints a Topological Sort of the complete graph
|
||||||
|
void topologicalSort();
|
||||||
|
};
|
||||||
|
|
||||||
|
Graph::Graph(int V)
|
||||||
|
{
|
||||||
|
this->V = V;
|
||||||
|
adj = new list<int>[V];
|
||||||
|
}
|
||||||
|
|
||||||
|
void Graph::addEdge(int v, int w)
|
||||||
|
{
|
||||||
|
adj[v].push_back(w); // Add w to v’s list.
|
||||||
|
}
|
||||||
|
|
||||||
|
// A recursive function used by topologicalSort
|
||||||
|
void Graph::topologicalSortUtil(int v, bool visited[],
|
||||||
|
stack<int>& Stack)
|
||||||
|
{
|
||||||
|
// Mark the current node as visited.
|
||||||
|
visited[v] = true;
|
||||||
|
|
||||||
|
// Recur for all the vertices adjacent to this vertex
|
||||||
|
list<int>::iterator i;
|
||||||
|
for (i = adj[v].begin(); i != adj[v].end(); ++i)
|
||||||
|
if (!visited[*i])
|
||||||
|
topologicalSortUtil(*i, visited, Stack);
|
||||||
|
|
||||||
|
// Push current vertex to stack which stores result
|
||||||
|
Stack.push(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
// The function to do Topological Sort. It uses recursive
|
||||||
|
// topologicalSortUtil()
|
||||||
|
void Graph::topologicalSort()
|
||||||
|
{
|
||||||
|
stack<int> Stack;
|
||||||
|
|
||||||
|
// Mark all the vertices as not visited
|
||||||
|
bool* visited = new bool[V];
|
||||||
|
for (int i = 0; i < V; i++)
|
||||||
|
visited[i] = false;
|
||||||
|
|
||||||
|
// Call the recursive helper function to store Topological
|
||||||
|
// Sort starting from all vertices one by one
|
||||||
|
for (int i = 0; i < V; i++)
|
||||||
|
if (visited[i] == false)
|
||||||
|
topologicalSortUtil(i, visited, Stack);
|
||||||
|
|
||||||
|
// Print contents of stack
|
||||||
|
cout << "Topological Sort: ";
|
||||||
|
while (Stack.empty() == false) {
|
||||||
|
cout << Stack.top() << " ";
|
||||||
|
Stack.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
int V;
|
||||||
|
string edgeInput;
|
||||||
|
|
||||||
|
cout << "Enter the number of vertices: ";
|
||||||
|
cin >> V;
|
||||||
|
|
||||||
|
cin.ignore(); // Ignore the newline character
|
||||||
|
|
||||||
|
Graph g(V);
|
||||||
|
|
||||||
|
cout << "Enter the edges as a comma-separated list (e.g., 1,2,3,):" << endl;
|
||||||
|
getline(cin, edgeInput);
|
||||||
|
|
||||||
|
istringstream iss(edgeInput);
|
||||||
|
string edge;
|
||||||
|
while (getline(iss, edge, ',')) {
|
||||||
|
int source, destination;
|
||||||
|
source = stoi(edge);
|
||||||
|
getline(iss, edge, ',');
|
||||||
|
destination = stoi(edge);
|
||||||
|
g.addEdge(source, destination);
|
||||||
|
}
|
||||||
|
|
||||||
|
g.topologicalSort();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user