private void AddPrivate(NodeTree nodeTree, MultiLabelMarkQueue nodeNew) { if (nodeNew.T <= nodeTree.nodeMultiLabel.T) { if (nodeTree.left == null) { nodeTree.left = new NodeTree(nodeNew); return; } else { AddPrivate(nodeTree.left, nodeNew); } } else { if (nodeTree.right == null) { nodeTree.right = new NodeTree(nodeNew); return; } else { AddPrivate(nodeTree.right, nodeNew); } } }
public NodeGraphDTO CalculateShortestPath(NodeGraphDTO startNode, NodeGraphDTO endNode) { startNode.MultiLabelMark.Add(new MultiLabelMark(0, 0, null, 0)); MultiLabelMarkQueue currentMark = null; BinaryTree unsettledTree = new BinaryTree(); foreach (Edge edge in startNode.Node.EdgeStartNodeNavigation) { unsettledTree.Add(new MultiLabelMarkQueue(edge.EndNodeNavigation.NodeGraphDTO, edge.DistanceInMeters, startNode, 0)); } while (!unsettledTree.IsEmpty() && endNode.MultiLabelMark.Count < K) { currentMark = GetLowestDistanceNode(unsettledTree); int k = currentMark.W.MultiLabelMark.Count; if (k < K) { k++; currentMark.W.MultiLabelMark.Add(new MultiLabelMark(k, currentMark.T, currentMark.X, currentMark.Xk)); foreach (Edge edge in currentMark.W.Node.EdgeStartNodeNavigation) { if (!PathContainsNode(edge.EndNodeNavigation.NodeGraphDTO, currentMark.W, k)) { unsettledTree.Add(new MultiLabelMarkQueue(edge.EndNodeNavigation.NodeGraphDTO, currentMark.T + edge.DistanceInMeters, currentMark.W, k)); } } } } return(endNode); }
public void Add(MultiLabelMarkQueue node) { if (root == null) { root = new NodeTree(node); } else { AddPrivate(root, node); } }
public NodeTree(MultiLabelMarkQueue nodeMultiLabel) { this.nodeMultiLabel = nodeMultiLabel; }