a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
70 lines
1.3 KiB
C#
70 lines
1.3 KiB
C#
//
|
|
// 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;
|
|
}
|