(function (exports) { 'use strict'; var topologicalSort = (function () { function topologicalSortHelper(node, visited, temp, graph, result) { temp[node] = true; var neighbors = graph[node]; for (var i = 0; i < neighbors.length; i += 1) { var n = neighbors[i]; if (temp[n]) { throw new Error('The graph is not a DAG'); } if (!visited[n]) { topologicalSortHelper(n, visited, temp, graph, result); } } temp[node] = false; visited[node] = true; result.push(node); } /** * Topological sort algorithm of a directed acyclic graph.

* Time complexity: O(|E| + |V|) where E is a number of edges * and |V| is the number of nodes. * * @public * @module graphs/others/topological-sort * @param {Array} graph Adjacency list, which represents the graph. * @returns {Array} Ordered vertices. * * @example * var topsort = * require('path-to-algorithms/src/graphs/' + * 'others/topological-sort').topologicalSort; * var graph = { * v1: ['v2', 'v5'], * v2: [], * v3: ['v1', 'v2', 'v4', 'v5'], * v4: [], * v5: [] * }; * var vertices = topsort(graph); // ['v3', 'v4', 'v1', 'v5', 'v2'] */ return function (graph) { var result = []; var visited = []; var temp = []; for (var node in graph) { if (!visited[node] && !temp[node]) { topologicalSortHelper(node, visited, temp, graph, result); } } return result.reverse(); }; }()); exports.topologicalSort = topologicalSort; }(typeof exports === 'undefined' ? window : exports));