70 lines
1.3 KiB
C#
Raw Normal View History

//
// file: depgraph.cs
// author: Dan Lewis (dihlewis@yahoo.co.uk)
// (C) 2002
//
using System;
using System.Collections;
class DependencyGraph {
public DependencyGraph () {
nodes = new Hashtable ();
}
public void AddNode (object o) {
if (!nodes.Contains (o))
nodes.Add (o, new Node (o));
}
public void AddEdge (object from, object to) {
if (!nodes.Contains (from))
AddNode (from);
if (!nodes.Contains (to))
AddNode (from);
Node from_node = (Node)nodes[from];
Node to_node = (Node)nodes[to];
from_node.edges.Add (to_node);
}
public IList TopologicalSort () {
foreach (Node node in nodes.Values)
node.marked = false;
IList list = new ArrayList ();
foreach (Node node in nodes.Values) {
if (!node.marked)
Visit (node, list);
}
return list;
}
// private
private void Visit (Node node, IList list) {
node.marked = true;
foreach (Node adj in node.edges) {
if (!adj.marked)
Visit (adj, list);
}
list.Insert (0, node.value);
}
private class Node {
public Node (object o) {
this.value = o;
this.edges = new ArrayList ();
}
public object value;
public ArrayList edges;
public bool marked;
}
private Hashtable nodes;
}