/****
 *
 * GraphInterface defines constructive methods for building a graph.  The Graph
 * class of Assignment 6 must implement this interface.
 *                                                                          <p>
 * As an example of using these methods, the following sequence of calls
 * constructs the directed graph in Figure 9.1 on page 292 of the textbook:
 *                                                                        <pre>
 *    Graph g = new Graph();
 *
 *    g.addNode("1").
 *      addNode("2").
 *      addNode("3").
 *      addNode("4").
 *      addNode("5").
 *      addNode("6").
 *      addNode("7");
 *
 *    g.addEdge("1", "2", true).
 *      addEdge("1", "3", true).
 *      addEdge("1", "4", true).
 *      addEdge("2", "4", true).
 *      addEdge("2", "5", true).
 *      addEdge("3", "6", true).
 *      addEdge("4", "3", true).
 *      addEdge("4", "6", true).
 *      addEdge("4", "7", true).
 *      addEdge("5", "4", true).
 *      addEdge("5", "7", true).
 *      addEdge("7", "6", true);
 *                                                                       </pre>
 *
 * @author Gene Fisher (gfisher@calpoly.edu)
 * @version 5jun01
 *
 */

public interface GraphInterface {

    /**
     * Add a node of the given value to this.  Do nothing if a node of the
     * given value is already in this.  Return the updated or unchanged value
     * of this.
     */
    public GraphInterface addNode(Comparable value);

    /**
     * Add an unweighted edge between the nodes of the given values in this.
     * Do nothing if the nodes are not in this or if there is an existing edge
     * between the nodes.  If the isDirected input is true, make the edge
     * directed from nodeValue1 to nodeValue2.  If is isDirected is false, add
     * the edge as undirected.  Return the updated or unchanged value of this.
     */
    public GraphInterface addEdge(Comparable nodeValue1, Comparable nodeValue2,
        boolean isDirected);

    /**
     * Add an edge of the given weight between the nodes of the given values in
     * this.  Do nothing if the nodes are not in this or if there is an
     * existing edge between the nodes.  If the isDirected input is true, make
     * the edge directed from nodeValue1 to nodeValue2.  If is isDirected is
     * false, add the edge as undirected.  Return the updated or unchanged
     * value of this.
     */
    public GraphInterface addEdge(Comparable nodeValue1, Comparable nodeValue2,
        int weight, boolean isDirected);

}