mirror of
https://hub.njuu.cf/TheAlgorithms/C-Plus-Plus.git
synced 2023-10-11 13:05:55 +08:00
79fb528dad
* fix: clang-format for graph/ * remove graph.h
51 lines
1.4 KiB
C++
51 lines
1.4 KiB
C++
#include <algorithm>
|
|
#include <iostream>
|
|
#include <vector>
|
|
|
|
int number_of_vertices,
|
|
number_of_edges; // For number of Vertices (V) and number of edges (E)
|
|
std::vector<std::vector<int>> graph;
|
|
std::vector<bool> visited;
|
|
std::vector<int> topological_order;
|
|
|
|
void dfs(int v) {
|
|
visited[v] = true;
|
|
for (int u : graph[v]) {
|
|
if (!visited[u]) {
|
|
dfs(u);
|
|
}
|
|
}
|
|
topological_order.push_back(v);
|
|
}
|
|
|
|
void topological_sort() {
|
|
visited.assign(number_of_vertices, false);
|
|
topological_order.clear();
|
|
for (int i = 0; i < number_of_vertices; ++i) {
|
|
if (!visited[i]) {
|
|
dfs(i);
|
|
}
|
|
}
|
|
reverse(topological_order.begin(), topological_order.end());
|
|
}
|
|
int main() {
|
|
std::cout
|
|
<< "Enter the number of vertices and the number of directed edges\n";
|
|
std::cin >> number_of_vertices >> number_of_edges;
|
|
int x = 0, y = 0;
|
|
graph.resize(number_of_vertices, std::vector<int>());
|
|
for (int i = 0; i < number_of_edges; ++i) {
|
|
std::cin >> x >> y;
|
|
x--, y--; // to convert 1-indexed to 0-indexed
|
|
graph[x].push_back(y);
|
|
}
|
|
topological_sort();
|
|
std::cout << "Topological Order : \n";
|
|
for (int v : topological_order) {
|
|
std::cout << v + 1
|
|
<< ' '; // converting zero based indexing back to one based.
|
|
}
|
|
std::cout << '\n';
|
|
return 0;
|
|
}
|