Esempio n. 1
0
 private void removeNode(tNode aNode)
 {
     while (aNode.inEdges.Count > 0)
     {
         removeEdge(aNode.inEdges[0]);
     }
     while (aNode.outEdges.Count > 0)
     {
         removeEdge(aNode.outEdges[0]);
     }
     Nodes.Remove(aNode.Name);
 }
Esempio n. 2
0
 /// <summary>
 /// Добавляет вершину с уникальным именем.
 /// Исключения:
 ///   Exception("Такая вершина уже существует");
 /// </summary>
 /// <param name="aName">уникальное имя</param>
 /// <returns>вершина, гарантированно не null</returns>
 public tNode addNode(string aName)
 {
     if (Nodes.ContainsKey(aName))
     {
         throw new Exception("Такая вершина уже существует");
     }
     else
     {
         tNode n = new tNode(aName);
         Nodes.Add(aName, n);
         return(n);
     }
 }
Esempio n. 3
0
 /// <summary>
 /// Добавляет вершину с уникальным именем.
 /// Исключения:
 ///   Exception Не совпадает текст
 /// </summary>
 /// <param name="aName">уникальное имя</param>
 /// <param name="aText">надпись</param>
 public void ensureExistsNode(string aName, string aText)
 {
     if (Nodes.ContainsKey(aName))
     {
         if (Nodes[aName].Text != aText)
         {
             throw new Exception(string.Format("Не совпадает текст. вершина {0} уже существует, но ее надпись {1}, а не {2}", aName, Nodes[aName].Text, aText));
         }
     }
     else
     {
         tNode n = new tNode(aName);
         n.Text = aText;
         Nodes.Add(aName, n);
     }
 }
Esempio n. 4
0
        private tEdge addEdge(tNode fromNode, tNode toNode)
        {
            if (fromNode == null || toNode == null)
            {
                throw new ArgumentNullException();
            }
            //tEdge exists = FindEdge(fromNode.Name, toNode.Name);
            //if (null == exists)
            //{
            tEdge e = new tEdge(fromNode, toNode);

            Edges.Add(e);
            fromNode.outEdges.Add(e);
            toNode.inEdges.Add(e);
            return(e);
            //}
            //return exists;
        }
Esempio n. 5
0
        public bool isAchieved(string aFromNode, string aToNode)
        {
            tNode targetNode = Nodes[aToNode];

            if (Nodes[aFromNode] == Nodes[aToNode])
            {
                return(false);
            }
            List <tNode> visitCandidates = new List <tNode>();

            // проинициализируем все метки в -1
            foreach (tNode curNode in Nodes.Values)
            {
                curNode.labelWeight = -1;
            }
            visitCandidates.Add(Nodes[aFromNode]);
            Nodes[aFromNode].labelWeight = 0;
            while (visitCandidates.Count > 0)
            {
                tNode curNode   = visitCandidates[0];
                int   nextLabel = curNode.labelWeight + 1;
                foreach (tEdge curEdge in curNode.outEdges)
                {
                    if (curEdge.toNode.labelWeight == -1)
                    {
                        curEdge.toNode.labelWeight = nextLabel;
                        visitCandidates.Add(curEdge.toNode);
                        if (curEdge.toNode == targetNode)
                        {
                            return(true);
                        }
                    }
                    else
                    {
                        if (nextLabel < curEdge.toNode.labelWeight)
                        {
                            curEdge.toNode.labelWeight = nextLabel;
                        }
                    }
                }
                visitCandidates.Remove(curNode);
            }
            return(false);
        }
Esempio n. 6
0
        private void removeNotCycle()
        {
            bool isChanged = true;

            while (isChanged)
            {
                isChanged = false;
                // foreach (tNode curNode in Nodes.Values)
                for (int i = 0; i < Nodes.Count; i++)
                {
                    tNode curNode = Nodes.Values.ElementAt(i);
                    if (curNode.inEdges.Count == 0 || curNode.outEdges.Count == 0)
                    {
                        removeNode(curNode);
                        isChanged = true;
                    }
                }
            }
        }
Esempio n. 7
0
        /// <summary>
        /// Добавляет вершину с заданным текстом, который не обязан быть уникальным.
        /// Этот метод позаботится о создании уникального имени для вершины
        /// </summary>
        /// <param name="aText">надпись</param>
        /// <returns>вершина, гарантированно не null</returns>
        public tNode addNonUniqueNode(string aText)
        {
            int    cnt  = 0;
            string name = aText;

            do
            {
                if (cnt > 0)
                {
                    name = aText + cnt;
                }
                cnt++;
            } while (Nodes.ContainsKey(name));

            tNode n = new tNode(name);

            n.Text = aText;
            Nodes.Add(name, n);
            return(n);
        }
Esempio n. 8
0
        //Отслеживает путь между вершинами.
        //По меткам, оставшимся после isAchieved, двигаясь обратно от ToNode
        public List <string> GetPath(string aFromNode, string aToNode)
        {
            //проверочки
            if (!Nodes.ContainsKey(aToNode))
            {
                throw new Exception("неправильное имя узла " + aToNode);
            }
            if (!Nodes.ContainsKey(aFromNode))
            {
                throw new Exception("неправильное имя узла " + aToNode);
            }
            //будем вставлять в начало этого списка вершины,
            //двигаясь от конца к началу пути, пока не вставим aFromNode
            List <string> lResult = new List <string>();

            lResult.Add(aToNode);
            tNode CurTargetNode = Nodes[aToNode];
            tNode FromNode      = Nodes[aFromNode];

            while (CurTargetNode != FromNode)
            {
                tNode PrevNode  = null;
                int   prevLabel = CurTargetNode.labelWeight - 1;
                foreach (tEdge e in CurTargetNode.inEdges)
                {
                    if (e.fromNode.labelWeight == prevLabel)
                    {
                        PrevNode = e.fromNode;
                        break;
                    }
                }
                if (PrevNode == null)
                {
                    throw new Exception("нету пути до узла " + CurTargetNode.Name);
                }
                lResult.Insert(0, PrevNode.Name);
                CurTargetNode = PrevNode;
            }
            return(lResult);
        }
Esempio n. 9
0
 public tEdge(tNode aFromNode, tNode aToNode)
 {
     fromNode = aFromNode;
     toNode   = aToNode;
 }