You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

38 lines
751 B
Ruby

# Topological ordering of a directed graph is a linear ordering of
# its vertices such that for every directed edge uv from vertex u to vertex v,
# u comes before v in the ordering.
class Dag
attr_accessor :nodes
def topological_sort
# Tarjan's algorithm
@sorted_nodes = []
@unmarked_nodes = @nodes.dup
visit(@unmarked_nodes.sample) while @unmarked_nodes.count > 0
@sorted_nodes
end
def visit(node)
# Depth First Search
unless @unmarked_nodes.include? node
node.neighbors.each { |neighbor| visit(neighbor) }
@unmarked_nodes.delete(node)
@sorted_nodes.unshift node
end
end
end
class Node
attr_accessor :neighbors
def initialize(neighbors)
@neighbors = neighbors
end
end