UNPKG

dist-javascript-algorithms-and-data-structures

Version:

Algorithms and data-structures implemented on JavaScript

57 lines (46 loc) 1.78 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = topologicalSort; var _Stack = _interopRequireDefault(require("../../../data-structures/stack/Stack")); var _depthFirstSearch = _interopRequireDefault(require("../depth-first-search/depthFirstSearch")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * @param {Graph} graph */ function topologicalSort(graph) { // Create a set of all vertices we want to visit. const unvisitedSet = {}; graph.getAllVertices().forEach(vertex => { unvisitedSet[vertex.getKey()] = vertex; }); // Create a set for all vertices that we've already visited. const visitedSet = {}; // Create a stack of already ordered vertices. const sortedStack = new _Stack.default(); const dfsCallbacks = { enterVertex: ({ currentVertex }) => { // Add vertex to visited set in case if all its children has been explored. visitedSet[currentVertex.getKey()] = currentVertex; // Remove this vertex from unvisited set. delete unvisitedSet[currentVertex.getKey()]; }, leaveVertex: ({ currentVertex }) => { // If the vertex has been totally explored then we may push it to stack. sortedStack.push(currentVertex); }, allowTraversal: ({ nextVertex }) => { return !visitedSet[nextVertex.getKey()]; } }; // Let's go and do DFS for all unvisited nodes. while (Object.keys(unvisitedSet).length) { const currentVertexKey = Object.keys(unvisitedSet)[0]; const currentVertex = unvisitedSet[currentVertexKey]; // Do DFS for current node. (0, _depthFirstSearch.default)(graph, currentVertex, dfsCallbacks); } return sortedStack.toArray(); }