public void AddNode(AbstractAdjacentGraphNode <TNode> graphNode)
 {
     if (graphNode == null)
     {
         throw new ArgumentNullException("graphNode");
     }
     if (DoesNodeExist(graphNode.Node))
     {
         throw new DuplicateNodeException(string.Format("The node {0} already exists and cannot be added!",
                                                        graphNode.Node));
     }
     AdjacencyList.Add(graphNode);
 }
        public void AddEdge(AbstractAdjacentGraphNode <TNode> graphNode, AdjacentNodeEdge <TNode> adjacentNodeEdge)
        {
            //Validate Arguments
            if (graphNode == null)
            {
                throw new ArgumentNullException("graphNode");
            }
            if (adjacentNodeEdge == null)
            {
                throw new ArgumentNullException("adjacentNodeEdge");
            }
            if (graphNode.Node.Equals(adjacentNodeEdge.Node))
            {
                throw new ArgumentException(
                          string.Format("The source {0} node and the destinate node cannot be the same", graphNode.Node));
            }

            if (adjacentNodeEdge.Weight <= 0)
            {
                throw new InvalidEdgeWeightException(
                          string.Format("The edge weight {0} is invalid. It must be greater than zero",
                                        adjacentNodeEdge.Weight));
            }

            AdjacentNodeEdge <TNode> existingNodeEdge;

            if (TryGetEdge(graphNode.Node, adjacentNodeEdge.Node, out existingNodeEdge))
            {
                throw new DuplicateEdgeException(
                          string.Format(
                              "An edge with weight {0} from source node {1} to destination node {2} already exists! ",
                              existingNodeEdge.Weight, graphNode.Node, adjacentNodeEdge.Node));
            }

            //Create Nodes and Edge


            AddNodeIfDoesntExist(graphNode.Node).AddEdgeNeighbour(adjacentNodeEdge);
            AddNodeIfDoesntExist(adjacentNodeEdge.Node);
        }