Пример #1
0
        private LinkedList <Arc> Reconstruct(IStackableVertex top, IStackableVertex start, LinkedList <Arc> path)
        {
            var nodeCur = top;

            while (nodeCur != start)
            {
                if (!nodeCur.Ancestor.IsExpanded)
                {
                    path.AddFirst(nodeCur.ArcFromAncestor);
                    nodeCur = nodeCur.Ancestor;
                }
                else
                {
                    var eA = nodeCur.Ancestor.ExpandedArc;
                    var q  = ReconstructQ(nodeCur, eA.End, new LinkedList <Arc>());
                    path.PrependRange(q);
                    nodeCur = eA.Start;
                }
            }
            if (nodeCur.ArcFromAncestor != null)
            {
                path.AddFirst(nodeCur.ArcFromAncestor);
            }
            return(path);
        }
Пример #2
0
 public void Pop()
 {
     CurrentStack.RemoveLast();
     MDFS._step++;
     Log.Info("(" + MDFS._step + ") Popped vertex " + ((ABVertex)_top).Name);
     _top = _top.Ancestor;
     if (_top != null)
     {
         Log.Info("New top vertex " + ((ABVertex)_top).Name);
     }
 }
Пример #3
0
 public IStackableVertex Push(ABVertex vertex, Arc arcFromAncestor)
 {
     vertex.Pushed(_top, arcFromAncestor);
     if (_top != null)
     {
         _top.AddDescendant(vertex);
     }
     _top = vertex;
     CurrentStack.AddLast(vertex);
     MDFS._step++;
     Log.Info("(" + MDFS._step + ") Pushed vertex " + vertex.Name + " and arc " + arcFromAncestor);
     return(vertex);
 }
Пример #4
0
        private LinkedList <Arc> ReconstructQ(IStackableVertex uA, IStackableVertex wA, LinkedList <Arc> path)
        {
            var st    = wA;
            var p1St  = st.Value.P.Start;
            var p2St  = st.Value.P.End;
            var pathQ = Reconstruct(p1St, st, path);

            while (p2St != uA)
            {
                st = st.Value.P.End;
                var block = Reconstruct(st.Value.P.Start, st, path);
                pathQ.AppendRange(block);
            }
            if (uA.ArcFromAncestor == null)
            {
                var arc = ArcHelper.FindArc(st.Value.P.Start.Value, uA.Value, uA.Value.InboundArcs);
                pathQ.AddLast(arc);
            }
            else
            {
                pathQ.AddLast(uA.ArcFromAncestor);
            }
            return(path);
        }
Пример #5
0
 public LinkedList <Arc> Run()
 {
     _start = _k.Push(_tg.StartVertex, null);
     Search();
     return(_mAugmentingPath);
 }
Пример #6
0
 public Connection(Arc arc, IStackableVertex start, IStackableVertex end)
 {
     Arc   = arc;
     Start = start;
     End   = end;
 }
Пример #7
0
 public void Pushed(IStackableVertex ancestor, Arc arcFromAncestor)
 {
     Ancestor        = ancestor;
     ArcFromAncestor = arcFromAncestor;
 }
Пример #8
0
 public void AddDescendant(IStackableVertex vertex)
 {
     Descendants.AddLast(vertex);
 }
Пример #9
0
 public ExpandedArc(Arc a)
 {
     Start = (ABVertex)a.Start;
     End   = (ABVertex)a.End;
 }