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 List<char>();
foreach(var start in possibleStart)
Console.WriteLine(String.Join(",", result));
static void GetRoute(Node node, List<char> list)
node.VisitStatus = VisitStatus.Visiting;
foreach(var ad in node.Adjacent)
if(ad.VisitStatus == VisitStatus.Visiting)
throw new ApplicationException("no possible order");
if(ad.VisitStatus == VisitStatus.Visited)
node.VisitStatus = VisitStatus.Visited;
list.Add(node.Character);
public List<Node> Adjacent = new List<Node>();
public VisitStatus VisitStatus;