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); }
/// <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); } }
/// <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); } }
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; }
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); }
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; } } } }
/// <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); }
//Отслеживает путь между вершинами. //По меткам, оставшимся после 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); }
public tEdge(tNode aFromNode, tNode aToNode) { fromNode = aFromNode; toNode = aToNode; }