Please send questions to st10@humboldt.edu .
//---------------------------------------------------------------
// File: try_graph.cpp 
// Name: Sharon M. Tuttle
// last modified: 4-27-05
//
// Purpose: try the graph template class out a little
// 
//--------------------------------------------------------------

#include <iostream>
#include <string>
#include "graph.h"  
using namespace std;

int main()
{
    // try out constructor
    graph<char> letterGraph;
    graph<string> cityGraph;

    cout << "Playing with graph..." << endl;
    cout << endl;  
    cout << "1=pass, 0=fail: " << endl;
    cout << "---------------------------------------" << endl;

    // tests involving empty graphs

    cout << (letterGraph.get_num_vertices( ) == 0) << endl;
    cout << (cityGraph.get_num_vertices( ) == 0) << endl;

    cout << (letterGraph.get_num_edges( ) == 0) << endl;
    cout << (cityGraph.get_num_edges( ) == 0) << endl;

    cout << endl;
    cout << "letterGraph should be empty: " << endl;
    letterGraph.print_graph( );
  
    cout << endl;
    cout << "cityGraph should be empty: " << endl;
    cityGraph.print_graph( );

    cout << (letterGraph.is_vertex('A') == false) << endl;
    cout << (cityGraph.is_vertex("Arcata") == false) << endl;

    // now adding some vertices...

    letterGraph.add_vertex('G');
    cout << endl;
    cout << (letterGraph.is_vertex('G') == true) << endl;
    cout << (letterGraph.get_num_vertices( ) == 1) << endl;
    cout << (letterGraph.get_num_edges( ) == 0) << endl;
    
    cout << "letterGraph has 1 vertex, G: " << endl;
    letterGraph.print_graph( );

    letterGraph.add_vertex('M');
    cout << endl;
    cout << (letterGraph.is_vertex('M') == true) << endl;
    cout << (letterGraph.is_vertex('F') == false) << endl;
    cout << (letterGraph.get_num_vertices( ) == 2) << endl;
    cout << (letterGraph.get_num_edges( ) == 0) << endl;
    cout << (letterGraph.is_edge('G', 'M') == false) << endl;
    
    cout << "letterGraph has 2 vertices, G and M: " << endl;
    letterGraph.print_graph( );

    // now adding an edge...

    letterGraph.add_edge('G', 'M');
    cout << endl;
    cout << (letterGraph.is_vertex('M') == true) << endl;
    cout << (letterGraph.is_vertex('F') == false) << endl;
    cout << (letterGraph.get_num_vertices( ) == 2) << endl;
    cout << (letterGraph.get_num_edges( ) == 1) << endl;
    cout << (letterGraph.is_edge('G', 'M') == true) << endl;
    cout << (letterGraph.is_edge('M', 'G') == true) << endl;
    
    cout << "letterGraph has 2 vertices, G and M, with edge between: " 
         << endl;
    letterGraph.print_graph( );

    // now adding more vertices and more edges

    letterGraph.add_vertex('H');
    letterGraph.add_vertex('B');
    letterGraph.add_vertex('X');
    letterGraph.add_vertex('S');
    letterGraph.add_edge('B', 'X');
    letterGraph.add_edge('S', 'B');
    letterGraph.add_edge('H', 'B');

    letterGraph.add_edge('B', 'S');
    cout << endl;
    cout << (letterGraph.is_vertex('M') == true) << endl;
    cout << (letterGraph.is_vertex('F') == false) << endl;
    cout << (letterGraph.get_num_vertices( ) == 6) << endl;
    cout << (letterGraph.get_num_edges( ) == 4) << endl;
    cout << (letterGraph.is_edge('G', 'M') == true) << endl;
    cout << (letterGraph.is_edge('M', 'G') == true) << endl;
    cout << (letterGraph.is_edge('X', 'H') == false) << endl;
    
    cout << "letterGraph has 6 vertices (G,M,H,B,X,S), " << endl 
         << "   with 4 edges between: (G,M), (B,X), (S,B), (H,B)" 
         << endl;
    letterGraph.print_graph( );

    // now removing an edge

    letterGraph.remove_edge('B', 'S');
    cout << endl;
    cout << (letterGraph.is_vertex('B') == true) << endl;
    cout << (letterGraph.is_vertex('S') == true) << endl;
    cout << (letterGraph.get_num_vertices( ) == 6) << endl;
    cout << (letterGraph.get_num_edges( ) == 3) << endl;
    cout << (letterGraph.is_edge('B', 'S') == false) << endl;
    cout << (letterGraph.is_edge('S', 'B') == false) << endl;
    cout << (letterGraph.is_edge('X', 'B') == true) << endl;
    
    cout << "letterGraph has 6 vertices (G,M,H,B,X,S), " << endl 
         << "   with 3 edges between: (G,M), (B,X), (H,B) (no (S,B)!)" 
         << endl;
    cout << "letterGraph has 6 vertices, with 3 edges between: " 
         << endl;
    letterGraph.print_graph( ); 

    // now trying out operator =
    
    graph<char> initialGraph;

    initialGraph = letterGraph;

    cout << endl;
    cout << "initialGraph should 'look' like letterGraph: " << endl;
    initialGraph.print_graph( );

    letterGraph.add_vertex('Q');
    letterGraph.add_edge('Q', 'B');

    cout << endl;
    cout << "letterGraph added Q and (Q,B): " << endl;
    letterGraph.print_graph( );

    cout << endl;
    cout << "initialGraph does NOT have Q and (Q,B): " << endl;
    initialGraph.print_graph( );

    // now trying out get_neighbors function

    set<char> b_neighbors, p_neighbors;

    letterGraph.add_vertex('P');
    b_neighbors = letterGraph.get_neighbors('B');
    p_neighbors = letterGraph.get_neighbors('P');

    cout << endl;
    cout << (p_neighbors.get_size( ) == 0) << endl;
    cout << (b_neighbors.get_size( ) == 3) << endl;
    cout << (b_neighbors.contains('H') == true) << endl;
    cout << (b_neighbors.contains('X') == true) << endl;
    cout << (b_neighbors.contains('Q') == true) << endl;
    cout << (b_neighbors.contains('B') == false) << endl;
    cout << (b_neighbors.contains('M') == false) << endl;
    cout << (b_neighbors.contains('S') == false) << endl;

    return EXIT_SUCCESS;
}