/// <summary> /// Performs a depth-first search on the graph and retrieves a post-order sorting. /// </summary> /// <param name="succrel">successor relation</param> /// <param name="indexMap">index map for receiving the post order indices</param> /// <param name="nodes">nodes to consider</param> /// <param name="start">start node</param> /// <param name="reverse">whether a reverse post-order sorting is desired</param> /// <returns>all visited nodes in post-order sorting or inverse post-order sorting</returns> public static T[] GetPostOrder <T>(IPropMap <T, T[]> succrel, IPropMap <T, int> indexMap, IList <T> nodes, T start, bool reverse) { indexMap.Reset(nodes, -1); Stack <T> result = new Stack <T>(); int index = 0; PostOrderDFS(succrel, indexMap, result, start, ref index); indexMap.Reset(nodes, -1); List <T> order = new List <T>(nodes.Count); index = 0; foreach (T node in result) { if (indexMap[node] < 0) { order.Add(node); indexMap[node] = index++; } } if (reverse) { order.Reverse(); } return(order.ToArray()); }
/// <summary> /// Sets all specified keys of the property map to <c>default(TValue)</c>. /// </summary> /// <param name="pmap">the property map</param> /// <param name="nodes">the elements whose property values are to be reset</param> public static void Clear <TThis, TValue>(this IPropMap <TThis, TValue> pmap, IEnumerable <TThis> nodes) { pmap.Reset(nodes, default(TValue)); }