using System.Collections.Generic;
public static void Main()
var projects = new char[] {'a','b','c','d','e','f'};
var dependencies = new char[,] {{'a','f','b','f','d'},
var nodes = new Dictionary<char, Node>();
var possibleStart = new HashSet<Node>();
foreach(var project in projects)
var node = new Node {Character = project};
nodes.Add(project, node);
for(var i = 0; i < dependencies.GetLength(1); i++)
nodes[dependencies[1,i]].Adjacent.Add(nodes[dependencies[0,i]]);
possibleStart.Remove(nodes[dependencies[0,i]]);
var result = new Stack<Node>();
while(possibleStart.Count > 0)
var start = possibleStart.FirstOrDefault();
possibleStart.Remove(start);
var queue = new Queue<Node>();
start.VisitStatus = VisitStatus.Visiting;
var current = queue.Dequeue();
foreach(var ad in current.Adjacent)
if(ad.VisitStatus == VisitStatus.Visiting)
ad.VisitStatus = VisitStatus.Visiting;
current.VisitStatus = VisitStatus.Visited;
if(result.Count() != projects.Count())
throw new ApplicationException("no possible order");
Console.Write(result.Pop().Character + (result.Any() ? "," : ""));
public List<Node> Adjacent = new List<Node>();
public VisitStatus VisitStatus;